matplotlib에서 플롯, 축 또는 그림을 사용하여 플롯을 그리는 것의 차이점은 무엇입니까?


103

나는 matplotlib, tbh에서 플롯을 그릴 때 백엔드에서 무슨 일이 일어나는지 혼란 스럽습니다. 플롯, 축 및 그림의 계층 구조가 명확하지 않습니다. 문서를 읽고 도움이되었지만 여전히 혼란 스럽습니다 ...

아래 코드는 세 가지 다른 방법으로 동일한 플롯을 그립니다.

#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

이제 내 질문은-

  1. 세 가지 모두의 차이점은 무엇입니까?

  2. 어떤 방법을 사용해야하며 어떤 방법을 사용할 때의 장단점은 무엇입니까?


8
나는 이미 그것을 읽었지만 전혀 만족스러운 답을 찾지 못했습니다. 계층 구조를 설명하지만 왜 전통적인 방식이 없는지, 왜 피겨 오브젝트가 노출 된 이유는 무엇입니까?
hashcode55

이 정확한 문서 matplotlib.org/users/artists.html 을 참조했는지 확실하지 않습니다 . 이것은 그림이 노출되는 이유에 대한 귀하의 질문에 대한 답변입니다. 개인적으로 이것은 내가 찾은 matplotlib에 대한 최고의 설명입니다. Figure 개체를 사용하면 Figure 자체의 "패치"등을 조정하지 않는 한 거의 사용되지 않지만 축없이 직접 자신의 아티스트를 추가 할 수 있습니다. Figure는 상위 컨테이너이고 축 및 아티스트를 호스팅합니다.
하기 Sandeep

답변:


56

방법 1

plt.plot(x, y)

이렇게하면 (x, y) 좌표로 하나의 그림 만 그릴 수 있습니다. 하나의 그래픽 만 얻으려면이 방법을 사용할 수 있습니다.

방법 2

ax = plt.subplot()
ax.plot(x, y)

이렇게하면 동일한 창에 하나 또는 여러 그림을 그릴 수 있습니다. 당신이 그것을 쓸 때, 당신은 단지 하나의 그림을 그릴 것이지만, 다음과 같이 만들 수 있습니다 :

fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

ax1, ax2, ax3 및 ax4라는 이름의 그림 4 개를 각각 같은 창에 플로팅합니다. 이 창은 예를 들어 4 부분으로 나뉩니다.

방법 3

fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)

나는 그것을 사용하지 않았지만 문서를 찾을 수 있습니다.

예:

import numpy as np
import matplotlib.pyplot as plt

# Method 1 #

x = np.random.rand(10)
y = np.random.rand(10)

figure1 = plt.plot(x,y)

# Method 2 #

x1 = np.random.rand(10)
x2 = np.random.rand(10)
x3 = np.random.rand(10)
x4 = np.random.rand(10)
y1 = np.random.rand(10)
y2 = np.random.rand(10)
y3 = np.random.rand(10)
y4 = np.random.rand(10)

figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.plot(x3,y3)
ax4.plot(x4,y4)

plt.show()

여기에 이미지 설명 입력 여기에 이미지 설명 입력

다른 예 :

여기에 이미지 설명 입력


@ hashcode55 각 그림은 독립적입니다. 나는 당신에게 예를 보여줍니다
에 섹스

1
@ hashcode55 예를 들어 편집 할 것입니다 (천체 물리학에서 내 연구에서 얻은 수치, 스크립트가 너무 깁니다 (1300 줄).;) 각 수치는 독립적입니다.)
Essex

3
나는 이것이 까다 롭다는 것을 알고 있지만 matplotlib언어가 나에게 혼란 스러웠 기 때문에 그것을 하고있다. 그리고이 질문은 "matplotlib에서 축 대 그림"에 대해 검색 할 때 나타난다. 다른 멍청이에게는 이 질문 이 그 답을 찾는 데 도움 되었습니다. 여기 문구가 더 명확 할 수 있다고 생각 subplots()돌아갑니다 Axes단일의 개체를 figure.
Hendy dec

37

개체의 이름

Matplotlib는 강력한 객체 지향적이며 주요 객체는 그림축입니다 (이름 axes이 약간 오해의 소지가 있지만 아마도 나일 것입니다).

그림캔버스 로 생각할 수 있으며 , 일반적으로 치수 및 가능하면 배경색 등을 지정합니다. 캔버스, 그림 을 기본적으로 두 가지 방법으로 사용하여 다른 개체를 그 위에 배치합니다 (대부분 axes ,하지만 또한 텍스트 레이블 등) 및 savefig.

당신은 생각할 수있는 스위스 군용 칼의 종류, 그 제공하는 도구 (예를 들어, 편리한 객체로 .plot, .scatter, .hist모두를위한 등), 대부분. 다양한 방법 중 하나를 사용하여 Figure 안에 하나, 둘, ... 많은 축을 배치 할 수 있습니다 .

plt인터페이스

PLT 절차 인터페이스는 원래 MATLAB ™ 인터페이스를 모방하기 위해 개발하지만 주요 객체에 대한 직접 참조하지 않는 경우에도, 객체 지향 인터페이스에서 정말 다르지 않다되었다 (즉, 그림 )이 객체가 자동으로 인스턴스화되고 각 plt 메소드는 기본적으로 기본 기본 객체의 메소드 중 하나의 호출로 변환됩니다. 예를 들어 a plt.plot()는 a hidden_axes.plot이고 a plt.savefig는 a hidden_figure.savefig입니다.

매 순간에서 당신은 사용하여 이러한 숨겨진 개체에 대한 핸들을 가질 수 plt.gcfplt.gca, 및 객체 방법 중 하나가에 방법에 포팅되지 않은 경우이 필요한 경우가 PLT의 네임 스페이스.

plt 네임 스페이스에는 다른 방식으로 figureaxes 를 인스턴스화 할 수있는 여러 가지 편리한 메서드도 포함되어 있다는 것을 추가하고 싶습니다 .

귀하의 예

첫 번째 방법

plt.plot(x, y)

여기서는 plt 인터페이스 만 사용하고 , 각 Figure 에서 단일 축만 사용할 수 있지만 이것은 작업을 완료하는 빠른 레시피 인 데이터를 탐색 할 때 원하는 것입니다.

두 번째 방법

ax = plt.subplot()
ax.plot(x, y)

여기에서는 plt 네임 스페이스 의 편리한 메서드를 사용 하여 axes 객체에 이름 (및 핸들)을 제공 하지만 btw에는 숨겨진 figure도 있습니다. 나중에 axes 객체를 사용하여 플로팅, 히스토그램 만들기 등 plt 인터페이스로 수행 할 수있는 모든 작업을 수행 할 수 있지만 모든 속성에 액세스하여 더 자유롭게 수정할 수도 있습니다.

세 번째 방법

figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

여기서는 plt 네임 스페이스 의 편리한 메서드를 사용하여 Figure의 인스턴스화를 시작 하고 나중에 객체 지향 인터페이스 만 사용합니다.

plt 편의 방법 ( matplotlib.figure.Figure) 을 우회 할 수는 있지만 더 나은 상호 작용 경험을 위해 그림을 조정해야합니다 (결국 편의 방법입니다).

개인 추천

나는 벌거 벗은 제안 plt.plot, plt.scatter아마도 사용하여 대화 형 세션의 맥락에서 IPython을 그와 함께 %matplotlib탐색 적 Jupyter 노트북의 컨텍스트에서 마법 명령합니다.

반면에 객체 지향 접근 방식과 몇 가지 plt 편의 방법이 있습니다.

  • 세밀하게 조정 된 서브 플롯의 사용자 지정 배열로 한 번에 해결해야 할 영구적 인 문제가있는 경우
  • 작성한 프로그램의 UI에 Matplotlib를 포함하려면.

이 극단 사이에는 큰 회색 영역이 있습니다. 무엇을해야하는지 물어 보면 "상황에 따라 다름" 이라고 말하면됩니다 .


2
"이름 축이 약간 오해의 소지가 있다고 생각하지만 아마 나뿐 일 것입니다."-아니요, 나도 마찬가지입니다. 그래도 변경할 수 없습니다.
Laryx Decidua

1
사람들 이 서브 플롯을 원하지 않을fig, ax = plt.subplot() 때 관용구를 사용하는 이유를 이해할 수 없습니다 . 그런 경우 "절차 적"스타일이 더 쉽다는 것을 알았습니다. "하지만 아마
나일 뿐이야

@LaryxDecidua 즉시 두 가지 좋은 이유를 볼 수 있습니다. ① "명시적인 것이 암시적인 것보다 낫다"② 절차 적 API에서 사용할 수없는 Figure 또는 Axes의 메서드를 사용하려는 경우 —하지만 다른 방법이있을 수 있습니다…
gboffi

예, 1)을 완전히 구독합니다. Re 2) : 대부분의 경우 절차 적 API로 충분합니다. 하루가 끝나면 나는 그것이 개인적인 취향으로 귀결된다고 생각합니다-논쟁해서는 안되는 것 :-)
Laryx Decidua
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.