Hoe verander ik de achtergrondkleur van een plot?

Ik maak een spreidingsplot in matplotlib en moet de achtergrond van de eigenlijke plot in zwart veranderen. Ik weet hoe ik de gezichtskleur van de plot kan veranderen met:

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

Mijn probleem is dat hierdoor de kleur van de ruimte rond de plot verandert. Hoe verander ik de werkelijke achtergrondkleur van de plot?


Antwoord 1, autoriteit 100%

Gebruik de set_facecolor(color)methode van het axesobject, dat je op een van de volgende manieren hebt gemaakt:

  • Je hebt een figuur en assen samen gemaakt

    fig, ax = plt.subplots(nrows=1, ncols=1)
    
  • Je hebt een figuur gemaakt en daarna as(sen)

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1) # nrows, ncols, index
    
  • Je hebt de stateful API gebruikt (als je meer dan een paar regels doet, en vooralals je meerdere plots hebt, maken de objectgeoriënteerde methoden hierboven het leven gemakkelijker omdat je kan verwijzen naar specifieke figuren, plotten op bepaalde assen en beide aanpassen)

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

Dan kun je set_facecolorgebruiken:

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

Als opfriscursus voor wat kleuren kunnen zijn:

matplotlib.colors

Matplotlib herkent de volgende formaten om een kleur op te geven:

  • een RGB- of RGBA-tupel met zwevende waarden in [0, 1](bijv. (0.1, 0.2, 0.5)of (0.1, 0.2, 0.5, 0.3));
  • een hex RGB- of RGBA-tekenreeks (bijv. '#0F0F0F'of '#0F0F0F0F');
  • een tekenreeksrepresentatie van een float-waarde in [0, 1]inclusief voor grijsniveau (bijv. '0.5');
  • een van {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'};
  • een X11/CSS4-kleurnaam;
  • een naam uit het xkcd kleurenonderzoek; voorafgegaan door 'xkcd:'(bijv. 'xkcd:sky blue');
  • een van {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}dit zijn de Tableau-kleuren uit het categorische palet ‘T10’ (wat de standaardkleurencyclus is);
  • een “CN” kleurspecificatie, d.w.z. ‘C’ gevolgd door een enkel cijfer, wat een index is in de standaard eigenschappencyclus (matplotlib.rcParams['axes.prop_cycle']); de indexering vindt plaats op het moment dat de artiest wordt gemaakt en wordt standaard zwart als de cyclus geen kleur bevat.

Alle tekenreeksspecificaties van kleur, behalve “CN”, zijn niet hoofdlettergevoelig.


Antwoord 2, autoriteit 22%

Eén methode is om handmatig de standaard voor de as-achtergrondkleur in uw script in te stellen (zie Matplotlib aanpassen):

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

Dit is in tegenstelling tot de methode van Nick T die de achtergrondkleur voor een specifiek axes-object verandert. Het resetten van de standaardwaarden is handig als u meerdere verschillende plots maakt met vergelijkbare stijlen en u niet steeds verschillende axes-objecten wilt wijzigen.

Opmerking: het equivalent voor

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

van uw vraag is:

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

Antwoord 3, autoriteit 14%

Zoiets? Gebruik het trefwoord axisbgom te 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')

(Toegegeven, geen spreidingsplot en geen zwarte achtergrond.)


Antwoord 4, autoriteit 7%

Als je al een axes-object hebt, zoals in Nick T‘ s antwoord, u kunt ook gebruik maken van

ax.patch.set_facecolor('black')

Antwoord 5, autoriteit 6%

eenvoudiger antwoord:

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

Antwoord 6, autoriteit 6%

Een suggestie in andere antwoorden is om ax.set_axis_bgcolor("red")te gebruiken. Dit is echter verouderd en werkt niet op MatPlotLib >= v2.0.

Er is ook de suggestie om ax.patch.set_facecolor("red")te gebruiken (werkt op zowel MatPlotLib v1.5 als v2.2). Hoewel dit prima werkt, is een nog eenvoudigere oplossing voor v2.0+ het gebruik van

ax.set_facecolor("red")


Antwoord 7, autoriteit 4%

Het gemakkelijkste is waarschijnlijk om de kleur te geven wanneer u de plot maakt:

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

of

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

Antwoord 8

Naast het antwoord van NickT, kun je ook het achtergrondframe verwijderen door het in te stellen op “none”, zoals hier wordt uitgelegd: https ://stackoverflow.com/a/67126649/8669161

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

Other episodes