¿Cómo cambiar el color de fondo de la trama?

226

Estoy haciendo un diagrama de dispersión en matplotlib y necesito cambiar el fondo del diagrama real a negro. Sé cómo cambiar el color de la cara de la trama usando:

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

ingrese la descripción de la imagen aquí

Mi problema es que esto cambia el color del espacio alrededor de la trama. ¿Cómo cambio el color de fondo real de la trama?

usuario1764386
fuente
99
Solo para su información, además de lo que dijo @Evert, podría usar ax.patch.set_facecolor('black')(¿dónde axestá la instancia de ejes?). fig.patches el fondo de la figura y ax.patches el fondo de los ejes.
Joe Kington

Respuestas:

230

Use el set_facecolor(color)método del axesobjeto , que ha creado de una de las siguientes maneras:

  • Creaste una figura y ejes / es juntos

    fig, ax = plt.subplots(nrows=1, ncols=1)
  • Creaste una figura, luego eje / es después

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1) # nrows, ncols, index
  • Usó la API con estado (si está haciendo algo más que unas pocas líneas, y especialmente si tiene varias parcelas, los métodos orientados a objetos anteriores facilitan la vida porque puede referirse a figuras específicas, trazar en ciertos ejes y personalizar ya sea)

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

Entonces puedes usar set_facecolor:

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

parcela de ejemplo con fondo rosa en los ejes

Como recordatorio de qué colores pueden ser:

matplotlib.colors

Matplotlib reconoce los siguientes formatos para especificar un color:

  • una tupla RGB o RGBA de valores flotantes en [0, 1](por ejemplo, (0.1, 0.2, 0.5)o (0.1, 0.2, 0.5, 0.3));
  • una cadena RGB o RGBA hexadecimal (por ejemplo, '#0F0F0F'o '#0F0F0F0F');
  • una representación de cadena de un valor flotante en [0, 1]inclusive para el nivel de gris (por ejemplo, '0.5');
  • uno de {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'};
  • un nombre de color X11 / CSS4;
  • un nombre de la encuesta de color xkcd ; con el prefijo 'xkcd:'(por ejemplo, 'xkcd:sky blue');
  • uno de los {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}cuales son los colores de Tableau de la paleta categórica 'T10' (que es el ciclo de color predeterminado);
  • una especificación de color "CN", es decir, 'C' seguida de un solo dígito, que es un índice del ciclo de propiedad predeterminado ( matplotlib.rcParams['axes.prop_cycle']); la indexación se produce en el momento de la creación del artista y su valor predeterminado es negro si el ciclo no incluye el color.

Todas las especificaciones de cadena de color, que no sean "CN", no distinguen entre mayúsculas y minúsculas.

Nick T
fuente
Si hay alguna otra forma común de generar ejes, avíseme.
Nick T
Parece que este método desapareció en algún momento durante los últimos 3 años ... MethodNotFound
Demis
@Demis este método se agregó en los últimos años. Vea la respuesta de ImportanceOfBeingEarnest para saber cómo hacerlo en versiones anteriores.
Nick T
47

Un método es establecer manualmente el valor predeterminado para el color de fondo del eje dentro de su script (consulte Personalizar matplotlib ):

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

Esto contrasta con el método de Nick T que cambia el color de fondo de un axesobjeto específico . Restablecer los valores predeterminados es útil si está haciendo múltiples trazados diferentes con estilos similares y no desea seguir cambiando diferentes axesobjetos.

Nota: el equivalente para

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

de tu pregunta es:

plt.rcParams['figure.facecolor'] = 'black'
BurlyPaulson
fuente
41

¿Algo como esto? Use la axisbgpalabra clave para 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')

(De acuerdo, no es un diagrama de dispersión, y no un fondo negro).

ingrese la descripción de la imagen aquí


fuente
3
Tuve éxito plt.subplot('111', axisbg='black')antes de los comandos de trazado, usando Windows.
heltonbiker
10
Se axis_bg axis_bgcolordejaron de usar en matplotlib 2.0.0 y se eliminaron en matplotlib 2.2.0
RubenLaguna el
13

Si ya tiene un axesobjeto, al igual que en la respuesta de Nick T , también puede usar

 ax.patch.set_facecolor('black')
Mathias711
fuente
12

Una sugerencia en otras respuestas es usar ax.set_axis_bgcolor("red"). Sin embargo, esto está en desuso y no funciona en MatPlotLib> = v2.0.

También existe la sugerencia de usar ax.patch.set_facecolor("red")(funciona tanto en MatPlotLib v1.5 como en v2.2). Si bien esto funciona bien, una solución aún más fácil para v2.0 + es usar

ax.set_facecolor("red")

Importancia de ser ernesto
fuente
FYI, ax.set_axis_bgcolor("black")funciona en Python v2.7.14 / MPL v1.5.1, pero ax.set_facecolor()no lo hace. En algún lugar entre MPL v1.5.1 y v2.2.0, se cambió la función adecuada.
Demis
1
@Demis Si necesita una solución que funcione en todas las versiones, use ax.patch.set_facecolor("red"). Tuerca de matplotlib 2.0 en la forma recomendada es ax.set_facecolor.
ImportanceOfBeingErnest
4

Probablemente, lo más fácil es proporcionar el color cuando crea la trama:

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

o

fig1, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, facecolor=(1, 1, 1))
Flonks
fuente
Esto solo cambia el color de fondo de la ventana, no el color de la trama real
Tom Cupis
1

respuesta más simple:

ax = plt.axes()
ax.set_facecolor('silver')
Leigh
fuente