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?


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.


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'


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


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


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")


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))

To zmienia tylko kolor tła okna, a nie rzeczywisty kolor wydruku
— Tom Cupis

1

prostsza odpowiedź:

ax = plt.axes()
ax.set_facecolor('silver')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.