Làm thế nào để tôi nói với Matplotlib để tạo ra một âm mưu thứ hai (mới), sau đó là cốt truyện trên cái cũ?


147

Tôi muốn vẽ biểu đồ dữ liệu, sau đó tạo một hình mới và vẽ dữ liệu2, và cuối cùng quay lại biểu đồ gốc và dữ liệu cốt truyện3, đại loại như thế này:

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

FYI 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? làm một cái gì đó tương tự, nhưng không hoàn toàn! Nó không cho phép tôi truy cập vào cốt truyện gốc.

Câu trả lời:


152

Nếu bạn thấy mình làm những việc như thế này thường xuyên, có thể đáng để nghiên cứu giao diện hướng đối tượng đến matplotlib. Trong trường hợp của bạn:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

Nó dài dòng hơn một chút nhưng rõ ràng hơn và dễ theo dõi hơn, đặc biệt là với một vài hình có nhiều ô nhỏ.


2
Tôi thích cách tiếp cận hướng đối tượng vì khi tôi dự đoán có nhiều số liệu, sẽ dễ dàng theo dõi chúng hơn bằng cách sử dụng tên thay vì số. Cảm ơn!
Peter D

1
Nhưng làm thế nào người ta có thể thay đổi giới hạn nhãn và trục với phương pháp này. Nếu tôi sử dụng ax1.ylabelnó nói rằng nó không được tìm thấy. Tương tự với fig1.ylabel...
George Datseris

3
@GeorgeDatseris Cú pháp hơi khác một chút. Đó là ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label"), và ax1.set_title("your title").
simonb

1
Tại sao bạn sử dụng 111?
Yash Sodha

2
@yashSodha - đó là một đặc điểm kỹ thuật kiểu matlab về số lượng các ô con (hàng, col, chỉ mục). Nhưng giờ thì dễ sử dụng hơn nhiều plt.subplots(nrows, ncols). Đã cập nhật ví dụ.
simonb

120

Khi bạn gọi figure, chỉ cần đánh số cốt truyện.

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

Chỉnh sửa: Lưu ý rằng bạn có thể đánh số các ô theo cách bạn muốn (ở đây, bắt đầu từ 0) nhưng nếu bạn không cung cấp số liệu khi bạn tạo một số mới, thì việc đánh số tự động sẽ bắt đầu tại 1("Kiểu Matlab" theo đến các tài liệu).


3
Điều này dường như hoạt động trong chế độ tương tác của matplotlib, trong khi phương thức hình () ... add_subplot () thì không. Cảm ơn!
chbrown

@SebMa Xin đừng thay đổi mã mà không hiểu nó. Câu trả lời này cụ thể là về việc chuyển một số đến figure, mà bạn đã xóa. Những điều khác bạn thay đổi đã được sao chép từ bài viết gốc và không có lỗi trong câu trả lời của tôi.
agf

@agf Xin chào, tôi đã xóa phần 1bên trong plt.figure(1)vì tôi nghĩ số này tự động tăng và do đó không cần thiết. Lấy làm tiếc.
SebMa

18

Tuy nhiên, việc đánh số bắt đầu lúc 1, vì vậy:

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)

Ngoài ra, nếu bạn có nhiều trục trên một hình, chẳng hạn như các ô con, hãy sử dụng axes(h)lệnh trong đó hxử lý của đối tượng trục mong muốn để tập trung vào các trục đó.

(chưa có đặc quyền nhận xét, xin lỗi vì câu trả lời mới!)


10
0hoạt động, đánh số tự động chỉ bắt đầu lúc 1, nếu bạn không cho nó một số nào cả.
agf

0

Một cách tôi tìm thấy sau khi gặp khó khăn là tạo một hàm lấy ma trận data_plot, tên tệp và thứ tự làm tham số để tạo các ô vuông từ dữ liệu đã cho trong hình được sắp xếp (thứ tự khác nhau = hình khác nhau) và lưu nó dưới tên tệp đã cho.

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches='tight')
    plt.close()
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.