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


91

한 번에 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()

답변:


17

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


201

에서 대답 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()

이 두 인수는 각각 페이지에 각 플롯 창을 올바르게 배치하기위한 완전한 사양입니다.

211 (다시 말하면 (2,1,1)은 플롯 창의 두 행 한 열 을의미하므로 3- 튜플 형식으로도 쓸 수 있습니다. 세 번째 숫자는 다른 서브 플롯 창에 상대적인 특정 서브 플롯 창의 순서를 지정합니다. -이 경우 이것은 첫 번째 플롯 (1 행에 배치)이므로 플롯 번호 1, 행 1 col 1입니다.

add_subplot 에 대한 두 번째 호출에 전달 된 인수 는 첫 번째와 후행 숫자 만 다릅니다 (이 플롯이 두 번째 플롯 (행 2, col 1)이기 때문에 1 대신 a 2).

더 많은 플롯이있는 예 : 대신 2x2 행렬 구성에서 한 페이지에 네 개의 플롯을 원하는 경우 add_subplot 메서드를 네 번 호출하여 다음 네 개의 인수 (221), (222), (223) 및 ( 224), 페이지에 각각 10, 2, 8, 4시에이 순서대로 4 개의 플롯을 생성합니다.

4 개의 인수 각각에는 2 x 2 구성을 인코딩하는 2 개의 선행 2가 포함되어 있습니다. 즉, 2 개의 행과 2 개의 열이 있습니다.

4 개의 인수 각각에서 세 번째 (가장 오른쪽) 숫자는 2 x 2 행렬 (즉, 행 1 열 1 (1), 행 1 열 2 (2), 행 2)에서 특정 플롯 창의 순서를 인코딩합니다. 열 1 (3), 행 2 열 2 (4).


1
add_subplot은 작은 수의 서브 플롯에 대해 단일 정수 인수를 사용할 수 있지만 9 개 이상의 서브 플롯이 필요하면 3 개의 개별 정수 인수를 사용하는 다른 답변의 버전을 사용해야합니다.
user1244215 aug

1
fig.add_axes(rect)대신 사용할 수 add_subplot있습니까?
Alcott 2013 년

15
PLT? 전에 사용되는 것을 본 적이
DARSHAN Chaudhary

3
여기에있는 첫 번째 단락은 실행 for i in range(16): plt.subplot(4, 4, i+1)하여 확인할 수 있고 구문 오류를 관찰 할 수 없기 때문에 명백히 사실이 아닙니다 . 아마도 OP가 원하는 것을했기 때문에 대답이 허용됩니다.
chthonicdaemon

3
이것은 좋은 해결책입니다. 그러나 하나의 변수를 사용하여 반복하려면 어떻게해야합니까?
Pengju Zhao

83

이 질문은 4 년 전의 질문이기 때문에 새로운 것이 구현되었고 그중에는 새로운 기능plt.subplots 는 매우 편리한 새로운 기능 이 있습니다 .

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

여기서 axesA는 numpy.ndarrayAxesSubplot 개체는 매우 편리 단지 배열 인덱스를 사용하여 다른 줄거리를 통과 할 수있게, [i,j].


matplotlib API 만 사용해야하는 경우에도 작동합니까 (사용할 수없고 다른 재미있는 것들로 인해)?
eudoxos jul.

2
예 @eudoxos, 그것은 당신이 수행되고 있는지 표시 할 필요없이, 예를 들어, 한 페이지에 여러 개의 그래픽을 인쇄하기 위해이 같은 줄거리를 만들 수 있어야
Saullo GP 카스트로를

12

이것은 또한 작동합니다 :

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

한 페이지에 총 19 개의 그래프를 표시합니다. 형식은 아래로 5 개, 가로로 4 개입니다.


4

@doug & FS.의 대답은 매우 좋은 솔루션입니다. 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()

데이터 프레임에 이름이 지정된 열이있는 경우 다음과 같이 사용해야합니다.for i,col in enumerate(df.columns):
drevicko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.