web-dev-qa-db-fra.com

Comment supprimer frame de matplotlib (pyplot.figure vs matplotlib.figure) (frameon = False Problematic dans matplotlib)

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.

117
Emmet B

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)

enter image description here

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

enter image description here

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)

enter image description here

138
Joe Kington

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([])
179
peeol

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,

enter image description here

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

enter image description here

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()
45
Cleb

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

J'avais l'habitude de le faire:

from pylab import *
axes(frameon = 0)
...
show()
5
alinsoar

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
0
hadrienj

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')
0
Taha Kaiyum