Comment changer la couleur d'arrière-plan du tracé?

226

Je fais un nuage de points dans matplotlib et je dois changer l'arrière-plan du tracé réel en noir. Je sais comment changer la couleur du visage de l'intrigue en utilisant:

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

entrez la description de l'image ici

Mon problème est que cela change la couleur de l'espace autour de l'intrigue. Comment changer la couleur d'arrière-plan réelle de l'intrigue?

user1764386
la source
9
Juste pour info, en plus de ce que @Evert a dit, vous pouvez simplement utiliser ax.patch.set_facecolor('black')(où axest l'occurrence des axes). fig.patchest le fond de la figure et ax.patchle fond des axes.
Joe Kington

Réponses:

230

Utilisez la set_facecolor(color)méthode de l' axesobjet que vous avez créée de l'une des manières suivantes:

  • Vous avez créé une figure et des axes ensemble

    fig, ax = plt.subplots(nrows=1, ncols=1)
  • Vous avez créé une figure, puis les axes plus tard

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1) # nrows, ncols, index
    
  • Vous avez utilisé l'API avec état (si vous faites plus que quelques lignes, et surtout si vous avez plusieurs tracés, les méthodes orientées objet ci-dessus vous facilitent la vie car vous pouvez vous référer à des figures spécifiques, tracer sur certains axes et personnaliser Soit)

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

Ensuite, vous pouvez utiliser set_facecolor:

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

exemple de tracé avec fond rose sur les axes

Pour vous rappeler quelles couleurs peuvent être:

matplotlib.colors

Matplotlib reconnaît les formats suivants pour spécifier une couleur:

  • un tuple RGB ou RGBA de valeurs flottantes dans [0, 1](par exemple, (0.1, 0.2, 0.5)ou (0.1, 0.2, 0.5, 0.3));
  • une chaîne RVB ou RVB hexadécimale (par exemple, '#0F0F0F'ou '#0F0F0F0F');
  • une représentation sous forme de chaîne d'une valeur flottante en [0, 1]inclus pour le niveau de gris (par exemple, '0.5');
  • l'un des {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'};
  • un nom de couleur X11 / CSS4;
  • un nom de l' enquête couleur xkcd ; préfixé avec 'xkcd:'(par exemple, 'xkcd:sky blue');
  • l'un d' {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}eux sont les couleurs du tableau de la palette catégorielle «T10» (qui est le cycle de couleur par défaut);
  • une spécification de couleur «CN», c'est-à-dire «C» suivie d'un seul chiffre, qui est un indice dans le cycle de propriété par défaut ( matplotlib.rcParams['axes.prop_cycle']); l'indexation a lieu au moment de la création de l'artiste et prend par défaut le noir si le cycle ne comprend pas de couleur.

Toutes les spécifications de couleur des chaînes, autres que «CN», ne respectent pas la casse.

Nick T
la source
S'il existe un autre moyen courant de générer des axes, faites-le moi savoir.
Nick T
On dirait que cette méthode a disparu à un moment donné au cours des 3 dernières années ... MethodNotFound
Demis
@Demis cette méthode a été ajoutée ces dernières années. Voir la réponse d' ImportanceOfBeingEarnest pour savoir comment le faire dans les anciennes versions.
Nick T
47

Une méthode consiste à définir manuellement la valeur par défaut pour la couleur d'arrière-plan de l'axe dans votre script (voir Personnalisation de matplotlib ):

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

Cela contraste avec la méthode de Nick T qui modifie la couleur d'arrière-plan d'un axesobjet spécifique . La réinitialisation des valeurs par défaut est utile si vous créez plusieurs tracés différents avec des styles similaires et que vous ne souhaitez pas continuer à modifier différents axesobjets.

Remarque: l'équivalent pour

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

de votre question est:

plt.rcParams['figure.facecolor'] = 'black'
BurlyPaulson
la source
41

Quelque chose comme ça? Utilisez le axisbgmot - clé pour 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')

(Certes, pas un nuage de points et pas un fond noir.)

entrez la description de l'image ici


la source
3
J'ai réussi plt.subplot('111', axisbg='black')avant les commandes de traçage sous Windows.
heltonbiker
10
Ils axis_bg axis_bgcoloront été dépréciés dans matplotlib 2.0.0 et supprimés dans matplotlib 2.2.0
RubenLaguna
13

Si vous avez déjà un axesobjet, tout comme dans la réponse de Nick T , vous pouvez également utiliser

 ax.patch.set_facecolor('black')
Mathias711
la source
12

Une suggestion dans d'autres réponses est d'utiliser ax.set_axis_bgcolor("red"). Cependant, cela est obsolète et ne fonctionne pas sur MatPlotLib> = v2.0.

Il y a aussi la suggestion d'utiliser ax.patch.set_facecolor("red")(fonctionne à la fois sur MatPlotLib v1.5 et v2.2). Bien que cela fonctionne bien, une solution encore plus simple pour v2.0 + consiste à utiliser

ax.set_facecolor("red")

ImportanceDeBestErnest
la source
Pour info, ax.set_axis_bgcolor("black")fonctionne sur Python v2.7.14 / MPL v1.5.1, mais ax.set_facecolor()ne fonctionne pas. Quelque part entre MPL v1.5.1 et v2.2.0, la fonction appropriée a été commutée.
Demis
1
@Demis Si vous avez besoin d'une solution qui fonctionne dans toutes les versions, utilisez ax.patch.set_facecolor("red"). L'écrou de matplotlib 2.0 de la manière recommandée est ax.set_facecolor.
ImportanceOfBeingErnest
4

La chose la plus simple est probablement de fournir la couleur lorsque vous créez l'intrigue:

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

ou

fig1, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, facecolor=(1, 1, 1))
Flonks
la source
Cela ne change que la couleur d'arrière-plan de la fenêtre, pas la couleur réelle du tracé
Tom Cupis
1

réponse plus simple:

ax = plt.axes()
ax.set_facecolor('silver')
Leigh
la source