Tại sao nhiều ví dụ sử dụng `fig, ax = plt.subplots ()` trong Matplotlib / pyplot / python


267

Tôi đang học cách sử dụng matplotlibbằng cách nghiên cứu các ví dụ và rất nhiều ví dụ dường như bao gồm một dòng như sau trước khi tạo một cốt truyện duy nhất ...

fig, ax = plt.subplots()

Dưới đây là một số ví dụ ...

Tôi thấy hàm này được sử dụng rất nhiều, mặc dù ví dụ này chỉ cố gắng tạo một biểu đồ duy nhất. Có một số lợi thế khác? Bản demo chính thức subplots()cũng sử dụng f, ax = subplotskhi tạo một biểu đồ duy nhất và nó chỉ bao giờ tham chiếu ax sau đó. Đây là mã họ sử dụng.

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')

11
tốt, nó ngắn gọn, súc tích và bạn có được một tham chiếu cả hai hình và trục trong một bước duy nhất. Đó là pythonic, bởi vì nó đẹp :)
cel

Câu trả lời:


325

plt.subplots()là một hàm trả về một tuple chứa một hình và các đối tượng trục. Do đó, khi sử dụng, fig, ax = plt.subplots()bạn giải nén bộ dữ liệu này vào các biến figax. Có figích nếu bạn muốn thay đổi các thuộc tính mức hình hoặc lưu hình dưới dạng tệp hình ảnh sau này (ví dụ: với fig.savefig('yourfilename.png')). Bạn chắc chắn không phải sử dụng đối tượng hình trả về nhưng nhiều người sử dụng nó sau này để thấy điều đó là phổ biến. Ngoài ra, tất cả các đối tượng trục (các đối tượng có phương thức vẽ đồ thị), dù sao cũng có một đối tượng hình cha mẹ:

fig, ax = plt.subplots()

ngắn gọn hơn thế này:

fig = plt.figure()
ax = fig.add_subplot(111)

8
Giải thích rất tốt. Đây là tài liệu về nó - matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7

2
Tại sao chúng ta luôn sử dụng 111 làm tham số trong subplot?
Priyansh

@Priyansh vì nó được kế thừa từ cú pháp Matlab
pcko1

@Priyansh Không phải lúc nào. Nếu bạn muốn có 4 biểu đồ, bạn có thể có ax11, ax12, ax21, ax22bằng cách sử dụng fig.add_subplot(221)(hoặc 222, 223, 224 tương ứng).
Hướng dẫn

49

Chỉ cần một bổ sung ở đây.

Câu hỏi sau đây là nếu tôi muốn có thêm các ô con trong hình thì sao?

Như đã đề cập trong tài liệu, chúng ta có thể sử dụng fig = plt.subplots(nrows=2, ncols=2) để thiết lập một nhóm các ô con với lưới (2,2) trong một đối tượng hình.

Sau đó, như chúng ta đã biết, fig, ax = plt.subplots()trả về một tuple, fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)trước tiên hãy thử .

ValueError: not enough values to unpack (expected 4, got 2)

Nó phát sinh một lỗi, nhưng không phải lo lắng, vì bây giờ chúng ta thấy rằng plt.subplots()thực sự trả về một tuple với hai yếu tố. Cái đầu tiên phải là một đối tượng hình và cái còn lại phải là một nhóm các đối tượng con.

Vì vậy, hãy thử lại:

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2)

và kiểm tra loại:

type(fig) #<class 'matplotlib.figure.Figure'>
type(ax1) #<class 'matplotlib.axes._subplots.AxesSubplot'>

Tất nhiên, nếu bạn sử dụng các tham số là (nỏ = 1, ncols = 4), thì định dạng sẽ là:

fig, [ax1, ax2, ax3, ax4] = plt.subplots(nrows=1, ncols=4)

Vì vậy, chỉ cần nhớ giữ cho việc xây dựng danh sách giống như lưới ô phụ mà chúng ta đặt trong hình.

Hy vọng điều này sẽ hữu ích cho bạn.


2
đừng quên thêm plt.tight_layout () nếu các ô con của bạn có tiêu đề
gota

12
Điều gì nếu bạn có rất nhiều subplots? Làm theo cách này dễ hơn: fig, axes = plt.subplots(nrows=10, ncols=3)axes = axes.flatten(). Bây giờ bạn có thể tham khảo mỗi âm mưu phụ bởi chỉ số của nó: axes[0], axes[1], ...
Guillaume

Điều gì xảy ra nếu tôi muốn một trong những ô con đó trải dài trên nhiều cols hoặc hàng? nó có thể thực hiện được với lệnh subplots không?
gota

1
@BallpointBen Tôi không chắc chắn rằng nó hoạt động nếu nrows=1, khi đó axesđược trả lại bằng phẳng với chiều dài bằngncols
Ben

1
@BallpointBen Chỉ cần nhận ra bạn có thể khắc phục điều này bằng cách thực hiện:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Ben

15

Là một bổ sung cho câu hỏi và câu trả lời ở trên, cũng có một sự khác biệt quan trọng giữa plt.subplots()plt.subplot(), chú ý sự thiếu sót 's'ở cuối.

Người ta có thể sử dụng plt.subplots()để tạo tất cả các ô con của chúng cùng một lúc và nó trả về hình và trục (số nhiều của trục) của các ô con dưới dạng một tuple. Một hình có thể được hiểu là một bức tranh nơi bạn vẽ phác thảo của bạn.

# create a subplot with 2 rows and 1 columns
fig, ax = plt.subplots(2,1)

Trong khi đó, bạn có thể sử dụng plt.subplot()nếu bạn muốn thêm các ô con riêng biệt. Nó chỉ trả về trục của một subplot.

fig = plt.figure() # create the canvas for plotting
ax1 = plt.subplot(2,1,1) 
# (2,1,1) indicates total number of rows, columns, and figure number respectively
ax2 = plt.subplot(2,1,2)

Tuy nhiên, plt.subplots()được ưa thích vì nó cung cấp cho bạn các tùy chọn dễ dàng hơn để tùy chỉnh trực tiếp toàn bộ con số của bạn

# for example, sharing x-axis, y-axis for all subplots can be specified at once
fig, ax = plt.subplots(2,2, sharex=True, sharey=True)

Trục dùng chung trong khi đó, với plt.subplot(), người ta sẽ phải chỉ định riêng cho từng trục có thể trở nên cồng kềnh.


1
dòng mã của bạn ax3 = plt.subplot(2,1,3) sẽ không hoạt động vì nó là 2 trên 1, chỉ có 2 biểu đồ.
Đám mây Cho

1
cảm ơn, đã sửa nó Có một sự thay đổi cần thiết trong khối mã cuối cùng.
Light_B

3

Ngoài các câu trả lời ở trên, bạn có thể kiểm tra loại đối tượng sử dụng type(plt.subplots())trả về một tuple, mặt khác, type(plt.subplot())trả về matplotlib.axes._subplots.AxesSubplotmà bạn không thể giải nén.


4
Chào mừng bạn đến với Stack Overflow! Đây thực sự là một bình luận, không phải là một câu trả lời. Với một chút đại diện, bạn sẽ có thể gửi bình luận . Cảm ơn!
Miroslav Glamuzina
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.