Come cambiare il colore di sfondo della trama?


226

Sto realizzando un grafico a dispersione in matplotlib e devo cambiare lo sfondo del grafico reale in nero. So come cambiare il colore del viso della trama usando:

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

inserisci qui la descrizione dell'immagine

Il mio problema è che questo cambia il colore dello spazio attorno alla trama. Come posso cambiare il colore di sfondo reale della trama?


9
Cordiali saluti, oltre a quanto detto da @Evert, potresti semplicemente usare ax.patch.set_facecolor('black')(dov'è axl'istanza degli assi). fig.patchè lo sfondo della figura ed ax.patchè lo sfondo degli assi.
Joe Kington,

Risposte:


230

Utilizzare il set_facecolor(color)metodo axesdell'oggetto , che è stato creato in uno dei seguenti modi:

  • Hai creato una figura e un asse / i insieme

    fig, ax = plt.subplots(nrows=1, ncols=1)
  • Hai creato una figura, quindi gli assi in seguito

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1) # nrows, ncols, index
    
  • Hai usato l'API stateful (se stai facendo qualcosa di più di poche righe, e specialmente se hai più grafici, i metodi orientati agli oggetti sopra rendono la vita più facile perché puoi fare riferimento a figure specifiche, tracciare su determinati assi e personalizzare o)

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

Quindi puoi usare set_facecolor:

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

trama di esempio con sfondo rosa sugli assi

Come aggiornamento per quali colori possono essere:

matplotlib.colors

Matplotlib riconosce i seguenti formati per specificare un colore:

  • una tupla RGB o RGBA di valori float in [0, 1](ad esempio, (0.1, 0.2, 0.5)o (0.1, 0.2, 0.5, 0.3));
  • una stringa esadecimale RGB o RGBA (ad es. '#0F0F0F'oppure '#0F0F0F0F');
  • una rappresentazione in forma di stringa di un valore float [0, 1]compreso per il livello di grigio (ad es. '0.5');
  • uno di {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'};
  • un nome di colore X11 / CSS4;
  • un nome dal sondaggio colore xkcd ; con il prefisso 'xkcd:'(ad esempio, 'xkcd:sky blue');
  • uno dei {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}quali sono i colori del tableau dalla tavolozza categoriale "T10" (che è il ciclo di colori predefinito);
  • una specifica di colore "CN", ovvero "C" seguita da una singola cifra, che è un indice nel ciclo di proprietà predefinito ( matplotlib.rcParams['axes.prop_cycle']); l'indicizzazione si verifica al momento della creazione dell'artista e per impostazione predefinita diventa nero se il ciclo non include il colore.

Tutte le specifiche delle stringhe di colore, tranne "CN", non fanno distinzione tra maiuscole e minuscole.


Se esiste un altro modo comune per generare assi, fammi sapere.
Nick T

Sembra che questo metodo sia scomparso ad un certo punto negli ultimi 3 anni ... MethodNotFound
Demis

@Demis questo metodo è stato aggiunto negli ultimi anni. Vedi la risposta di ImportanceOfBeingEarnest per come farlo nelle versioni precedenti.
Nick T

47

Un metodo consiste nell'impostare manualmente il valore predefinito per il colore di sfondo dell'asse all'interno dello script (vedere Personalizzazione di matplotlib ):

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

Ciò è in contrasto con il metodo di Nick T che modifica il colore di sfondo per un axesoggetto specifico . Il ripristino delle impostazioni predefinite è utile se si stanno realizzando più grafici diversi con stili simili e non si desidera continuare a modificare axesoggetti diversi .

Nota: l'equivalente di

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

dalla tua domanda è:

plt.rcParams['figure.facecolor'] = 'black'


41

Qualcosa come questo? Usa la axisbgparola chiave per 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')

(Concesso, non un diagramma a dispersione e non uno sfondo nero.)

inserisci qui la descrizione dell'immagine


3
Ho avuto successo con plt.subplot('111', axisbg='black')prima dei comandi di stampa, usando Windows.
Heltonbiker,

10
Sono axis_bg axis_bgcolorstati deprecati in matplotlib 2.0.0 e rimossi in matplotlib 2.2.0
RubenLaguna


12

Un suggerimento in altre risposte è l'uso ax.set_axis_bgcolor("red"). Questo tuttavia è obsoleto e non funziona su MatPlotLib> = v2.0.

C'è anche il suggerimento da usare ax.patch.set_facecolor("red")(funziona su MatPlotLib v1.5 e v2.2). Mentre questo funziona bene, una soluzione ancora più semplice per v2.0 + è da usare

ax.set_facecolor("red")


Cordiali saluti, ax.set_axis_bgcolor("black")funziona su Python v2.7.14 / MPL v1.5.1, ma ax.set_facecolor()non lo fa. Da qualche parte tra MPL v1.5.1 e v2.2.0 è stata attivata la funzione corretta.
Demis,

1
@Demis Se hai bisogno di una soluzione che funzioni in tutte le versioni, usa ax.patch.set_facecolor("red"). Il dado di matplotlib 2.0 nel modo raccomandato è ax.set_facecolor.
ImportanceOfBeingErnest

4

La cosa più semplice è probabilmente quella di fornire il colore quando crei la trama:

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

o

fig1, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, facecolor=(1, 1, 1))

Questo cambia solo il colore di sfondo della finestra, non il colore della trama reale
Tom Cupis il

1

risposta più semplice:

ax = plt.axes()
ax.set_facecolor('silver')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.