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