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

나는 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. 어떤 방법을 사용해야하며 어떤 방법을 사용할 때의 장단점은 무엇입니까?



답변

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

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

다른 예 :

여기에 이미지 설명 입력


답변

개체의 이름

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를 포함하려면.

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


답변