2009-04-12 40 views
113

Đoạn mã sau vẽ hai tệp PostScript (.ps), nhưng tệp thứ hai chứa cả hai dòng.Làm thế nào để tôi nói với matplotlib rằng tôi đã hoàn thành một âm mưu?

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 cách nào tôi có thể yêu cầu matplotlib bắt đầu lặp lại cho ô thứ hai?

+3

là một điểm của phong cách, không cần phải sử dụng subplot khi bạn chỉ có một ô cho mỗi hình. – Autoplectic

Trả lời

95

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

+7

Tuyệt vời! Cảm ơn! Tôi thấy khó tìm thấy những gì tôi cần trong định dạng tài liệu hiện tại. Trang pyplot rất dài và tôi không thể xem mục nhập cho close() trong khi cuộn. Tôi đã tìm kiếm một cái gì đó như clean() clear() hoặc flush(). –

+15

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

+3

Bạn có thể sử dụng plt.close()/pylab.close() để xóa tất cả các hình cũ – Calvin1602

130

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

plt.clf() 

Nếu bạn có nhiều subplots trong hình cùng

plt.cla() 

xóa các trục hiện hành.

+2

ty rất nhiều cho việc này. Tôi đã có biểu đồ thanh đã "chảy máu" vào đồ thị tiếp theo. Lệnh này hoạt động hoàn hảo !! – anon58192932

+1

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

+3

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

27

Như đã nêu trong David Cournapeau, hãy 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 cốt truyện, vị trí khác.

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

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ã ban đầu của mình.

+1

trong matplotlib == 2.0.2, tôi nhận được thông báo này: MatplotlibDeprecationCảnh báo: pyplot.hold không được chấp nhận. – Jonathan

3

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

plt.show() 

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

0

Nếu không có thiết bị nào đang hoạt động 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 trong ô (jupyter) bạn đã khởi tạo x và y để trống. Điều này là do, có thể bạn đang thêm dữ liệu vào x và y mà không cần 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 ..

Các vấn đề liên quan