ฉันจะบอก matplotlib ว่าฉันทำกับพล็อตได้อย่างไร


166

โค้ดต่อไปนี้แปลงไฟล์ PostScript (.ps) สองไฟล์ แต่ไฟล์ที่สองมีทั้งสองบรรทัด

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.subplot(111)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")


plt.subplot(111)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

ฉันจะบอก matplotlib ให้เริ่มต้นใหม่อีกครั้งสำหรับพล็อตที่สองได้อย่างไร


3
ในฐานะของสไตล์คุณไม่จำเป็นต้องใช้แผนย่อยเมื่อคุณมีเพียงหนึ่งพล็อตต่อหนึ่งรูป
— Autoplectic

คำตอบ:


124

คุณสามารถใช้figureเพื่อสร้างพล็อตใหม่ตัวอย่างเช่นหรือใช้closeหลังจากพล็อตแรก


19
บทแนะนำ pyplot ไม่พูดถึง clf () ในส่วน "ตัวเลขหลายตัว" โปรดทราบว่าถ้าคุณเพิ่งสร้างพล็อตใหม่ด้วยรูป () โดยไม่ต้องปิดเก่าด้วยปิด () (แม้ว่าคุณจะปิดหน้าต่าง GUI), pyplot ยังคงมีการอ้างอิงถึงร่างเก่าของคุณซึ่งอาจดูเหมือนรั่วหน่วยความจำ
— Jouni K. Seppänen

5
คุณสามารถใช้ plt.close () / pylab.close () เพื่อลบรูปเก่าทั้งหมดได้
— Calvin1602

1
หลังจากพล็อตแรกคุณหมายถึงหลังจากplt.savefig("first.ps")หรือไม่
— Sigur

@ JouniK.Seppänenเพียงแค่เพิ่มความคิดเห็นของคุณ Python จะเตือนคุณหากคุณเปิดตัวเลขจำนวนมาก: "RuntimeWarning: มีการเปิดตัวเลขมากกว่า 20 ตัว"
— rph

173

มีคำสั่งรูปที่ชัดเจนและควรทำเพื่อคุณ:

plt.clf()

หากคุณมีหลาย subplots ในรูปเดียวกัน

plt.cla()

ล้างแกนปัจจุบัน


1
ขอบคุณ! หากคุณใช้แบ็กเอนด์ PDF (ซึ่งอนุญาตให้คุณบันทึกหลาย ๆ แปลง) คุณจะต้องเรียกสิ่งนี้หลังจากการโทรแต่ละครั้งไปที่ plt.save ()
— Ben DeMott

4
ในกรณีของฉัน plt.clf () เพียงพอที่จะล้างตัวเลข แต่ไม่เพียงพอที่จะหยุดการรั่วไหลของหน่วยความจำ แต่แรกโทร plt.close () หยุดการรั่วไหลของหน่วยความจำ Python 2.7, matplotlib 1.1.1rc1 (Ubuntu 12.04) FYI
— DJDuff

29

ตามที่ระบุจาก David Cournapeau ให้ใช้รูป ()

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.figure()
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("first.ps")


plt.figure()
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

หรือแผนย่อย (121) / แผนย่อย (122) สำหรับพล็อตเดียวกันตำแหน่งที่แตกต่างกัน

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab

plt.subplot(121)
x = [1,10]
y = [30, 1000]
plt.loglog(x, y, basex=10, basey=10, ls="-")

plt.subplot(122)
x = [10,100]
y = [10, 10000]
plt.loglog(x, y, basex=10, basey=10, ls="-")
plt.savefig("second.ps")

3
คุณยังควรใช้plt.clf()ตัวเลขนั้นจะถูกเก็บไว้ในหน่วยความจำจนกว่าจะปิดอย่างชัดเจน
— kaveish

13

เพียงป้อนplt.hold(False)ก่อนหน้า plt.plot แรกและคุณสามารถยึดตามรหัสเดิมของคุณได้


6
ใน matplotlib == 2.0.2 ฉันได้รับข้อความนี้: MatplotlibDeprecationWarning: pyplot.hold เลิกใช้แล้ว
— Jonathan

12

หากคุณใช้ Matplotlib แบบโต้ตอบตัวอย่างเช่นในเว็บแอปพลิเคชัน (เช่น ipython) ที่คุณอาจมองหา

plt.show()

แทนหรือplt.close()plt.clf()


คุณเพียงแค่บันทึกฉันพวงของเวลาที่ฉันไม่ได้มีการสูญเสีย
— reabow

1

ถ้าไม่มีพวกมันทำงานให้ตรวจสอบ .. บอกว่าถ้าคุณมี x และ y อาร์เรย์ของข้อมูลตามแกนที่เกี่ยวข้อง จากนั้นตรวจสอบว่าเซลล์ใด (jupyter) ที่คุณกำหนดค่าเริ่มต้นให้ x และ y ว่างเปล่า อาจเป็นเพราะคุณกำลังต่อท้ายข้อมูลกับ x และ y โดยไม่ต้องเริ่มต้นใหม่ ดังนั้นพล็อตก็มีข้อมูลเก่าด้วย ดังนั้นตรวจสอบว่า ..

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