Как удалить фрейм из matplotlib (pyplot.figure vs matplotlib.figure) (frameon = False Проблема в matplotlib)
Чтобы удалить рамку на рисунке, я пишу
frameon=False
отлично работает с pyplot.figure
, но с matplotlib.Figure
он удаляет только серый фон, рамка остается. Кроме того, я хочу, чтобы строки отображались, и все остальные фигуры были прозрачными.
с pyplot я могу делать то, что хочу, я хочу сделать это с matplotlib по какой-то давней причине, я бы не сказал, чтобы расширить мой вопрос.
Ответы
Ответ 1
Прежде всего, если вы используете 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)
![enter image description here]()
(Конечно, вы не можете сказать разницу на 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)
![enter image description here]()
В этом случае, однако, вы можете захотеть, чтобы оси заняли полную цифру. Если вы вручную укажете расположение осей, вы можете сказать, что он занимает полную фигуру (поочередно, вы можете использовать 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)
![enter image description here]()
Ответ 2
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([])
Ответ 3
Основываясь на @peeol превосходном ответе, вы также можете удалить кадр, выполнив
for spine in plt.gca().spines.values():
spine.set_visible(False)
Чтобы привести пример (весь пример кода можно найти в конце этого поста), скажем, у вас есть гистограмма, подобная этой,
![enter image description here]()
Вы можете удалить кадр с помощью команд, приведенных выше, а затем либо оставить метки x-
и ytick
(график не показан), либо удалить их, выполнив
plt.tick_params(top='off', bottom='off', left='off', right='off', labelleft='off', labelbottom='on')
В этом случае можно сразу пометить столбцы; окончательный сюжет может выглядеть так (код приведен ниже):
![enter image description here]()
Вот весь код, необходимый для создания графиков:
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()
Ответ 4
Самый простой способ избавиться от уродливого фрейма в новых версиях matplotlib:
import matplotlib.pyplot as plt
plt.box(False)
Если вы действительно всегда должны использовать объектно-ориентированный подход, выполните: ax.set_frame_on(False)
.
Ответ 5
Я использую это:
from pylab import *
axes(frameon = 0)
...
show()
Ответ 6
Проблема
У меня была похожая проблема с использованием осей. Параметр класса - 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()
Ответ 7
for spine in plt.gca().spines.values():
spine.set_visible(False) #Indentation updated..
Ответ 8
Как я уже ответил здесь, вы можете удалить шипы со всех своих графиков с помощью настроек стиля (таблицы стилей или 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
Ответ 9
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')