나는 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
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.gcf
와 plt.gca
, 및 객체 방법 중 하나가에 방법에 포팅되지 않은 경우이 필요한 경우가 PLT의 네임 스페이스.
plt 네임 스페이스에는 다른 방식으로 figure 및 axes 를 인스턴스화 할 수있는 여러 가지 편리한 메서드도 포함되어 있다는 것을 추가하고 싶습니다 .
귀하의 예
첫 번째 방법
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를 포함하려면.
이 극단 사이에는 큰 회색 영역이 있습니다. 무엇을해야하는지 물어 보면 “상황에 따라 다름” 이라고 말하면됩니다 .