Làm thế nào để tôi nói với matplotlib rằng tôi đã hoàn thành một cốt truyện?


165

Đoạn mã sau biểu thị hai tệp PostScript (.ps), nhưng đoạn thứ hai chứa cả hai dòng.

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")

Làm thế nào tôi có thể nói với matplotlib để bắt đầu lại từ đầu cho cốt truyện thứ hai?


3
như một điểm của phong cách, không cần sử dụng subplot khi bạn chỉ có một ô trên mỗi hình.
Autoplectic

Câu trả lời:


123

Bạn có thể sử dụng figuređể tạo một âm mưu mới, ví dụ, hoặc sử dụng closesau âm mưu đầu tiên.


19
Hướng dẫn pyplot có đề cập đến clf () trong phần "nhiều hình". Lưu ý rằng nếu bạn chỉ tạo một âm mưu mới với hình () mà không đóng cái cũ bằng close () (ngay cả khi bạn đóng cửa sổ GUI), pyplot vẫn giữ một tham chiếu đến hình cũ của bạn, có thể trông giống như rò rỉ bộ nhớ.
Jouni K. Seppänen

5
Bạn có thể sử dụng plt.close () / pylab.close () để xóa tất cả các số liệu cũ
Calvin1602

1
Sau cốt truyện đầu tiên, bạn có nghĩa là sau plt.savefig("first.ps")?
Sigur

@ JouniK.Seppänen Chỉ cần thêm vào bình luận của bạn, Python sẽ mặc định cảnh báo bạn nếu bạn mở nhiều số liệu: "RuntimeWarning: Hơn 20 số liệu đã được mở.".
rph

173

Có một lệnh hình rõ ràng và nó sẽ làm điều đó cho bạn:

plt.clf()

Nếu bạn có nhiều ô con trong cùng một hình

plt.cla()

xóa các trục hiện tại.


1
Cảm ơn! Nếu bạn đang sử dụng phụ trợ PDF (cho phép bạn lưu nhiều lô), bạn sẽ cần gọi cuộc gọi này sau mỗi cuộc gọi tới plt.save ()
Ben DeMott

4
Trong trường hợp của tôi, plt.clf () là đủ để xóa hình nhưng không đủ để ngăn chặn rò rỉ bộ nhớ, nhưng lần đầu tiên gọi plt.close () đã dừng rò rỉ bộ nhớ. Python 2.7, matplotlib 1.1.1rc1 (ubfox 12.04). FYI.
DJDuff

29

Như đã nêu từ David Cournapeau, sử dụng hình ().

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")

Hoặc subplot (121) / subplot (122) cho cùng một cốt truyện, vị trí khác nhau.

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
bạn vẫn nên sử dụng plt.clf(), các số liệu được giữ trong bộ nhớ cho đến khi đóng rõ ràng
kaveish

13

Chỉ cần nhập plt.hold(False)trước plt.plot đầu tiên và bạn có thể dính vào mã gốc của mình.


6
trong matplotlib == 2.0.2, tôi nhận được thông báo này: MatplotlibDeprecationWarning: pyplot.keep bị phản đối.
Jonathan

12

Nếu bạn đang sử dụng Matplotlib một cách tương tác, ví dụ như trong một ứng dụng web, (ví dụ: ipython), bạn có thể đang tìm kiếm

plt.show()

thay vì plt.close()hoặc plt.clf().


bạn vừa tiết kiệm cho tôi rất nhiều thời gian tôi không phải mất
tái lập

1

Nếu không ai trong số họ đang làm việc thì hãy kiểm tra điều này .. giả sử nếu bạn có mảng dữ liệu x và y dọc theo trục tương ứng. Sau đó kiểm tra ô nào (jupyter) mà bạn đã khởi tạo x và y để trống. Điều này là do, có thể bạn đang nối thêm dữ liệu vào x và y mà không khởi tạo lại chúng. Vì vậy, cốt truyện có dữ liệu cũ quá. Vì vậy, hãy kiểm tra xem ..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.