Program Tip

matplotlib를 사용하여 한 페이지에 여러 플롯을 만드는 방법은 무엇입니까?

programtip 2020. 10. 8. 18:49
반응형

matplotlib를 사용하여 한 페이지에 여러 플롯을 만드는 방법은 무엇입니까?


한 번에 16 개의 숫자를 여는 코드를 작성했습니다. 현재 그들은 모두 별도의 그래프로 열립니다. 같은 페이지에서 모두 열었 으면합니다. 같은 그래프가 아닙니다. 단일 페이지 / 창에 16 개의 개별 그래프를 원합니다. 또한 어떤 이유로 numbins 및 defaultreallimits의 형식이 그림 1 이전을 유지하지 않습니다. subplot 명령을 사용해야합니까? 왜해야하는지 이해가 안되지만 다른 방법을 알아낼 수 없습니까?

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()

주요 질문에 답하려면 subplot 명령 을 사용하려고합니다 . 로 변경 plt.figure(i)하면 효과 plt.subplot(4,4,i+1)있다고 생각 합니다.


에서 대답 las3rjock , 코드가 실행되지 않으며, 유효하기 matplotlib 구문입니다 - 어떻게 든 OP에 의해 허용 대답은, 잘못 그 대답은 실행 가능한 코드를 제공하지 않으며 OP의 문제를 해결하기 위해 OP가 자체 코드를 작성하는 데 유용하다고 생각할 수있는 정보 나 제안이 없습니다.

받아 들여진 답변이고 이미 여러 개의 찬성 투표를 받았다는 점을 감안할 때 약간의 해체가 필요하다고 생각합니다.

첫째, 서브 플롯을 호출 해도 여러 개의 플롯이 제공 되지 않습니다 . subplot 은 단일 플롯을 생성하고 여러 플롯을 생성하기 위해 호출됩니다. 또한 "plt.figure (i) 변경"은 올바르지 않습니다.

plt.figure () (여기서 plt 또는 PLT는 일반적으로 matplotlib의 pyplot 라이브러리를 가져오고 전역 변수, plt 또는 때로는 PLT로 리 바인드합니다.

from matplotlib import pyplot as PLT

fig = PLT.figure()

바로 위의 줄은 matplotlib Figure 인스턴스를 만듭니다. 그런 다음 이 객체의 add_subplot 메서드가 모든 플로팅 창에 대해 호출됩니다 (비공식적으로 단일 서브 플롯을 구성하는 x 및 y 축을 생각해보십시오). 다음과 같이 생성합니다 (페이지에서 하나만 또는 여러 개).

fig.add_subplot(111)

이 구문은 다음과 같습니다.

fig.add_subplot(1,1,1)

당신에게 의미있는 것을 선택하십시오.

아래에는 한 페이지에 두 개의 플롯을 표시하는 코드가 나열되어 있습니다. 형식은 add_subplot에 전달 된 인수를 통해 수행됩니다 . 인수는 첫 번째 플롯의 경우 ( 211 )이고 두 번째 플롯의 경우 ( 212 )입니다.

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()

Each of these two arguments is a complete specification for correctly placing the respective plot windows on the page.

211 (which again, could also be written in 3-tuple form as (2,1,1) means two rows and one column of plot windows; the third digit specifies the ordering of that particular subplot window relative to the other subplot windows--in this case, this is the first plot (which places it on row 1) hence plot number 1, row 1 col 1.

The argument passed to the second call to add_subplot, differs from the first only by the trailing digit (a 2 instead of a 1, because this plot is the second plot (row 2, col 1).

An example with more plots: if instead you wanted four plots on a page, in a 2x2 matrix configuration, you would call the add_subplot method four times, passing in these four arguments (221), (222), (223), and (224), to create four plots on a page at 10, 2, 8, and 4 o'clock, respectively and in this order.

Notice that each of the four arguments contains two leadings 2's--that encodes the 2 x 2 configuration, ie, two rows and two columns.

The third (right-most) digit in each of the four arguments encodes the ordering of that particular plot window in the 2 x 2 matrix--ie, row 1 col 1 (1), row 1 col 2 (2), row 2 col 1 (3), row 2 col 2 (4).


Since this question is from 4 years ago new things have been implemented and among them there is a new function plt.subplots which is very convenient:

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

where axes is a numpy.ndarray of AxesSubplot objects, making it very convenient to go through the different subplots just using array indices [i,j].


This works also:

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

It plots 19 total graphs on one page. The format is 5 down and 4 across..


@doug & FS.'s answer are very good solutions. I want to share the solution for iteration on 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()

참고URL : https://stackoverflow.com/questions/1358977/how-to-make-several-plots-on-a-single-page-using-matplotlib

반응형