matplotlibからフレームを削除する方法(pyplot.figure vs matplotlib.figure)(frameon = False Matplotlibで問題あり)


161

図のフレームを削除するには、私は書きます

frameon=False

完璧に動作します pyplot.figureが、matplotlib.Figure、灰色の背景のみが削除され、フレームは残ります。また、線だけを表示し、残りのすべての図形は透明にします。

pyplotを使用すると、自分のやりたいことを実行できます。質問を拡張することについては言及しなかった長い理由のため、matplotlibを使用してそれを実行します。


何をしているのかわかりますか?(例を示します)使用していsavefigますか?(その場合、Figureを保存するときに設定した内容が上書きされます。)手動設定はfig.patch.set_visible(False)機能しますか?
Joe Kington、2013

savefigではなくcanvas.print_png(response)を使用しています。
Emmet B

回答:


178

まず、を使用savefigしている場合は、特に指定しない限り、保存時にFigureの背景色が上書きされることに注意してください(例: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)

ここに画像の説明を入力してください

ただし、その場合は、AxesがFigure全体を占めるようにすることができます。軸の位置を手動で指定する場合は、図全体を占めるように指示できます(または、を使用できます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)

ここに画像の説明を入力してください


これで問題の半分が解決されます。しかし、この黒いフレームの長方形も非表示にしたいです。したがって、青い線のみが表示されます。
Emmet B

5
ああ、まあ、その場合はもっと簡単です。使用するだけax.axis('off')です(Figureフレームもオフにする必要があります)。
Joe Kington

おかげで、次のような目盛りラベルを維持する方法はありますか:ラベルだけが欲しい ax.set_yticklabels(('G1', 'G2', 'G3'))
エメットB

:これは私がここに別のアプリケーションのためにそれを使用して、素晴らしいですstackoverflow.com/questions/4092927/...
cxrodgers

1
print_png()AをスローしますTypeError: write() argument must be str, not bytesライト・バイナリとしてファイル(オープニングのpython 3の上に私のために例外を'wb'仕事にするために必要とされているが)。
Gabriel Jablonski、

244

ax.axis('off')、Joe Kingtonが指摘したように、プロットされた線以外のすべてを削除します。

フレーム(境界線)のみを削除し、ラベル、ティッカーなどを保持したいspines場合は、軸上のオブジェクトにアクセスすることでそれを行うことができます。軸オブジェクトを指定するaxと、次のようにして4辺すべての境界線を削除する必要があります。

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

そして、プロットからティックxyティックを削除する場合:

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

1
私はこれを上と右の棘を取り除くために好​​きです
エイドリアン・トーリー2016年

5
追加するだけ:ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')
目盛り

4
また、軸オブジェクトがない場合は、ax = gca()を使用して作成します。
cameronroytaylor 2017年

2
これは受け入れられる答えになるはずです。"ax.axis(" off ")"は、xとyのラベル、xとyの目盛り、およびすべての(4)境界線をプロットから削除します。より良いカスタマイズのために、各要素は異なる方法で処理する必要があります。
Sanchit 2017年

66

matplotlibの新しいバージョンで醜いフレームを取り除く最も簡単な方法:

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

オブジェクト指向のアプローチを常に使用する必要がある場合は、次のようにしますax.set_frame_on(False)


2
ありがとうございました!これはおそらく最もクリーンなソリューションです!
Kattia

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
それは私の問題を修正しました。
Emad Aghayi

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

問題

Axesを使用して同様の問題がありました。classパラメータはです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.box(False)
plt.xticks([])
plt.yticks([])
plt.savefig('fig.png')

トリックを行う必要があります。


0
plt.axis('off')
plt.savefig(file_path, bbox_inches="tight", pad_inches = 0)

plt.savefig自体にこれらのオプションがあります。前にAxesをオフに設定する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.