2017-03-08 16 views
2

私は、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... 

:最初の関数で

は、私はフィギュアを作成

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') 

を今私問題は、第1のコードブロックに追加された緑色のカーブは、第2のブロックが実行された後では見えなくなっていることである(他はすべてそうである)。

私はこの理由は、私の2番目のコードブロック内

ax4 = ax3.twinx() 

ラインだと思います。おそらく、既存のものにハンドルを返す代わりに新しいtwinx()を作成します。

プロット内の既存のツイン軸に対するハンドルを正しく取得するにはどうすればよいですか?

+0

第1の関数で作成された軸を保存し、第2の軸で使用するのはなぜですか? – 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

関連する問題