Pour enlever le cadre de la figure, j'écris
frameon=False
fonctionne parfaitement avec pyplot.figure
, mais avec matplotlib.Figure
il supprime uniquement le fond gris, le cadre reste en place. De plus, je veux seulement que les lignes apparaissent et que tout le reste de la figure soit transparent.
avec pyplot, je peux faire ce que je veux, je veux le faire avec matplotlib pour une longue raison que je préfère ne pas mentionner pour prolonger ma question.
Tout d’abord, si vous utilisez savefig
, sachez qu’elle remplacera la couleur de fond de la figure lors de l’enregistrement, sauf indication contraire (par exemple, fig.savefig('blah.png', transparent=True)
).
Toutefois, pour supprimer l'arrière-plan des axes et des figures à l'écran, vous devez définir à la fois ax.patch
et fig.patch
pour qu'ils soient invisibles.
Par exemple.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(range(10))
for item in [fig, ax]:
item.patch.set_visible(False)
with open('test.png', 'w') as outfile:
fig.canvas.print_png(outfile)
(Bien sûr, vous ne pouvez pas faire la différence sur le fond blanc de SO, mais tout est transparent ...)
Si vous ne voulez rien afficher d'autre que la ligne, désactivez également l'axe en utilisant ax.axis('off')
:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(range(10))
fig.patch.set_visible(False)
ax.axis('off')
with open('test.png', 'w') as outfile:
fig.canvas.print_png(outfile)
Dans ce cas, cependant, vous pouvez faire en sorte que les axes prennent toute la figure. Si vous spécifiez manuellement l'emplacement des axes, vous pouvez lui indiquer de prendre la figure complète (vous pouvez également utiliser subplots_adjust
, mais cela est plus simple pour le cas d'un seul axe).
import matplotlib.pyplot as plt
fig = plt.figure(frameon=False)
ax = fig.add_axes([0, 0, 1, 1])
ax.axis('off')
ax.plot(range(10))
with open('test.png', 'w') as outfile:
fig.canvas.print_png(outfile)
ax.axis('off')
, comme l'a souligné Joe Kington, supprime tout sauf la ligne tracée.
Pour ceux qui veulent seulement supprimer le cadre (bordure) et conserver les étiquettes, les tickers, etc., on peut le faire en accédant à l’objet spines
sur l’axe. Étant donné un objet d'axe ax
, les éléments suivants doivent supprimer les bordures des quatre côtés:
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
Et, en cas de suppression de x
et de y
ticks du tracé:
ax.get_xaxis().set_ticks([])
ax.get_yaxis().set_ticks([])
Construire sur excellente réponse de @ peeol , vous pouvez également supprimer le cadre en faisant
for spine in plt.gca().spines.values():
spine.set_visible(False)
Pour donner un exemple (l’échantillon de code complet se trouve à la fin de cet article), disons que vous avez un graphique à barres comme celui-ci,
vous pouvez supprimer le cadre avec les commandes ci-dessus, puis conserver les étiquettes x-
et ytick
(tracé non affiché) ou les supprimer également.
plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')
Dans ce cas, on peut alors étiqueter les barres directement; l'intrigue finale pourrait ressembler à ceci (le code peut être trouvé ci-dessous):
Voici le code complet nécessaire pour générer les parcelles:
import matplotlib.pyplot as plt
import numpy as np
plt.figure()
xvals = list('ABCDE')
yvals = np.array(range(1, 6))
position = np.arange(len(xvals))
mybars = plt.bar(position, yvals, align='center', linewidth=0)
plt.xticks(position, xvals)
plt.title('My great data')
# plt.show()
# get rid of the frame
for spine in plt.gca().spines.values():
spine.set_visible(False)
# plt.show()
# remove all the ticks and directly label each bar with respective value
plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')
# plt.show()
# direct label each bar with Y axis values
for bari in mybars:
height = bari.get_height()
plt.gca().text(bari.get_x() + bari.get_width()/2, bari.get_height()-0.2, str(int(height)),
ha='center', color='white', fontsize=15)
plt.show()
Le moyen le plus simple de se débarrasser du vilain cadre dans les nouvelles versions de matplotlib:
from matplotlib import pyplot as plt
plt.box(False)
J'avais l'habitude de le faire:
from pylab import *
axes(frameon = 0)
...
show()
Comme j'ai répondu ici , vous pouvez supprimer des épines de tous vos graphiques à l'aide de paramètres de style (feuille de style ou rcParams):
import matplotlib as mpl
mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False
df = pd.DataFrame({
'client_scripting_ms' : client_scripting_ms,
'apimlayer' : apimlayer, 'server' : server
}, index = index)
ax = df.plot(kind = 'barh',
stacked = True,
title = "Chart",
width = 0.20,
align='center',
figsize=(7,5))
plt.legend(loc='upper right', frameon=True)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('right')