Làm thế nào để tạo một số âm mưu trên một trang duy nhất bằng cách sử dụng matplotlib?


92

Tôi đã viết mã mở 16 hình cùng một lúc. Hiện tại chúng đều mở dưới dạng đồ thị riêng biệt. Tôi muốn họ mở tất cả trên cùng một trang. Không cùng một đồ thị. Tôi muốn có 16 đồ thị riêng biệt trên một trang / cửa sổ. Cũng vì lý do nào đó mà định dạng của numbins và defaultreallimits không giữ nguyên hình 1. Tôi có cần sử dụng lệnh subplot không? Tôi không hiểu tại sao mình lại phải làm như vậy nhưng không thể hiểu được mình sẽ làm gì khác?

import csv
import scipy.stats
import numpy
import matplotlib.pyplot as plt

for i in range(16):
    plt.figure(i)
    filename= easygui.fileopenbox(msg='Pdf distance 90m contour', title='select file', filetypes=['*.csv'], default='X:\\herring_schools\\')
    alt_file=open(filename)    
    a=[]
    for row in csv.DictReader(alt_file):
        a.append(row['Dist_90m(nmi)'])
    y= numpy.array(a, float)    
    relpdf=scipy.stats.relfreq(y, numbins=7, defaultreallimits=(-10,60))
    bins = numpy.arange(-10,60,10)
    print numpy.sum(relpdf[0])
    print bins
    patches=plt.bar(bins,relpdf[0], width=10, facecolor='black')
    titlename= easygui.enterbox(msg='write graph title', title='', default='', strip=True, image=None, root=None)
    plt.title(titlename)
    plt.ylabel('Probability Density Function')
    plt.xlabel('Distance from 90m Contour Line(nm)')
    plt.ylim([0,1])

plt.show()

Câu trả lời:


17

Để trả lời câu hỏi chính của bạn, bạn muốn sử dụng lệnh subplot . Tôi nghĩ thay đổi plt.figure(i)thành plt.subplot(4,4,i+1)nên làm việc.


202

Câu trả lời từ las3rjock , bằng cách nào đó là câu trả lời được OP chấp nhận, là không chính xác - mã không chạy, cũng không phải là cú pháp matplotlib hợp lệ; câu trả lời đó không cung cấp mã chạy được và thiếu bất kỳ thông tin hoặc gợi ý nào mà OP có thể thấy hữu ích trong việc viết mã của riêng họ để giải quyết vấn đề trong OP.

Cho rằng đó là câu trả lời được chấp nhận và đã nhận được nhiều phiếu ủng hộ, tôi cho rằng có một chút giải cấu trúc.

Thứ nhất, gọi âm mưu phụ nào không cung cấp cho bạn nhiều lô; subplot được gọi để tạo một ô duy nhất, cũng như để tạo nhiều ô. Ngoài ra, "thay đổi plt.figure (i)" là không đúng.

plt.figure () (trong đó plt hoặc PLT thường là thư viện pyplot của matplotlib được nhập và phục hồi dưới dạng biến toàn cục, plt hoặc đôi khi là PLT, như vậy:

from matplotlib import pyplot as PLT

fig = PLT.figure()

dòng ngay trên tạo ra một trường hợp hình matplotlib; Phương thức add_subplot của đối tượng này sau đó được gọi cho mọi cửa sổ vẽ biểu đồ (không chính thức hãy nghĩ về trục x & y bao gồm một ô con duy nhất). Bạn tạo (cho dù chỉ một hay nhiều trên một trang), như vậy

fig.add_subplot(111)

cú pháp này tương đương với

fig.add_subplot(1,1,1)

chọn một trong những ý nghĩa đối với bạn.

Dưới đây tôi đã liệt kê mã để vẽ hai ô trên một trang, một bên trên trang kia. Việc định dạng được thực hiện thông qua đối số được truyền vào add_subplot . Lưu ý đối số là ( 211 ) cho âm mưu đầu tiên và ( 212 ) cho âm mưu thứ hai.

from matplotlib import pyplot as PLT

fig = PLT.figure()

ax1 = fig.add_subplot(211)
ax1.plot([(1, 2), (3, 4)], [(4, 3), (2, 3)])

ax2 = fig.add_subplot(212)
ax2.plot([(7, 2), (5, 3)], [(1, 6), (9, 5)])

PLT.show()

Mỗi đối số trong số hai đối số này là một thông số kỹ thuật hoàn chỉnh để đặt đúng các cửa sổ âm mưu tương ứng trên trang.

211 (một lần nữa, cũng có thể được viết ở dạng 3 bộ như (2,1,1) có nghĩa là hai hàng một cột của cửa sổ ô; chữ số thứ ba chỉ định thứ tự của cửa sổ ô con cụ thể đó so với các cửa sổ ô con khác- -trong trường hợp này, đây là ô đầu tiên (đặt nó trên hàng 1) do đó ô số 1, hàng 1 cột 1.

Đối số được truyền cho lệnh gọi thứ hai tới add_subplot , khác với đối số đầu tiên chỉ bởi chữ số ở cuối (số 2 thay vì số 1, vì biểu đồ này là ô thứ hai (hàng 2, cột 1).

Một ví dụ với nhiều ô hơn: nếu thay vào đó bạn muốn bốn ô trên một trang, trong cấu hình ma trận 2x2, bạn sẽ gọi phương thức add_subplot bốn lần, chuyển bốn đối số sau (221), (222), (223) và ( 224), để tạo bốn ô trên một trang ở các vị trí 10, 2, 8 và 4 giờ, theo thứ tự này.

Lưu ý rằng mỗi đối số trong số bốn đối số chứa hai dẫn đầu 2 - mã hóa cấu hình 2 x 2, tức là hai hàng và hai cột.

Chữ số thứ ba (ngoài cùng bên phải) trong mỗi bốn đối số mã hóa thứ tự của cửa sổ biểu đồ cụ thể đó trong ma trận 2 x 2 - tức là hàng 1 ô 1 (1), hàng 1 ô 2 (2), hàng 2 col 1 (3), hàng 2 col 2 (4).


1
add_subplot có thể lấy một đối số nguyên duy nhất cho một số lượng nhỏ các ô con, nhưng khi bạn cần nhiều hơn 9 ô con, bạn nên sử dụng phiên bản từ các câu trả lời khác lấy 3 đối số nguyên riêng biệt.
user1244215

1
tôi có thể sử dụng fig.add_axes(rect)thay vì add_subplot?
Alcott

16
PLT? Chưa bao giờ thấy được sử dụng trước đó
Darshan Chaudhary

3
Đoạn đầu tiên của bạn ở đây không đúng sự thật một cách đáng kể, vì bạn có thể xác minh bằng cách chạy for i in range(16): plt.subplot(4, 4, i+1)và không thấy lỗi cú pháp. Câu trả lời được chấp nhận vì nó có thể đã làm những gì OP muốn.
chthonicdaemon

3
Đây là một giải pháp tốt. Nhưng nếu tôi muốn sử dụng một biến để lặp thì phải làm thế nào?
Pengju Zhao,

83

Vì câu hỏi này là từ 4 năm trước, những thứ mới đã được thực hiện và trong số đó có một chức năng mới plt.subplotsrất tiện lợi :

fig, axes = plot.subplots(nrows=2, ncols=3, sharex=True, sharey=True)

đâu axeslà một numpy.ndarraytrong các đối tượng AxesSubplot, làm cho nó rất thuận tiện để đi qua các khe con khác nhau chỉ bằng cách sử dụng các chỉ số mảng [i,j].


Điều này cũng hoạt động đối với các trường hợp tôi chỉ cần sử dụng API matplotlib (do hiển thị không khả dụng và những điều thú vị khác)?
eudoxos

2
@eudoxos có, nó cần, bạn có thể tạo ra các ô phụ như thế này để in nhiều đồ họa trong một trang, ví dụ, mà không cần phải hiển thị những gì đang được thực hiện
Saullo GP Castro

12

Điều này cũng hoạt động:

for i in range(19):
    plt.subplot(5,4,i+1) 

Nó vẽ tổng số 19 đồ thị trên một trang. Định dạng là 5 xuống và 4 ngang ..


4

Câu trả lời của @doug & FS. là những giải pháp rất tốt. Tôi muốn chia sẻ giải pháp lặp lại trên pandas.dataframe.

import pandas as pd
df=pd.DataFrame([[1, 2], [3, 4], [4, 3], [2, 3]])
fig = plt.figure(figsize=(14,8))
for i in df.columns:
    ax=plt.subplot(2,1,i+1) 
    df[[i]].plot(ax=ax)
    print(i)
plt.show()

Nếu bạn khung dữ liệu đã được đặt tên cột, bạn sẽ cần phải sử dụng một cái gì đó giống nhưfor i,col in enumerate(df.columns):
drevicko
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.