matplotlib에서 여러 하위 플롯을 얻는 방법은 무엇입니까?


156

이 코드의 작동 방식에 대해 약간 혼란스러워합니다.

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

이 경우 무화과 축은 어떻게 작동합니까? 무엇을합니까?

또한 왜이 작업이 같은 일을하지 않습니까?

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

1
matplotlib 2.1부터 두 번째 코드가 작동합니다 .
페르미 역설

답변:


210

여러 가지 방법이 있습니다. 이 subplots방법은 하위 그림과 함께 그림을 만든 다음 ax배열에 저장합니다 . 예를 들면 다음과 같습니다.

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

여기에 이미지 설명을 입력하십시오

그러나 이런 식으로도 효과가있을 것입니다. 서브 플롯으로 그림을 만든 다음 그 위에 추가하기 때문에 "깨끗하지 않습니다".

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

여기에 이미지 설명을 입력하십시오


4
대신 plot(x, y)사용자 정의 함수에서 플롯을 가져 와서 networkx로 그래프를 만듭니다. 사용 방법?
Sigur

for-loop없이 여러 서브 플롯을 생성 할 수 있습니까? 예를 들어 별도의 플롯에 여러 데이터 열을 플로팅하는 벡터화 솔루션? 이것은 R의 ggplot에서 매우 간단하지만 Python에서는 불가능한 것 같습니다.
user2739472

3
당신은 하나에 루프에 대한 두 가지를 줄일 수 있습니다 axn = ax.flatten()다음 for axes in axn: axes.plot(x,y)
wander95

@ wander95 감사합니다.이 답변은 col = 1 또는 행 = 1에는 작동하지 않습니다
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()

여기에 이미지 설명을 입력하십시오


1
나는 무엇을 얻지 만 무엇을 얻지 ax는 못합니다 fig. 그들은 무엇인가?
Leevo

3
ax는 실제로 numpy 배열입니다. fig는 matplotlib.figure.Figure플롯 된 그림을 많이 조작 할 수있는 클래스입니다. 예를 들어 특정 서브 플롯에 컬러 바를 추가하고 모든 서브 플롯 뒤의 배경색을 변경할 수 있습니다. 이 서브 플롯의 레이아웃을 수정하거나 새로운 작은 도끼를 추가 할 수 있습니다. 바람직하게는 방법을 통해 얻을 수있는 모든 서브 플롯에 대해 하나의 메인 타이틀을 원할 수 있습니다 fig.suptitle(title). 마지막으로 플롯에 만족하면 fig.savefig방법 을 사용하여 저장할 수 있습니다 . @Leevo
Khalil Al Hooti 9

21
  • 서브 플롯 호출에서 축을 언팩 할 수도 있습니다

  • 그리고 서브 플로트간에 x 및 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()

여기에 이미지 설명을 입력하십시오


14

matplotlib 버전 2.1부터 질문의 두 번째 코드도 잘 작동한다는 사실에 관심이있을 수 있습니다.

로부터 변경 로그 :

이제 Figure 클래스에 서브 플로트 메소드가 있음 이제 Figure 클래스에 pyplot.subplots ()와 동일하지만 기존 Figure에서 동작하는 subplots () 메소드가 있습니다.

예:

import matplotlib.pyplot as plt

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

plt.show()

내가 얻는 : AttributeError Traceback (가장 최근 호출) <모듈> ()의 <ipython-input-168-ed25aa5255fa> 2 3 fig = plt.figure () ----> 4 axes = fig.subplots (nrows = 2 , ncols = 2) AttributeError : 'Figure'객체에 'subplots'속성이 없습니다
Ludo Schmidt

1
@LudoSchmidt 대답은 "matplotlib 버전 2.1 현재"라고 말합니다
ImportanceOfBeingErnest

11

matplotlib.pyplot.subplots 문서를 읽으십시오.

pyplot.subplots()fig, ax표기법을 사용하여 두 변수로 압축이 풀린 튜플 을 반환합니다.

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

코드

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

개체의 멤버가 아닌 subplots()함수 이기 때문에 작동하지 않습니다 .pyplotFigure

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.