ฉันจะบอก 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.