Matplotlib에 두 번째 (새) 플롯을 만든 다음 나중에 이전 플롯을 만들도록 어떻게 지시합니까?


147

데이터를 플로팅 한 다음 새 그림 및 플롯 데이터 2를 만들고 마지막으로 다음과 같이 원래 플롯 및 플롯 데이터 3으로 돌아갑니다.

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

참고 matplotlib에 플롯이 완료되었음을 어떻게 알 수 있습니까? 비슷한 것을하지만 꽤하지 않습니다! 원래 음모에 액세스 할 수 없습니다.

답변:


152

이와 같은 일을 정기적으로 수행하는 경우 matplotlib에 대한 객체 지향 인터페이스를 조사하는 것이 좋습니다. 귀하의 경우 :

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

좀 더 장황하지만 특히 여러 개의 하위 그림이있는 여러 그림을 통해 추적하는 것이 훨씬 명확하고 쉽습니다.


2
나는 많은 숫자를 가질 것으로 예상 할 때 객체 지향 접근 방식을 선호합니다. 숫자가 아닌 이름을 사용하여 추적하는 것이 더 쉬울 것입니다. 감사!
피터 D

1
그러나이 방법으로 레이블과 축 제한을 어떻게 변경할 수 있습니까? 내가 사용 ax1.ylabel하면 찾을 수 없다고 말합니다. 와 같은 fig1.ylabel...
조지 Datseris

3
@GeorgeDatseris 구문은 약간 다릅니다. 그것은이다 ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label")하고 ax1.set_title("your title").
simonb

1
왜 111을 사용 했습니까?
Yash Sodha

2
@yashSodha-서브 플롯 수 (행, 열, 색인)의 MATLAB 스타일 사양입니다. 그러나 이제는 사용하기가 훨씬 쉽습니다 plt.subplots(nrows, ncols). 예제를 업데이트했습니다.
simonb 2016 년

120

을 호출 figure하면 플롯에 번호를 매기십시오.

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

편집 : 당신이 원하는대로 플롯 0의 번호를 매길 수는 있지만 (여기서부터 시작 ) 새로운 것을 만들 때 숫자를 전혀 제공하지 않으면 자동 번호 매기기는 1( "Matlab Style")에 따라 시작 됩니다 문서에).


3
이것은 matplotlib의 대화식 모드에서 작동하는 것처럼 보이지만 figure () ... add_subplot () 메소드는 작동하지 않습니다. 감사!
chbrown

@SebMa 이해하지 않고 코드를 변경하지 마십시오. 이 답변은에 번호를 전달하는 것에 관한 것이 었 figure습니다. 변경 한 다른 것은 원래 게시물에서 복사되었으며 내 대답에는 실수가 아닙니다.
agf

@agf 안녕하세요, 숫자가 자동으로 증가하여 필요하지 않다고 생각했기 때문에 1내부를 제거했습니다 plt.figure(1). 죄송합니다.
SebMa

18

그러나 번호는에서 시작 1하므로

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)

또한 서브 플로트와 같이 그림에 여러 개의 축이있는 경우 원하는 축 개체의 핸들 인 axes(h)where 명령을 사용하여 h해당 축에 초점을 맞 춥니 다.

(아직 댓글 권한이 없습니다. 새로운 답변에 대해 죄송합니다.)


10
0작품은, 자동 번호는 시작 1당신이 전혀 그것에게 번호를 알려하지 않는 경우.
agf

0

내가 고군분투 한 후에 찾은 한 가지 방법은 data_plot 행렬, 파일 이름 및 순서를 매개 변수로 가져 와서 지정된 그림에서 주어진 데이터에서 상자 그림을 생성하는 함수 (다른 순서 = 다른 그림)를 만들어 주어진 file_name 아래에 저장하는 함수를 만드는 것입니다.

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches='tight')
    plt.close()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.