Как изменить цвет фона сюжета?

226

Я делаю точечный график в Matplotlib и мне нужно изменить фон реального графика на черный. Я знаю, как изменить цвет лица на графике, используя:

fig = plt.figure()
fig.patch.set_facecolor('xkcd:mint green')

введите описание изображения здесь

Моя проблема в том, что это меняет цвет пространства вокруг сюжета. Как изменить реальный цвет фона сюжета?

user1764386
источник
9
Просто FYI, в дополнение к тому, что сказал @Evert, вы можете просто использовать ax.patch.set_facecolor('black')(где axнаходится экземпляр осей). fig.patchфон фигуры и фон ax.patchосей.
Джо Кингтон

Ответы:

230

Используйте set_facecolor(color)метод axesобъекта , который вы создали одним из следующих способов:

  • Вы создали фигуру и ось вместе

    fig, ax = plt.subplots(nrows=1, ncols=1)
  • Вы создали фигуру, а затем ось / оси

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1) # nrows, ncols, index
  • Вы использовали API с сохранением состояния (если вы делаете что-то больше, чем несколько строк, и особенно если у вас есть несколько графиков, описанные выше объектно-ориентированные методы упрощают жизнь, поскольку вы можете ссылаться на конкретные фигуры, строить графики на определенных осях и настраивать либо)

    plt.plot(...)
    ax = plt.gca()

Тогда вы можете использовать set_facecolor:

ax.set_facecolor('xkcd:salmon')
ax.set_facecolor((1.0, 0.47, 0.42))

пример сюжета с розовым фоном по осям

Как освежить, какие цвета могут быть:

matplotlib.colors

Matplotlib распознает следующие форматы для определения цвета:

  • RGB или RGBA кортеж значений с плавающей точкой в [0, 1](например, (0.1, 0.2, 0.5)или (0.1, 0.2, 0.5, 0.3));
  • шестнадцатеричная строка RGB или RGBA (например, '#0F0F0F'или '#0F0F0F0F');
  • строковое представление значения с плавающей запятой [0, 1]включительно для уровня серого (например, '0.5');
  • один из {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'};
  • имя цвета X11 / CSS4;
  • имя из цветового опроса xkcd ; с префиксом 'xkcd:'(например, 'xkcd:sky blue');
  • одним из {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}них являются цвета таблиц из категориальной палитры «T10» (цветовой цикл по умолчанию);
  • спецификация цвета «CN», то есть «C», за которой следует одна цифра, которая является индексом в цикле свойств по умолчанию ( matplotlib.rcParams['axes.prop_cycle']); индексирование происходит во время создания художника и по умолчанию становится черным, если цикл не включает цвет.

Все строковые спецификации цвета, кроме «CN», не чувствительны к регистру.

Ник Т
источник
Если есть какой-то другой распространенный способ генерации осей, дайте мне знать.
Ник Т
Похоже, этот метод исчез в какой-то момент за последние 3 года ... MethodNotFound
Демис
@ Демис этот метод был добавлен в последние годы. См. ImportanceOfBeingEarnest ответ о том, как это сделать в более старых версиях.
Ник Т
47

Один из способов - вручную установить цвет по умолчанию для цвета фона оси в вашем скрипте (см. Настройка matplotlib ):

import matplotlib.pyplot as plt
plt.rcParams['axes.facecolor'] = 'black'

Это в отличие от метода Ника Т, который меняет цвет фона для конкретного axesобъекта. Сброс настроек по умолчанию полезен, если вы создаете несколько разных сюжетов с одинаковыми стилями и не хотите постоянно менять разные axesобъекты.

Примечание: эквивалент для

fig = plt.figure()
fig.patch.set_facecolor('black')

из вашего вопроса:

plt.rcParams['figure.facecolor'] = 'black'
BurlyPaulson
источник
41

Что-то вроде этого? Используйте axisbgключевое слово для subplot:

>>> from matplotlib.figure import Figure
>>> from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
>>> figure = Figure()
>>> canvas = FigureCanvas(figure)
>>> axes = figure.add_subplot(1, 1, 1, axisbg='red')
>>> axes.plot([1,2,3])
[<matplotlib.lines.Line2D object at 0x2827e50>]
>>> canvas.print_figure('red-bg.png')

(Конечно, не точечная диаграмма и не черный фон.)

введите описание изображения здесь


источник
3
Я имел успех plt.subplot('111', axisbg='black')перед тем, как создавать команды, используя Windows.
heltonbiker
10
Они axis_bg axis_bgcolorбыли объявлены устаревшими в matplotlib 2.0.0 и удалены в matplotlib 2.2.0
RubenLaguna
13

Если у вас уже есть axesобъект, как в ответе Ника Т , вы также можете использовать

 ax.patch.set_facecolor('black')
Mathias711
источник
12

Одним из предложений в других ответах является использование ax.set_axis_bgcolor("red"). Это, однако, является устаревшим и не работает на MatPlotLib> = v2.0.

Есть также предложение использовать ax.patch.set_facecolor("red")(работает как на MatPlotLib v1.5, так и на v2.2). Хотя это работает нормально, еще более простое решение для v2.0 + заключается в использовании

ax.set_facecolor("red")

ImportanceOfBeingErnest
источник
К вашему сведению, ax.set_axis_bgcolor("black")работает на Python v2.7.14 / MPL v1.5.1, но ax.set_facecolor()не работает. Где-то между MPL v1.5.1 и v2.2.0 соответствующая функция была переключена.
Демис
1
@Demis Если вам нужно решение, которое работает во всех версиях, используйте ax.patch.set_facecolor("red"). Гайка из матплотлиба 2.0 по рекомендованному способу есть ax.set_facecolor.
Важное значение
4

Самое простое, вероятно, предоставить цвет при создании графика:

fig1 = plt.figure(facecolor=(1, 1, 1))

или

fig1, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, facecolor=(1, 1, 1))
Flonks
источник
Это только меняет цвет фона окна, а не фактический цвет графика
Том Купис
1

более простой ответ:

ax = plt.axes()
ax.set_facecolor('silver')
Leigh
источник