Matplotlib figure facecolor (couleur d'arrière-plan)

91

Quelqu'un peut-il expliquer pourquoi le code ci-dessous ne fonctionne pas lors du réglage de la couleur de la figure?

import matplotlib.pyplot as plt

# create figure instance
fig1 = plt.figure(1)
fig1.set_figheight(11)
fig1.set_figwidth(8.5)

rect = fig1.patch
rect.set_facecolor('red') # works with plt.show().  
                          # Does not work with plt.savefig("trial_fig.png")

ax = fig1.add_subplot(1,1,1)

x = 1, 2, 3
y = 1, 4, 9
ax.plot(x, y)

# plt.show()  # Will show red face color set above using rect.set_facecolor('red')

plt.savefig("trial_fig.png") # The saved trial_fig.png DOES NOT have the red facecolor.

# plt.savefig("trial_fig.png", facecolor='red') # Here the facecolor is red.

Lorsque je spécifie la hauteur et la largeur de la figure, fig1.set_figheight(11) fig1.set_figwidth(8.5)celles-ci sont prises en compte par la commande plt.savefig("trial_fig.png"). Cependant, le paramètre de couleur faciale n'est pas sélectionné. Pourquoi?

Merci de votre aide.

Curieux2learn
la source

Réponses:

130

C'est parce que savefigremplace la couleur du visage pour l'arrière-plan de la figure.

(C'est délibéré, en fait ... L'hypothèse est que vous voudriez probablement contrôler la couleur d'arrière-plan de la figure enregistrée avec le facecolorkwarg to savefig. C'est une valeur par défaut déroutante et incohérente, cependant!)

La solution de contournement la plus simple consiste simplement à faire fig.savefig('whatever.png', facecolor=fig.get_facecolor(), edgecolor='none')(je spécifie la couleur de bordure ici car la couleur de bordure par défaut pour la figure réelle est blanche, ce qui vous donnera une bordure blanche autour de la figure enregistrée)

J'espère que ça t'as aidé!

Joe Kington
la source
30

J'ai dû utiliser le mot-clé transparent pour obtenir la couleur que j'ai choisie avec mon initiale

fig=figure(facecolor='black')

comme ça:

savefig('figname.png', facecolor=fig.get_facecolor(), transparent=True)
Labibah
la source
4
Pourquoi utilisez-vous transparent=Truesi vous fournissez un facecolor?
Alexis.Rolland le
27

savefiga son propre paramètre pour facecolor. Je pense qu'un moyen encore plus simple que la réponse acceptée est de les définir globalement une seule fois , au lieu de mettre à facecolor=fig.get_facecolor()chaque fois:

plt.rcParams['axes.facecolor']='red'
plt.rcParams['savefig.facecolor']='red'
tozCSS
la source
0

Si vous souhaitez changer la couleur d'arrière-plan, essayez ceci:

plt.rcParams['figure.facecolor'] = 'white'
song.xiao
la source