Wie ändere ich die Hintergrundfarbe des Plots?

226

Ich mache ein Streudiagramm in matplotlib und muss den Hintergrund des tatsächlichen Diagramms in Schwarz ändern. Ich weiß, wie man die Gesichtsfarbe des Diagramms ändert, indem man:

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

Geben Sie hier die Bildbeschreibung ein

Mein Problem ist, dass dies die Farbe des Raums um das Diagramm ändert. Wie ändere ich die tatsächliche Hintergrundfarbe des Plots?

user1764386
quelle
9
Nur zu Ihrer Information, zusätzlich zu dem, was @Evert gesagt hat, können Sie einfach verwenden ax.patch.set_facecolor('black')(wo axist die Achseninstanz ). fig.patchist der Figurenhintergrund und ax.patchist der Achsenhintergrund.
Joe Kington

Antworten:

230

Verwenden Sie die set_facecolor(color)Methode des axesObjekts , die Sie auf eine der folgenden Arten erstellt haben:

  • Sie haben zusammen eine Figur und eine Achse erstellt

    fig, ax = plt.subplots(nrows=1, ncols=1)
  • Sie haben eine Figur erstellt und später die Achse (n)

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1) # nrows, ncols, index
    
  • Sie haben die Stateful-API verwendet (wenn Sie mehr als ein paar Zeilen ausführen und insbesondere wenn Sie mehrere Diagramme haben, erleichtern die oben genannten objektorientierten Methoden das Leben, da Sie auf bestimmte Abbildungen verweisen, auf bestimmten Achsen zeichnen und anpassen können entweder)

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

Dann können Sie verwenden set_facecolor:

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

Beispielplot mit rosa Hintergrund auf den Achsen

Als Auffrischung dafür, welche Farben sein können:

matplotlib.colors

Matplotlib erkennt die folgenden Formate, um eine Farbe anzugeben:

  • ein RGB- oder RGBA-Tupel von Float-Werten in [0, 1](z. B. (0.1, 0.2, 0.5)oder (0.1, 0.2, 0.5, 0.3));
  • eine hexadezimale RGB- oder RGBA-Zeichenfolge (z. B. '#0F0F0F'oder '#0F0F0F0F');
  • eine Zeichenfolgendarstellung eines Gleitkommawertes [0, 1]inklusive für Graustufen (z. B. '0.5');
  • einer von {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'};
  • ein X11 / CSS4-Farbname;
  • ein Name aus der xkcd-Farbumfrage ; mit dem Präfix 'xkcd:'(zB 'xkcd:sky blue');
  • Eine {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}davon sind die Tableau-Farben aus der kategorialen Palette 'T10' (dies ist der Standardfarbzyklus).
  • eine "CN" -Farbspezifikation, dh "C", gefolgt von einer einzelnen Ziffer, die ein Index für den Standardeigenschaftszyklus ( matplotlib.rcParams['axes.prop_cycle']) ist; Die Indizierung erfolgt zum Zeitpunkt der Künstlererstellung und ist standardmäßig schwarz, wenn der Zyklus keine Farbe enthält.

Bei allen Farbspezifikationen mit Ausnahme von „CN“ wird die Groß- und Kleinschreibung nicht berücksichtigt.

Nick T.
quelle
Wenn es eine andere übliche Methode zum Generieren von Achsen gibt, lassen Sie es mich wissen.
Nick T
Sieht so aus, als wäre diese Methode in den letzten 3 Jahren irgendwann verschwunden ... MethodNotFound
Demis
@ Demis Diese Methode wurde in den letzten Jahren hinzugefügt. Siehe ImportanceOfBeingEarnest Antwort , wie es in älteren Versionen zu tun.
Nick T
47

Eine Methode besteht darin, die Standardeinstellung für die Achsenhintergrundfarbe in Ihrem Skript manuell festzulegen (siehe Anpassen von matplotlib ):

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

Dies steht im Gegensatz zu der Methode von Nick T, mit der die Hintergrundfarbe für ein bestimmtes axesObjekt geändert wird. Das Zurücksetzen der Standardeinstellungen ist nützlich, wenn Sie mehrere verschiedene Diagramme mit ähnlichen Stilen erstellen und nicht ständig verschiedene axesObjekte ändern möchten .

Hinweis: Das Äquivalent für

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

Aus Ihrer Frage geht hervor:

plt.rcParams['figure.facecolor'] = 'black'
BurlyPaulson
quelle
Das ist hilfreich! fyi Ich habe gerade darum gebeten, das Matplotlib.rcParams-Wörterbuch ordnungsgemäß auf die ursprünglichen
Standardeinstellungen zurückzusetzen
41

Etwas wie das? Verwenden Sie das axisbgSchlüsselwort, um 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')

(Zugegeben, kein Streudiagramm und kein schwarzer Hintergrund.)

Geben Sie hier die Bildbeschreibung ein


quelle
3
Ich hatte Erfolg mit plt.subplot('111', axisbg='black')den Plotbefehlen unter Windows.
Heltonbiker
10
Die axis_bg axis_bgcolorwurden in Matplotlib 2.0.0 veraltet und in Matplotlib 2.2.0
RubenLaguna
13

Wenn Sie bereits ein axesObjekt haben, wie in der Antwort von Nick T , können Sie es auch verwenden

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

Ein Vorschlag in anderen Antworten ist zu verwenden ax.set_axis_bgcolor("red"). Dies ist jedoch veraltet und funktioniert unter MatPlotLib> = v2.0 nicht.

Es gibt auch den Vorschlag zu verwenden ax.patch.set_facecolor("red")(funktioniert sowohl auf MatPlotLib v1.5 als auch auf v2.2). Während dies gut funktioniert, ist die Verwendung einer noch einfacheren Lösung für v2.0 +

ax.set_facecolor("red")

Wichtigkeit von BeEnest
quelle
Zu ax.set_axis_bgcolor("black")Ihrer Information , funktioniert unter Python v2.7.14 / MPL v1.5.1, aber ax.set_facecolor()nicht. Irgendwo zwischen MPL v1.5.1 und v2.2.0 wurde die richtige Funktion umgeschaltet.
Demis
1
@ Demis Wenn Sie eine Lösung benötigen, die in allen Versionen funktioniert, verwenden Sie ax.patch.set_facecolor("red"). Nuss von Matplotlib 2.0 auf dem empfohlenen Weg ist ax.set_facecolor.
Wichtigkeit von
4

Am einfachsten ist es wahrscheinlich, die Farbe beim Erstellen des Diagramms anzugeben:

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

oder

fig1, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, facecolor=(1, 1, 1))
Flonks
quelle
Dies ändert nur die Hintergrundfarbe des Fensters, nicht die tatsächliche Plotfarbe
Tom Cupis
1

einfachere Antwort:

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