Як видалити кадр з matplotlib (pyplot.figure vs matplotlib.figure) (frameon = помилкові проблеми в matplotlib)


160

Щоб зняти кадр по фігурі, я пишу

frameon=False

працює ідеально з pyplot.figure, але зmatplotlib.Figure нього видаляється лише сірий фон, рамка залишається. Також я хочу лише, щоб рядки відображалися, а вся решта фігури була прозорою.

з pyplot я можу робити те, що хочу, я хочу зробити це з matplotlib з якоїсь тривалої причини, я не хочу згадувати, щоб продовжувати своє питання.


Чи можете ви уточнити, що ви робите? (тобто покажіть приклад) Ви використовуєте savefig? (Якщо так, це перевизначає все, що ви встановили, зберігаючи фігуру.) Чи fig.patch.set_visible(False)працює налаштування вручну ?
Джо Кінгтон

Я використовую canvas.print_png (відповідь), а не savefig.
Еммет Б

Відповіді:


178

По-перше, якщо ви використовуєте 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)

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


тому це вирішує половину проблеми. Але я також хочу, щоб цей чорний прямокутник був невидимим. Тож повинна бути видна тільки синя лінія.
Еммет Б

5
О, ну, у такому випадку це ще простіше. Просто використовуйте ax.axis('off')(вам все одно знадобиться також вимкнути рамку фігури).
Джо Кінгтон

спасибі, чи є спосіб зберегти мітки, такі як: Я хочу лише етикетки ax.set_yticklabels(('G1', 'G2', 'G3'))
Emmet B

Це здорово, я використовував його для іншої програми тут: stackoverflow.com/questions/4092927 / ...
cxrodgers

1
print_png()Кидає TypeError: write() argument must be str, not bytesвиняток для мене на Python 3. Відкриття файлу в записі двійкового файлу ( 'wb') необхідний для його роботи.
Габріель Яблонський

243

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

1
Мені це подобається, щоб позбутися верхніх та правих колючок
Адріан Торрі

5
Просто додати: Коли ви також хочете видалити кліщі: ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')
JLT

4
Також використовуйте ax = gca (), щоб створити об'єкт осі, якщо у вас його ще немає.
Камеронройтайлор

2
Це має бути прийнятою відповіддю. "ax.axis (" вимкнено ")" видаляє все, як-от: мітки x і y, галочки x і y та всі (4) межі з сюжету. Для кращого налаштування кожен елемент повинен оброблятися по-різному.
Санчіт

66

Найпростіший спосіб позбутися негарного кадру в новіших версіях matplotlib:

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

Якщо ви дійсно повинні завжди використовувати об'єктно - орієнтований підхід, то зробити: ax.set_frame_on(False).


2
Дякую! Це, мабуть, найчистіше рішення!
Каттія

2
При використанні об'єктно-орієнтованого підходу у мене був успіх ax.set_frame_on(False), який робить те саме. Можливо, включіть у відповідь вище.
Floyd4K

58

Надбудова на основі чудової відповіді @ 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()

1
Це вирішило мою проблему.
Емад Агаїй

6

Як я тут відповів , ви можете видалити колючки з усіх своїх сюжетів за допомогою параметрів стилю (аркуш стилів або 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

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


2

Для видалення кадру діаграми

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

Я сподіваюся, що це може спрацювати


1
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
plt.axis('off')
plt.savefig(file_path, bbox_inches="tight", pad_inches = 0)

plt.savefig має ці параметри в собі, просто потрібно встановити осі раніше

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.