많은 예제가 Matplotlib / pyplot / python에서`fig, ax = plt.subplots ()`를 사용하는 이유


266

나는 matplotlib예제를 연구 하여 사용법 을 배우고 있으며 많은 예제는 단일 플롯을 만들기 전에 다음과 같은 줄을 포함하는 것 같습니다 ...

fig, ax = plt.subplots()

여기 몇 가지 예가 있어요...

예제가 단일 차트를 작성하려고 시도 하더라도이 함수가 많이 사용되는 것을 볼 수 있습니다. 다른 장점이 있습니까? 공식 차트는 단일 차트를 만들 subplots()때도 사용 f, ax = subplots되며 그 이후의 도끼 만 참조합니다. 이것이 그들이 사용하는 코드입니다.

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

11
글쎄, 그것은 짧고 간결하며 한 단계로 그림과 축 모두에 대한 참조를 얻습니다. 그것은 아름답 기 때문에 pythonic입니다 :)
cel

답변:


324

plt.subplots()은 figure 및 axes 객체를 포함하는 튜플을 반환하는 함수입니다. 따라서 사용하는 경우 fig, ax = plt.subplots()이 변수에이 튜플을 풀고 fig하고 ax. 갖는 것은 fig당신이 이미지 파일로 그림 이상 (예와 변화를 그림 수준의 속성 또는 저장하려는 경우에 유용합니다 fig.savefig('yourfilename.png')). 확실히 반환 된 그림 객체를 사용할 필요는 없지만 많은 사람들이 나중에 그것을 사용하므로 일반적입니다. 또한 모든 좌표축 객체 (플로팅 방법이있는 객체)에는 어쨌든 부모 도형 객체가 있습니다.

fig, ax = plt.subplots()

이보다 더 간결합니다.

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

8
아주 좋은 설명입니다. 여기에 문서입니다 - matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7은

2
서브 플롯에서 항상 111을 매개 변수로 사용하는 이유는 무엇입니까?
Priyansh

@Priyansh는 Matlab 구문에서 상속
되었으므로

@Priyansh 항상 그런 것은 아닙니다. 4 개의 그래프를 원한다면 (또는 각각 222, 223, 224) ax11, ax12, ax21, ax22를 사용하여 가질 수 있습니다 fig.add_subplot(221).
Guimoute

49

여기에 보충제.

다음 질문은 그림에서 더 많은 하위 그림을 원한다면 어떻게해야합니까?

Doc에서 언급했듯이 fig = plt.subplots(nrows=2, ncols=2)하나의 Figure 객체에서 grid (2,2)를 사용 하여 서브 플로트 그룹을 설정하는 데 사용할 수 있습니다 .

우리가 알고 있듯이, fig, ax = plt.subplots()반환은 튜플을 반환합니다 fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2). 먼저 시도해 봅시다 .

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

오류가 발생하지만 걱정할 필요가 없습니다. 이제 plt.subplots()실제로 두 요소가 포함 된 튜플을 반환 한다는 것을 알 수 있습니다. 첫 번째 개체는 그림 개체 여야하고 다른 하나는 하위 그림 개체 그룹이어야합니다.

다시 시도해 봅시다.

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

유형을 확인하십시오.

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

물론 매개 변수를 (nrows = 1, ncols = 4)로 사용하는 경우 형식은 다음과 같아야합니다.

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

따라서리스트 구성을 그림에서 설정 한 서브 플로트 그리드와 동일하게 유지하십시오.

이것이 당신에게 도움이되기를 바랍니다.


2
서브 플롯에 제목이있는 경우 plt.tight_layout ()을 추가하는 것을 잊지 마십시오
gota

12
하위 플로트가 많으면 어떻게 되나요? 그것은이 방법을보다 쉽게 : fig, axes = plt.subplots(nrows=10, ncols=3)axes = axes.flatten(). 지금 당신은 인덱스에 의해 각각의 부가 적 줄거리를 참조 할 수 있습니다 : axes[0], axes[1], ...
기욤

이러한 하위 플로트 중 하나가 여러 열 또는 행으로 확장되도록하려면 어떻게합니까? subplots 명령으로 가능합니까?
놓으신

1
@BallpointBen 나는 nrows=1다음 axes과 같은 길이로 평평하게 반환되면ncols
Ben

1
@BallpointBen 다음을 수행하여이 문제를 해결할 수 있음을 깨달았습니다.fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Ben

15

질문에 대한 답변 위의 보충 교재로도 사이에는 중요한 차이가 plt.subplots()하고 plt.subplot(), 누락 된주의 사항 's'끝.

plt.subplots()모든 서브 플롯을 한 번에 만드는 데 사용할 수 있으며 서브 플롯의 그림과 축 (복수 축)을 튜플로 반환합니다. 그림은 스케치를 그리는 캔버스로 이해 될 수 있습니다.

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

반면 plt.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)

그러나 plt.subplots()전체 그림을 직접 사용자 정의하는 더 쉬운 옵션을 제공하기 때문에 선호됩니다.

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

공유 축 그러나을 사용하면 plt.subplot()번거로울 수있는 각 축마다 개별적으로 지정해야합니다.


1
코드 라인 ax3 = plt.subplot(2,1,3) 은 2x1이므로 2 개의 그래프 만 있기 때문에 작동하지 않습니다.
Cloud Cho

1
고마워요 마지막 코드 블록에서 또 다른 변경이 필요했습니다.
Light_B

3

위의 답변 외에도 type(plt.subplots())튜플을 반환하고 압축을 풀 수없는 type(plt.subplot())반환 matplotlib.axes._subplots.AxesSubplot을 사용하여 객체 유형 을 확인할 수 있습니다.


4
스택 오버플로에 오신 것을 환영합니다! 이것은 실제로 의견이 아니라 답변입니다. 조금 더 많은 담당자와 의견을 게시 할 수 있습니다 . 감사!
Miroslav Glamuzina
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.