Как удалить фрейм из 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..