Как удалить фрейм из matplotlib (pyplot.figure vs matplotlib.figure) (frameon=False Проблемно в matplotlib)

Чтобы снять рамку на рисунке, я пишу

frameon=False

прекрасно работает с pyplot.figure, но с matplotlib.Figure удаляет только серый фон, рамка остается. Кроме того, я хочу, чтобы только линии отображались, а все остальное на рисунке было прозрачным.

с pyplot я могу делать то, что хочу, я хочу сделать это с matplotlib по какой-то долгой причине, которую я не хочу упоминать, чтобы расширить мой вопрос.

13 ответов

Решение

Во-первых, если вы используете savefigимейте в виду, что при сохранении он переопределит цвет фона рисунка, если не указано иное (например, fig.savefig('blah.png', transparent=True)).

Однако, чтобы убрать фон осей и фигуры на экране, вам нужно установить оба ax.patch а также fig.patch быть невидимым

Например

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)

(Конечно, вы не можете сказать разницу на белом фоне SO, но все прозрачно...)

Если вы не хотите показывать что-либо, кроме линии, отключите также и ось, используя 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)

В этом случае, тем не менее, вы можете заставить оси принимать полную фигуру. Если вы вручную указываете расположение осей, вы можете указать, чтобы оно заняло всю цифру (альтернативно, вы можете использовать subplots_adjust, но это проще для случая одной оси).

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'), как указал Джо Кингтон, удалит все, кроме намеченной линии.

Для тех, кто хочет удалить только рамку (границу) и сохранить метки, тикеры и т. Д., Это можно сделать, открыв spines объект на оси. Данный объект оси ax, следующее должно удалить границы со всех четырех сторон:

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

И, в случае удаления x а также y галочки с сюжета:

 ax.get_xaxis().set_ticks([])
 ax.get_yaxis().set_ticks([])

Самый простой способ избавиться от уродливого фрейма в новых версиях matplotlib:

from matplotlib.pyplot import plt
plt.box(False)

Основываясь на превосходном ответе @peeol, вы также можете удалить кадр, выполнив

for spine in plt.gca().spines.values():
    spine.set_visible(False)

Чтобы привести пример (весь пример кода можно найти в конце этого поста), скажем, у вас есть гистограмма, как это,

введите описание изображения здесь

Вы можете удалить кадр с помощью команд выше, а затем либо сохранить x- а также ytick метки (участок не показан) или удалите их

plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')

В этом случае можно сразу обозначить столбцы; окончательный сюжет может выглядеть так (код приведен ниже):

введите описание изображения здесь

Вот весь код, необходимый для создания графиков:

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

Как я здесь ответил, вы можете удалить шипы со всех своих графиков с помощью настроек стиля (таблица стилей или 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

Проблема

У меня была аналогичная проблема с топорами. Параметр классаframeon но kwarg это frame_on. axes_api
>>> plt.gca().set(frameon=False)
AttributeError: Unknown property frameon

Решение

frame_on

пример

data = range(100)
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(data)
#ax.set(frameon=False)  # Old
ax.set(frame_on=False)  # New
plt.show()
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')
plt.axis('off')
plt.savefig(file_path, bbox_inches="tight", pad_inches = 0)

plt.savefig имеет эти параметры сам по себе, просто нужно отключить оси перед

Я использую для этого:

from pylab import *
axes(frameon = 0)
...
show()
plt.box(False)
plt.xticks([])
plt.yticks([])
plt.savefig('fig.png')

должен сделать свое дело.

Чтобы убрать рамку диаграммы

for spine in plt.gca().spines.values():
  spine.set_visible(False)

Я надеюсь это сработает

вот еще одно решение:

      img = io.imread(crt_path)

fig = plt.figure()
fig.set_size_inches(img.shape[1]/img.shape[0], 1, forward=False) # normalize the initial size
ax = plt.Axes(fig, [0., 0., 1., 1.]) # remove the edges
ax.set_axis_off() # remove the axis
fig.add_axes(ax)

ax.imshow(img)

plt.savefig(file_name+'.png', dpi=img.shape[0]) # de-normalize to retrieve the original size
for spine in plt.gca().spines.values():
    spine.set_visible(False) #Indentation updated..
Другие вопросы по тегам