Làm thế nào để tôi có được nhiều subplots trong matplotlib?


156

Tôi hơi bối rối về cách thức hoạt động của mã này:

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()

Làm thế nào để con số, trục làm việc trong trường hợp này? Nó làm gì?

Ngoài ra tại sao điều này sẽ không làm việc tương tự:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

1
Kể từ matplotlib 2.1, mã thứ hai hoạt động .
Nghịch lý Fermi

Câu trả lời:


210

Có một số cách để làm điều đó. Các subplotsphương pháp tạo hình cùng với các ô phụ mà sau đó được lưu trữ trong axmảng. Ví dụ:

import matplotlib.pyplot as plt

x = range(10)
y = range(10)

fig, ax = plt.subplots(nrows=2, ncols=2)

for row in ax:
    for col in row:
        col.plot(x, y)

plt.show()

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

Tuy nhiên, một cái gì đó như thế này cũng sẽ hoạt động, nó không "sạch" như vậy vì bạn đang tạo một hình với các ô con và sau đó thêm vào đầu chúng:

fig = plt.figure()

plt.subplot(2, 2, 1)
plt.plot(x, y)

plt.subplot(2, 2, 2)
plt.plot(x, y)

plt.subplot(2, 2, 3)
plt.plot(x, y)

plt.subplot(2, 2, 4)
plt.plot(x, y)

plt.show()

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


4
Thay vì plot(x, y)tôi có âm mưu của tôi đến từ một hàm do người dùng xác định, nó tạo ra một biểu đồ với networkx. Làm thế nào để sử dụng nó?
Sigur

Có thể tạo ra nhiều ô con mà không cần vòng lặp for không? Ví dụ: một số giải pháp véc tơ để vẽ nhiều cột dữ liệu trên các ô riêng biệt? Điều này rất đơn giản với ggplot trong R, nhưng dường như là không thể với Python.
dùng2739472

3
bạn có thể giảm hai vòng lặp thành một axn = ax.flatten()và sau đó for axes in axn: axes.plot(x,y)
wander95

@ wander95 CẢM ƠN BẠN câu trả lời này không hoạt động cho col = 1 hoặc hàng = 1 mà không có bạn
Gulzar

48
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

ax[0, 0].plot(range(10), 'r') #row=0, col=0
ax[1, 0].plot(range(10), 'b') #row=1, col=0
ax[0, 1].plot(range(10), 'g') #row=0, col=1
ax[1, 1].plot(range(10), 'k') #row=1, col=1
plt.show()

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


1
Tôi nhận được những gì axlà, nhưng không phải là những gì fig. Họ là ai?
Leevo

3
ax thực sự là một mảng numpy. fig là matplotlib.figure.Figurelớp thông qua đó bạn có thể thực hiện nhiều thao tác với hình vẽ. ví dụ: bạn có thể thêm thanh màu vào ô phụ cụ thể, bạn có thể thay đổi màu nền phía sau tất cả các ô phụ. bạn có thể sửa đổi bố cục của các ô con này hoặc thêm một cái rìu nhỏ mới vào chúng. tốt nhất là bạn có thể muốn một tiêu đề chính duy nhất cho tất cả các ô con có thể thu được thông qua fig.suptitle(title)phương thức. cuối cùng một khi bạn hài lòng với cốt truyện, bạn có thể lưu nó bằng fig.savefigphương thức. @Leevo
Khalil Al Hooti

21
  • Bạn cũng có thể giải nén các trục trong cuộc gọi subplots

  • Và đặt xem bạn có muốn chia sẻ trục x và y giữa các ô con không

Như thế này:

import matplotlib.pyplot as plt
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax1.plot(range(10), 'r')
ax2.plot(range(10), 'b')
ax3.plot(range(10), 'g')
ax4.plot(range(10), 'k')
plt.show()

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


14

Bạn có thể quan tâm đến thực tế là kể từ phiên bản matplotlib 2.1, mã thứ hai từ câu hỏi cũng hoạt động tốt.

Từ nhật ký thay đổi :

Lớp hình bây giờ có phương thức subplots Lớp hình bây giờ có một phương thức subplots () hoạt động giống như pyplot.subplots () nhưng trên một hình hiện có.

Thí dụ:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

plt.show()

Tôi nhận được: AttributionError TracBack (cuộc gọi gần đây nhất) <ipython-input-168-ed25aa5255fa> trong <module> () 2 3 fig = plt.figure () ----> 4 axes = fig.subplots (nrows = 2 , ncols = 2) AttributionError: 'Đối tượng' Hình 'không có thuộc tính' subplots '
Ludo Schmidt

1
@LudoSchmidt Câu trả lời cho biết "kể từ phiên bản matplotlib 2.1 ..."
ImportanceOfByingErnest

11

đọc tài liệu: matplotlib.pyplot.subplots

pyplot.subplots()trả về một tuple fig, axđược giải nén trong hai biến bằng cách sử dụng ký hiệu

fig, axes = plt.subplots(nrows=2, ncols=2)

mật mã

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

không hoạt động vì subplots()là một chức năng pyplotkhông phải là thành viên của đối tượng Figure.

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.