2017-03-08 3 views
2

두 개의 y 축이있는 그림을 만들고 각 축에 다른 기능의 여러 점에서 여러 점을 추가하고 싶습니다. 두 번째 기능에 나는 이미 만들어진 축 각각에 곡선을 추가 할 지금matplotlib : 기존 twinx() 축의 핸들을 얻는 방법?

import matplotlib.pyplot as plt 
    from numpy import * 

    # Opens new figure with two axes 
    def function1(): 
      f = plt.figure(1) 
      ax1 = plt.subplot(211) 
      ax2 = ax1.twinx() 

      x = linspace(0,2*pi,100) 
      ax1.plot(x,sin(x),'b') 
      ax2.plot(x,1000*cos(x),'g') 

    # other stuff will be shown in subplot 212... 

: 제 1 기능에서

, 나는 그림을 만들

def function2(): 
      # Get handles of figure, which is already open 
      f = plt.figure(1) 
      ax3 = plt.subplot(211).axes # get handle to 1st axis 
      ax4 = ax3.twinx()   # get handle to 2nd axis (wrong?) 

      # Add new curves 
      x = linspace(0,2*pi,100) 
      ax3.plot(x,sin(2*x),'m') 
      ax4.plot(x,1000*cos(2*x),'r') 

을 지금 내 문제는 첫 번째 코드 블록에 추가 된 녹색 커브가 두 번째 블록이 실행 된 후에 더 이상 보이지 않는다는 것입니다 (나머지는 모두).

나는 이것에 대한 이유는 내 두 번째 코드 블록의 라인

ax4 = ax3.twinx() 

생각합니다. 아마도 기존 핸들 핸들을 반환하는 대신 새로운 twinx()를 생성합니다.

플롯에서 이미 존재하는 트윈 축에 대한 핸들을 올바르게 얻으려면 어떻게해야합니까?

+0

그림에서 재연성하려고 시도하는 대신 첫 번째 기능에서 생성 된 축을 저장하고 두 번째 기능에서 사용하지 않는 이유는 무엇입니까? – pingul

답변

0

가장 깨끗한 방법은 함수 외부에 축을 만드는 것입니다. 그런 다음 원하는 축을 함수에 제공 할 수 있습니다.

import matplotlib.pyplot as plt 
import numpy as np 

def function1(ax1, ax2): 
    x = np.linspace(0,2*np.pi,100) 
    ax1.plot(x,np.sin(x),'b') 
    ax2.plot(x,1000*np.cos(x),'g') 

def function2(ax1, ax2): 
    x = np.linspace(0,2*np.pi,100) 
    ax1.plot(x,np.sin(2*x),'m') 
    ax2.plot(x,1000*np.cos(2*x),'r') 

fig, (ax, bx) = plt.subplots(nrows=2) 
axtwin = ax.twinx() 

function1(ax, axtwin) 
function2(ax, axtwin) 

plt.show() 
+0

감사합니다. 바로이 솔루션이 더 깨끗합니다. – rmnboss

관련 문제