วิธีลบเฟรมออกจาก matplotlib (pyplot.figure เทียบกับ matplotlib.figure) (frameon = ปัญหาที่เป็นเท็จใน matplotlib)


160

ในการลบเฟรมในรูปฉันเขียน

frameon=False

ทำงานได้อย่างสมบูรณ์แบบด้วย pyplot.figureแต่เมื่อmatplotlib.Figureลบพื้นหลังสีเทาออกเท่านั้นเฟรมจะยังคงอยู่ นอกจากนี้ฉันต้องการให้เส้นแสดงเท่านั้นและส่วนที่เหลือทั้งหมดของรูปจะโปร่งใส

ด้วย pyplot ฉันสามารถทำสิ่งที่ฉันต้องการได้ฉันต้องการทำกับ matplotlib ด้วยเหตุผลบางอย่างที่ฉันไม่ต้องการพูดถึงเพื่อขยายคำถามของฉัน


คุณช่วยอธิบายสิ่งที่คุณกำลังทำอยู่ได้ไหม? (เช่นแสดงตัวอย่าง) คุณกำลังใช้savefig? (ถ้าเป็นเช่นนั้นมันจะแทนที่สิ่งที่คุณตั้งไว้เมื่อบันทึกรูป) การตั้งค่าด้วยตนเองfig.patch.set_visible(False)ทำงานหรือไม่
Joe Kington

ฉันใช้ canvas.print_png (ตอบกลับ) ไม่ใช่ savefig
Emmet B

คำตอบ:


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)

ป้อนคำอธิบายรูปภาพที่นี่


ดังนั้นวิธีนี้จึงแก้ปัญหาได้ครึ่งหนึ่ง แต่ฉันยังต้องการให้กรอบสี่เหลี่ยมสีดำนี้มองไม่เห็น ดังนั้นควรมองเห็นเฉพาะเส้นสีน้ำเงินเท่านั้น
Emmet B

5
โอ้ในกรณีนี้มันง่ายกว่ามาก เพียงใช้ax.axis('off')(คุณจะต้องปิดเฟรมรูปด้วย)
Joe Kington

ขอบคุณมีวิธีที่จะทำให้ ticklabels เช่น: ฉันต้องการเพียงป้ายกำกับ ax.set_yticklabels(('G1', 'G2', 'G3'))
Emmet B

นี่มันยอดเยี่ยมมากฉันใช้มันสำหรับแอปพลิเคชั่นอื่นที่นี่: stackoverflow.com/questions/4092927/ …
cxrodgers

1
print_png()พ่นTypeError: write() argument must be str, not bytesข้อยกเว้นสำหรับฉันในหลาม 3. การเปิดไฟล์ที่เขียนไบนารี ( 'wb') เป็นสิ่งจำเป็นเพื่อให้การทำงาน
Gabriel Jablonski

243

ax.axis('off')จะเป็นโจ Kington ชี้ให้เอาทุกอย่างยกเว้นเส้นที่วางแผนไว้

สำหรับผู้ที่ต้องการเพียงแค่ลบกรอบ (เส้นขอบ) และเก็บป้ายกำกับทิกเกอร์ ฯลฯ เราสามารถทำได้โดยการเข้าถึง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
ฉันชอบสิ่งนี้เพื่อกำจัดสันด้านบนและขวา
Adrian Torrie

5
เพียงเพิ่ม: เมื่อคุณต้องการลบเห็บ: ax.yaxis.set_ticks_position('left') ax.xaxis.set_ticks_position('bottom')
JLT

4
นอกจากนี้ยังใช้ ax = gca () เพื่อสร้างวัตถุแกนถ้าคุณยังไม่มี
cameronroytaylor

2
นี่ควรเป็นคำตอบที่ยอมรับได้ "ax.axis (" off ")" ลบทุกอย่างเช่น: ป้ายกำกับ x และ y, เครื่องหมายขีด x และ y และเส้นขอบ (4) ทั้งหมดจากโครงเรื่อง เพื่อการปรับแต่งที่ดีขึ้นแต่ละองค์ประกอบควรได้รับการจัดการที่แตกต่างกัน
Sanchit

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

ปัญหา

ฉันมีปัญหาคล้ายกันกับการใช้ขวาน พารามิเตอร์ชั้น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 มีตัวเลือกเหล่านั้นในตัวเองเพียงแค่ต้องตั้งแกนออกก่อน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.