ควรใช้ cla (), clf () หรือ close () เพื่อล้างพล็อตใน matplotlib หรือไม่?


541

Matplotlib มีฟังก์ชั่น:

cla()   # Clear axis
clf()   # Clear figure
close() # Close a figure window

เอกสารไม่ได้ให้ข้อมูลเชิงลึกเกี่ยวกับความแตกต่างระหว่างฟังก์ชั่นเหล่านี้ ฉันควรใช้แต่ละฟังก์ชั่นเมื่อไหร่และจะทำอย่างไร?

คำตอบ:


713

พวกเขาทำสิ่งที่แตกต่างกันเนื่องจาก matplotlib ใช้ลำดับชั้นที่หน้าต่างรูปมีตัวเลขซึ่งอาจประกอบด้วยหลายแกน นอกจากนี้ยังมีฟังก์ชั่นจากส่วนต่อประสาน pyplot และมีวิธีการในFigureชั้นเรียน ฉันจะหารือเกี่ยวกับทั้งสองกรณีด้านล่าง

อินเตอร์เฟซ pyplot

pyplotเป็นโมดูลที่รวบรวมสองฟังก์ชันที่อนุญาตให้ใช้ matplotlib ในลักษณะการทำงาน ฉันนี่สมมติว่าได้รับนำเข้าเป็นpyplot import matplotlib.pyplot as pltในกรณีนี้มีสามคำสั่งต่าง ๆ ที่จะลบสิ่งต่าง ๆ :

plt.cla()ล้างแกนนั่นคือแกนที่ใช้งานในปัจจุบันในรูปปัจจุบัน มันปล่อยให้แกนอื่น ๆ ไม่มีใครแตะต้อง

plt.clf()ล้างตัวเลขปัจจุบันทั้งหมดด้วยแกนทั้งหมด แต่เปิดหน้าต่างทิ้งไว้เพื่อให้สามารถนำกลับมาใช้ใหม่สำหรับแปลงอื่นได้

plt.close()ปิดหน้าต่างซึ่งจะเป็นหน้าต่างปัจจุบันหากไม่ได้ระบุเป็นอย่างอื่น

ฟังก์ชันใดที่เหมาะกับคุณที่สุดขึ้นอยู่กับการใช้งานของคุณ

close()ฟังก์ชั่นนอกจากนี้ยังช่วยให้หนึ่งเพื่อระบุหน้าต่างควรจะปิด อาร์กิวเมนต์สามารถเป็นได้ทั้งจำนวนหรือชื่อที่กำหนดไปยังหน้าต่างเมื่อมันถูกสร้างขึ้นโดยใช้figure(number_or_name)หรืออาจจะยกตัวอย่างเช่นตัวเลขที่ได้รับคือการใช้fig fig = figure()หากไม่มีการกำหนดอาร์กิวเมนต์close()หน้าต่างที่ใช้งานในปัจจุบันจะถูกปิด นอกจากนี้ยังมีไวยากรณ์close('all')ซึ่งปิดตัวเลขทั้งหมด

เมธอดของคลาส Figure

นอกจากนี้Figureคลาสยังมีวิธีสำหรับการเคลียร์ตัวเลข ฉันจะสมมติต่อไปนี้figเป็นตัวอย่างของFigure:

fig.clf()ล้างรูปทั้งหมด สายนี้เทียบเท่าได้กับplt.clf()เฉพาะในกรณีที่figเป็นตัวเลขปัจจุบัน

fig.clear() คำพ้องความหมายสำหรับ fig.clf()

โปรดทราบว่าแม้del figจะไม่ปิดหน้าต่างรูปภาพที่เกี่ยวข้อง เท่าที่ฉันรู้วิธีเดียวที่จะปิดหน้าต่างรูปใช้plt.close(fig)ตามที่อธิบายไว้ข้างต้น


38
เนื่องจากclose()เป็นคำสั่งที่ไม่เจาะจงฉันจึงไปหาวิธีระบุการปิดรูป ( fig.close()ไม่ใช่ฟังก์ชัน) plt.close(fig)ไวยากรณ์ที่ถูกต้องคือ
tyleha

สิ่งที่เกี่ยวกับclear()ฉันไม่เห็นความแตกต่างมากกับcla()เฉพาะในแกนกาฝากเท่านั้นcla()ถือว่าพิเศษ
dashesy

1
ไม่มีclear()ฟังก์ชั่นในของฉันmatplotlib.pyplot(เวอร์ชั่น 1.4.2 บน MacOS) คุณช่วยพาฉันไปที่เอกสารที่เกี่ยวข้องได้ไหม
David Zwicker

2
ทั้งคลาสรูปและแกนมีclear()วิธีการ Figure.clearเทียบเท่ากับclfและ เทียบเท่ากับAxes.clear cla
SiggyF

2
มันทำงานเกี่ยวกับจูปีเตอร์หรือไม่? ฉันยังคงกดปุ่มผิดพลาดหน่วยความจำเพราะตัวเลขไม่ถูกเก็บรวบรวมขยะเมื่อฉันวิ่งเซลล์ใน jupyter อีกครั้ง
CMCDragonkai

79

มีเพียงข้อแม้ที่ฉันค้นพบในวันนี้ หากคุณมีฟังก์ชั่นที่เรียกพล็อตหลาย ๆ ครั้งคุณควรใช้ดีกว่าplt.close(fig)แทนที่จะใช้fig.clf()วิธีแรกที่ไม่ได้สะสมในหน่วยความจำ ในระยะสั้นหากหน่วยความจำเป็นข้อกังวลใช้ plt.close (รูป) (แม้ว่าดูเหมือนว่ามีวิธีที่ดีกว่าไปที่จุดสิ้นสุดของความคิดเห็นนี้สำหรับลิงค์ที่เกี่ยวข้อง)

ดังนั้นสคริปต์ต่อไปนี้จะสร้างรายการว่าง:

for i in range(5):
    fig = plot_figure()
    plt.close(fig)
# This returns a list with all figure numbers available
print(plt.get_fignums())

ในขณะที่คนนี้จะสร้างรายการที่มีห้าตัวเลขอยู่ในนั้น

for i in range(5):
    fig = plot_figure()
    fig.clf()
# This returns a list with all figure numbers available
print(plt.get_fignums())

จากเอกสารข้างต้นไม่ชัดเจนสำหรับฉันความแตกต่างระหว่างการปิดภาพและปิดหน้าต่างคืออะไร บางทีนั่นอาจจะทำให้ชัดเจน

หากคุณต้องการลองใช้สคริปต์ที่สมบูรณ์คุณก็มี:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1000)
y = np.sin(x)

for i in range(5):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(x, y)
    plt.close(fig)

print(plt.get_fignums())

for i in range(5):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.plot(x, y)
    fig.clf()

print(plt.get_fignums())

หากหน่วยความจำเป็นปัญหาที่มีคนโพสต์แก้ไขปัญหาใน SO แล้วดู: สร้างภาพที่นับการอ้างอิง


26
ขอบคุณสำหรับการอ้างอิงโยงที่เป็นประโยชน์กับคำถามการนับการอ้างอิง นั่นเป็นวิธีที่ Matplotlib ควรทำงานแล้ว เป็นเรื่องที่น่ากลัวและน่าตกใจพอ ๆ กันว่าตัวเลขจะไม่ถูกเก็บรวบรวมภายใต้pyplotAPI มาตรฐาน
เซซิลแกงกะหรี่

1
อย่างไรก็ตามฉันพบว่าหากมีการสร้างภาพเคลื่อนไหว (ตัวอย่างเช่นแผนที่ 2D contour / pcolormesh) จะเป็นการดีกว่าที่จะล้างตัวเลขและวาดเขตข้อมูลใหม่แทนที่จะปิดเก่าและสร้างแผงรูปใหม่ ความเร็วจะแตกต่างอย่างสิ้นเชิง
msi_gerva

11

plt.cla ()หมายถึงแกนปัจจุบันที่ชัดเจน

plt.clf ()หมายถึงตัวเลขที่ชัดเจนในปัจจุบัน

นอกจากนี้ยังมีplt.gca () (รับแกนปัจจุบัน) และplt.gcf () (รับตัวเลขปัจจุบัน)

อ่านเพิ่มเติมได้ที่นี่: Matplotlib, Pyplot, Pylab ฯลฯ : อะไรคือความแตกต่างระหว่างสิ่งเหล่านี้กับเวลาที่จะใช้แต่ละอัน?

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