Sự khác biệt giữa các bản vẽ đồ thị bằng cách sử dụng đồ thị, trục hoặc hình trong matplotlib là gì?


101

Tôi hơi bối rối chuyện gì đang xảy ra ở phần phụ trợ khi tôi vẽ các ô trong matplotlib, tbh, tôi không rõ về thứ bậc của cốt truyện, các trục và hình vẽ. Tôi đã đọc tài liệu và nó rất hữu ích nhưng tôi vẫn bối rối ...

Đoạn mã dưới đây vẽ cùng một âm mưu theo ba cách khác nhau -

#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

Bây giờ câu hỏi của tôi là -

  1. Sự khác biệt giữa cả ba là gì, ý tôi là điều gì sẽ xảy ra khi bất kỳ phương pháp nào trong 3 phương pháp được gọi?

  2. Phương pháp nào nên được sử dụng khi nào và ưu nhược điểm của việc sử dụng phương pháp nào trên những phương pháp đó?


8
Tôi đã đọc điều đó nhưng tôi không tìm thấy câu trả lời thỏa mãn chút nào. Nó giải thích hệ thống phân cấp, nhưng cũng làm tăng sự nhầm lẫn tại sao không có một cách thông thường, tại sao đối tượng hình thậm chí còn lộ ra?
băm

Tôi không chắc liệu bạn có tham khảo tài liệu chính xác này matplotlib.org/users/artists.html hay không . Điều này trả lời câu hỏi của bạn về lý do tại sao con số thậm chí còn bị lộ. Cá nhân đây là lời giải thích tốt nhất về matplotlib mà tôi đã tìm thấy. Đối tượng hình cho phép bạn thêm Nghệ sĩ của riêng mình trực tiếp mà không cần trục mặc dù điều này hiếm khi được sử dụng trừ khi bạn muốn điều chỉnh "bản vá" của chính hình đó, v.v. Lưu ý rằng hình là vùng chứa mẹ và chứa các trục & nghệ sĩ.
Sandeep

Câu trả lời:


55

Phương pháp 1

plt.plot(x, y)

Điều này cho phép bạn vẽ chỉ một hình với tọa độ (x, y). Nếu bạn chỉ muốn lấy một hình ảnh, bạn có thể sử dụng cách này.

Phương pháp 2

ax = plt.subplot()
ax.plot(x, y)

Điều này cho phép bạn vẽ một hoặc một số (các) hình trong cùng một cửa sổ. Khi bạn viết nó, bạn sẽ vẽ chỉ một con số, nhưng bạn có thể tạo ra một cái gì đó như sau:

fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

Bạn sẽ vẽ 4 hình có tên là ax1, ax2, ax3 và ax4, mỗi hình được đặt trên cùng một cửa sổ. Cửa sổ này sẽ được chia thành 4 phần với ví dụ của tôi.

Phương pháp 3

fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)

Tôi đã không sử dụng nó, nhưng bạn có thể tìm thấy tài liệu.

Thí dụ:

import numpy as np
import matplotlib.pyplot as plt

# Method 1 #

x = np.random.rand(10)
y = np.random.rand(10)

figure1 = plt.plot(x,y)

# Method 2 #

x1 = np.random.rand(10)
x2 = np.random.rand(10)
x3 = np.random.rand(10)
x4 = np.random.rand(10)
y1 = np.random.rand(10)
y2 = np.random.rand(10)
y3 = np.random.rand(10)
y4 = np.random.rand(10)

figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.plot(x3,y3)
ax4.plot(x4,y4)

plt.show()

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Ví dụ khác:

nhập mô tả hình ảnh ở đây


@ hashcode55 mỗi hình là độc lập. Tôi sẽ chỉ cho bạn một ví dụ
Essex

1
@ hashcode55 tôi sẽ chỉnh sửa với một ví dụ (chỉ là con số từ nghiên cứu của tôi trong Vật lý thiên văn, kịch bản quá dài (1300 dòng));) Mỗi nhân vật là độc lập;)
Essex

3
Tôi biết điều này là matplotlibkhó hiểu , nhưng tôi đang làm điều đó vì ngôn ngữ khiến tôi khó hiểu và câu hỏi này xuất hiện khi tìm kiếm về "trục so với hình trong matplotlib." Đối với các noobs khác, câu hỏi này đã giúp trả lời điều đó. Tôi nghĩ rằng từ ngữ ở đây có thể rõ ràng hơn subplots()sẽ trả về Axescác đối tượng trên một đơn vị figure.
Hendy

35

Tên của các đối tượng

Matplotlib là hướng đối tượng mạnh mẽ và các đối tượng chính của nó là hình và các trục (tôi thấy tên axeshơi sai, nhưng có lẽ đó chỉ là tôi).

Bạn có thể coi hình vẽ như một khung vẽ , trong đó bạn thường chỉ định kích thước và có thể ví dụ, màu nền, v.v. Bạn sử dụng khung vẽ, hình , về cơ bản theo hai cách, đặt các đối tượng khác lên đó (chủ yếu là các trục , nhưng cũng như nhãn văn bản, v.v.) và lưu nội dung của nó với savefig.

Bạn có thể nghĩ về một trục như một loại dao quân đội Thụy Sĩ, một đối tượng tiện dụng mà cung cấp một công cụ (ví dụ .plot, .scatter, .histvv) cho tất cả mọi thứ, chủ yếu. Bạn có thể đặt một, hai, ... nhiều trục bên trong một hình bằng một trong nhiều phương pháp khác nhau.

các pltgiao diện

Các plt giao diện thủ tục ban đầu được phát triển để bắt chước các MATLAB ™ giao diện nhưng không thực sự khác biệt so với giao diện hướng đối tượng, ngay cả khi bạn không thực hiện một tham chiếu trực tiếp đến các đối tượng chính (ví dụ, một con số và một trục ) các đối tượng này là tự động khởi tạo và mỗi phương thức plt , về cơ bản, được dịch sang một lệnh gọi của một trong các phương thức của các đối tượng cơ bản bên dưới: ví dụ: a plt.plot()là a hidden_axes.plotvà a plt.savefiglà a hidden_figure.savefig.

Trong mọi thời điểm, bạn có thể xử lý các đối tượng ẩn này bằng cách sử dụng plt.gcfplt.gca, và điều này đôi khi cần thiết khi một trong các phương thức đối tượng chưa được chuyển đến một phương thức trong không gian tên plt .

Tôi muốn nói thêm rằng không gian tên plt cũng chứa một số phương thức thuận tiện để khởi tạo, theo những cách khác nhau, hìnhtrục .

Ví dụ của bạn

Cách thứ nhất

plt.plot(x, y)

Ở đây bạn chỉ sử dụng giao diện plt , bạn chỉ có thể sử dụng một trục duy nhất trong mỗi hình , nhưng đây là những gì bạn muốn khi bạn đang khám phá dữ liệu của mình, một công thức nhanh chóng hoàn thành công việc ...

Cách thứ 2

ax = plt.subplot()
ax.plot(x, y)

Ở đây bạn sử dụng một phương thức tiện lợi trong không gian tên plt để đặt tên (và một xử lý) cho đối tượng trục của bạn , nhưng btw cũng có một hình ẩn . Sau đó, bạn có thể sử dụng đối tượng trục để vẽ, để tạo biểu đồ, v.v., tất cả những thứ bạn có thể làm với giao diện plt , nhưng bạn cũng có thể truy cập tất cả các thuộc tính của nó và sửa đổi chúng một cách tự do hơn.

Cách thứ 3

figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

Tại đây, bạn bắt đầu khởi tạo một hình bằng phương thức tiện lợi trong không gian tên plt và sau đó bạn chỉ sử dụng giao diện hướng đối tượng.

Có thể bỏ qua phương thức tiện lợi plt ( matplotlib.figure.Figure) nhưng sau đó bạn phải điều chỉnh con số để có trải nghiệm tương tác tốt hơn (xét cho cùng, đó là một phương thức tiện lợi ).

Đề xuất cá nhân

Tôi đề nghị trần plt.plot, plt.scattertrong bối cảnh của một phiên tương tác, có thể sử dụng IPython với %matplotliblệnh ma thuật của nó , và cũng trong bối cảnh của một sổ ghi chép Jupyter khám phá.

Mặt khác, cách tiếp cận hướng đối tượng, cộng với một vài plt phương pháp tiện lợi, là cách để

  • nếu bạn có một vấn đề vĩnh viễn cần giải quyết một lần cho tất cả với sự sắp xếp tùy chỉnh của các ô phụ được tinh chỉnh,
  • nếu bạn muốn nhúng Matplotlib vào giao diện người dùng của chương trình bạn viết.

Có một vùng xám lớn giữa những thái cực này và nếu bạn hỏi tôi phải làm gì, tôi chỉ nói "Điều đó phụ thuộc" ...


2
"Tôi thấy các trục tên hơi sai lệch, nhưng có lẽ đó chỉ là tôi" - không, tôi cũng vậy. Không thể thay đổi mặc dù.
Laryx Decidua

1
Một điều khác mà tôi không thể hiểu tại sao mọi người sử dụng fig, ax = plt.subplot()thành ngữ khi họ không muốn có tình tiết phụ. Trong những trường hợp như vậy, tôi thấy phong cách "thủ tục" dễ dàng hơn. "Nhưng có lẽ chỉ có tôi ..." :-)
Laryx Decidua

@LaryxDecidua Tôi có thể thấy ngay hai lý do chính đáng ① "Rõ ràng tốt hơn là ngầm hiểu" ② bạn muốn sử dụng các phương thức của Hình hoặc của Axes không có sẵn trong API thủ tục - nhưng có thể có những lý do khác…
gboffi

Có, tôi hoàn toàn đăng ký 1). Re 2): hầu hết thời gian API thủ tục là đủ. Vào cuối ngày, tôi nghĩ rằng điều đó phụ thuộc vào sở thích cá nhân - điều mà người ta không nên tranh cãi :-)
Laryx Decidua
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.