Jak zmienić kolor tła wydruku?

226

Tworzę wykres rozproszenia w Matplotlib i muszę zmienić tło rzeczywistego wykresu na czarny. Wiem, jak zmienić kolor twarzy fabuły za pomocą:

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

wprowadź opis zdjęcia tutaj

Moim problemem jest to, że zmienia to kolor przestrzeni wokół fabuły. Jak zmienić rzeczywisty kolor tła wykresu?

użytkownik1764386
źródło
9
Po prostu FYI, oprócz tego, co powiedział @Evert, możesz po prostu użyć ax.patch.set_facecolor('black')(gdzie axjest instancja osi). fig.patchjest tłem figury i ax.patchtłem osi.
Joe Kington,

Odpowiedzi:

230

Użyj set_facecolor(color)metody axesobiektu , którą utworzyłeś na jeden z następujących sposobów:

  • Utworzyłeś razem figurę i oś / es

    fig, ax = plt.subplots(nrows=1, ncols=1)
  • Utworzyłeś figurę, a następnie oś / os później

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1) # nrows, ncols, index
    
  • Użyłeś stanowego interfejsu API (jeśli robisz coś więcej niż kilka wierszy, a zwłaszcza jeśli masz wiele wykresów, powyższe metody obiektowe ułatwiają życie, ponieważ możesz odwoływać się do konkretnych liczb, rysować na określonych osiach i dostosowywać zarówno)

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

Następnie możesz użyć set_facecolor:

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

przykładowa fabuła z różowym tłem na osiach

Aby odświeżyć, jakie kolory mogą być:

matplotlib.colours

Matplotlib rozpoznaje następujące formaty w celu określenia koloru:

  • krotka RGB lub RGBA wartości pływających w [0, 1](np. (0.1, 0.2, 0.5)lub (0.1, 0.2, 0.5, 0.3));
  • szesnastkowy ciąg RGB lub RGBA (np. '#0F0F0F'lub '#0F0F0F0F');
  • ciąg reprezentujący wartość zmiennoprzecinkową [0, 1]włącznie dla poziomu szarości (np. '0.5');
  • jeden z {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'};
  • nazwa koloru X11 / CSS4;
  • nazwa z badania kolorów xkcd ; z prefiksem 'xkcd:'(np. 'xkcd:sky blue');
  • jednym z {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}nich są kolory Tableau z kategorycznej palety „T10” (która jest domyślnym cyklem kolorów);
  • specyfikacja koloru „CN”, tj. „C”, po której następuje pojedyncza cyfra, która jest indeksem domyślnego cyklu właściwości ( matplotlib.rcParams['axes.prop_cycle']); indeksowanie następuje w czasie tworzenia artysty i domyślnie jest czarne, jeśli cykl nie obejmuje koloru.

Wszystkie specyfikacje kolorów dla łańcucha, oprócz „CN”, nie uwzględniają wielkości liter.

Nick T.
źródło
Jeśli istnieje jakiś inny typowy sposób generowania osi, daj mi znać.
Nick T
Wygląda na to, że ta metoda zniknęła w pewnym momencie w ciągu ostatnich 3 lat ... MethodNotFound
Demis
@Demis ta metoda została dodana w ostatnich latach. Zobacz odpowiedź ImportanceOfBeingEarnest, aby dowiedzieć się, jak to zrobić w starszych wersjach.
Nick T
47

Jedną z metod jest ręczne ustawienie domyślnego koloru tła osi w skrypcie (patrz Dostosowywanie matplotlib ):

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

Jest to sprzeczne z metodą Nicka T, która zmienia kolor tła dla określonego axesobiektu. Resetowanie ustawień domyślnych jest przydatne, jeśli tworzysz wiele różnych wykresów o podobnych stylach i nie chcesz ciągle zmieniać różnych axesobiektów.

Uwaga: Odpowiednik dla

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

z twojego pytania jest:

plt.rcParams['figure.facecolor'] = 'black'
BurlyPaulson
źródło
41

Coś takiego? Użyj axisbgsłowa kluczowego, aby 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')

(Oczywiście, nie jest to rozproszony wykres, a nie czarne tło).

wprowadź opis zdjęcia tutaj


źródło
3
Miałem sukces plt.subplot('111', axisbg='black')przed komendami drukowania, używając Windows.
heltonbiker
10
axis_bg axis_bgcolorByły przestarzałe w matplotlib 2.0.0 i usunięto matplotlib 2.2.0
RubenLaguna
13

Jeśli masz już axesprzedmiot, podobnie jak w Nick T odpowiedź „s , można również użyć

 ax.patch.set_facecolor('black')
Mathias711
źródło
12

Jedną z sugestii w innych odpowiedziach jest użycie ax.set_axis_bgcolor("red"). Jest to jednak przestarzałe i nie działa na MatPlotLib> = v2.0.

Istnieje również sugestia użycia ax.patch.set_facecolor("red")(działa zarówno na MatPlotLib v1.5, jak i v2.2). Chociaż działa to dobrze, jeszcze łatwiejsze jest użycie v2.0 +

ax.set_facecolor("red")

WażnośćOfBeingErnest
źródło
FYI, ax.set_axis_bgcolor("black")działa na Python v2.7.14 / MPL v1.5.1, ale ax.set_facecolor()nie działa. Gdzieś pomiędzy MPL v1.5.1 a v2.2.0 została przełączona odpowiednia funkcja.
Demis
1
@Demis Jeśli potrzebujesz rozwiązania, które działa we wszystkich wersjach, użyj ax.patch.set_facecolor("red"). Zalecana nakrętka z Matplotlib 2.0 to ax.set_facecolor.
ImportanceOfBeingErnest
4

Najłatwiej jest prawdopodobnie podać kolor podczas tworzenia wykresu:

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

lub

fig1, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, facecolor=(1, 1, 1))
Flonks
źródło
To zmienia tylko kolor tła okna, a nie rzeczywisty kolor wydruku
Tom Cupis
1

prostsza odpowiedź:

ax = plt.axes()
ax.set_facecolor('silver')
Leigh
źródło