2012-03-02 15 views
2

これで、matplotlibでさらに複雑なグラフが表示されています。次のプロットとコードで作業しようとしています。matplotlib - ベース指数と凡例が異なるセカンダリY軸

enter image description here

fig_base = pylab.figure() 
fig1 = fig_base.add_subplot(111) 
lns1 = fig1.plot(manXnames, Ynames, marker='s', color='g') 
lns2 = fig1.plot(Vt_X, Vt_Y, marker='^', color='r') 

# yticks on left 
locs,labels = yticks() 
pylab.yticks(locs, map(lambda x: "%g" % x, locs*1e3)) 

#axis labels  
pylab.xlabel('Temperature (C)') 
pylab.ylabel('Emitter Voltage (mV)', labelpad=20) 
pylab.xticks(rotation=45) 

fig2 = fig1.twinx() 
lns3 = fig2.plot(manXnames, Vterror, marker='o', linestyle='-') 

# xticks 
locs,labels = xticks() 
pylab.xticks(locs, map(lambda x: "%g" % x, locs)) 

# yticks on right 
locs,labels = yticks() 
pylab.yticks(locs, map(lambda x: "%g" % x, locs)) 

#2nd axis labels  
pylab.ylabel('Percentage Error %', labelpad=20) 
pylab.show() 

次のように私の二つの問題があります:

  1. 私は私が原因私は2つのY軸を持っているという事実のために、奇妙な方法で、ベース指数修飾を行っていると思います。二重軸プロットを行う良い方法はありますか?ちょうどそれを軸の.plotの直後に置くことでハッキングしたようです。
  2. 私は別々の軸を2つ持っているので、私は伝説を働かせることができません。

私は同様の質問が私のコードでhere

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import rc 
rc('mathtext', default='regular') 

time = np.arange(10) 
temp = np.random.random(10)*30 
Swdown = np.random.random(10)*100-10 
Rn = np.random.random(10)*100-10 

fig = plt.figure() 
ax = fig.add_subplot(111) 

lns1 = ax.plot(time, Swdown, '-', label = 'Swdown') 
lns2 = ax.plot(time, Rn, '-', label = 'Rn') 
ax2 = ax.twinx() 
lns3 = ax2.plot(time, temp, '-r', label = 'temp') 

lns = lns1+lns2+lns3 
labs = [l.get_label() for l in lns] 
ax.legend(lns, labs, loc=0) 

ax.grid() 
ax.set_xlabel("Time (h)") 
ax.set_ylabel(r"Radiation ($MJ\,m^{-2}\,d^{-1}$)") 
ax2.set_ylabel(r"Temperature ($^\circ$C)") 
ax2.set_ylim(0, 35) 
ax.set_ylim(-20,100) 
plt.show() 

から以下そこでLNSにお答えしようとしています。しかし、私がこのように走るたびに、ピラブはエラーを出さずにクラッシュします。

誰でも問題を解決できますか?

EDIT:これは私が言及したコードと同じであるmacduffの返信からコピーされたものと全く同じコードを使用したときに発生するエラーです。

In [16]: te.test() 

C:\Python27\lib\site-packages\matplotlib\legend.py:610: UserWarning: Legend does 
not support [<matplotlib.lines.Line2D object at 0x04F8D410>] 
Use proxy artist instead. 
http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist 
    warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp:/ 
/matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str 
(orig_handle),)) 
C:\Python27\lib\site-packages\matplotlib\legend.py:610: UserWarning: Legend does 
not support [<matplotlib.lines.Line2D object at 0x04F8D630>] 
Use proxy artist instead. 
http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist 
    warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp:/ 
/matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str 
(orig_handle),)) 
C:\Python27\lib\site-packages\matplotlib\legend.py:610: UserWarning: Legend does 
not support [<matplotlib.lines.Line2D object at 0x04FB4D90>] 
Use proxy artist instead. 
http://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist 
    warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp:/ 
/matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str 
(orig_handle),)) 

答えて

1

だから、あなたが伝説は、あなたが希望のように動作していないことに動揺しているようです。 私はあなたのルーチンを取るときにを省略したテストデータを追加し、 凡例を追加しても問題はありません。私はこれをまっすぐにするのを助けることができる方法を教えてください 。

import pylab 
from pylab import * 
import numpy as np 

manXnames = np.array(range(0,120)) 
Ynames = (8.3333333333333331e-05)*manXnames + 0.01 
Vt_X = manXnames 
Vt_Y = (12.0/1000.0)*np.exp(-0.01*(120-manXnames)) 
Vterror = Ynames + randn(size(Ynames)) 

fig_base = pylab.figure() 
fig1 = fig_base.add_subplot(111) 
lns1 = fig1.plot(manXnames, Ynames, marker='s', color='g',label='Plain Line') 
lns2 = fig1.plot(Vt_X, Vt_Y, marker='^', color='r',label='V_t') 

# yticks on left 
locs,labels = yticks() 
pylab.yticks(locs, map(lambda x: "%g" % x, locs*1e3)) 

#axis labels 
pylab.xlabel('Temperature (C)') 
pylab.ylabel('Emitter Voltage (mV)', labelpad=20) 
pylab.xticks(rotation=45) 

fig2 = fig1.twinx() 
lns3 = fig2.plot(manXnames, Vterror, marker='o', linestyle='-',label='V_terror') 

# xticks 
locs,labels = xticks() 
pylab.xticks(locs, map(lambda x: "%g" % x, locs)) 

# yticks on right 
locs,labels = yticks() 
pylab.yticks(locs, map(lambda x: "%g" % x, locs)) 

#2nd axis labels  
pylab.ylabel('Percentage Error %', labelpad=20) 

pylab.legend((lns1, lns2, lns3), ('Plain Line', 'V_t', 'V_t Error')) 
pylab.show() 

私の出力のプロットを後で追加します。

+0

私はこれを遵守し、動作しませんでした。伝説はちょうどその中に何もない小さな正方形として示されています。しかし、私はエラーの種類を取得していることに気づいた。元の質問を更新します。 –

+0

遅い応答が遅いですが、これは最終的には私が信じているラテックス文字とは無関係な何か問題でした。 –

0

伝説は関連の軸で窓のpython(私は* nixのか、OSX版ではないと思う?)です。私はmacduffのサンプルコードを使用すると、5月と同じエラーが発生します。

しかし、私が凡例を線の前にプロットすると、fig2 = fig1.twinx()pylab.show()の前に2つの凡例のボックスが表示され、コードが機能します。

したがって、各軸には独自の凡例(バグや機能はありますか?)があり、1つのプロットに3つのラベルを付けると面倒です。私はこの場合、legend()のパラメータを変更しようとしていると思います。つまり、(lns1, lns2, lns3), ('Plain Line', 'V_t', 'V_t Error')は配列の1行2列のタプルであり、ax2は1つのプロットを持ちます。したがって、リストの最初の項目はラベルテキストであり、2番目の項目は場所です。

以下は、「有効な」解決策です。テキストを同じボックスにしたいのであれば、2番目の軸と同じ色でビュー領域外の最初の軸にダミープロットを作成し、最初の凡例をプロットします(私はそのハックを知っています)。

import pylab 
from pylab import * 
import numpy as np 

manXnames = np.array(range(0,120)) 
Ynames = (8.3333333333333331e-05)*manXnames + 0.01 
Vt_X = manXnames 
Vt_Y = (12.0/1000.0)*np.exp(-0.01*(120-manXnames)) 
Vterror = Ynames + randn(size(Ynames)) 

fig_base = pylab.figure() 
fig1 = fig_base.add_subplot(111) 
lns1 = fig1.plot(manXnames, Ynames, marker='s', color='g',label='Plain Line') 
lns2 = fig1.plot(Vt_X, Vt_Y, marker='^', color='r',label='V_t') 

# yticks on left 
locs,labels = yticks() 
pylab.yticks(locs, map(lambda x: "%g" % x, locs*1e3)) 

#axis labels 
pylab.xlabel('Temperature (C)') 
pylab.ylabel('Emitter Voltage (mV)', labelpad=20) 
pylab.xticks(rotation=45) 

pylab.legend() 
fig2 = fig1.twinx() 
lns3 = fig2.plot(manXnames, Vterror, marker='o', linestyle='-',label='V_terror') 

# xticks 
locs,labels = xticks() 
pylab.xticks(locs, map(lambda x: "%g" % x, locs)) 

# yticks on right 
locs,labels = yticks() 
pylab.yticks(locs, map(lambda x: "%g" % x, locs)) 

#2nd axis labels  
pylab.ylabel('Percentage Error %', labelpad=20) 

pylab.legend(loc="lower right") 
pylab.show() 
0

使用タプル変換、エラーを回避し、1つの凡例にすべてのサブプロットを表示するには:

lns1 = tuple(fig1.plot(manXnames, Ynames, marker='s', color='g',label='Plain Line')) 
lns2 = tuple(fig1.plot(Vt_X, Vt_Y, marker='^', color='r',label='V_t')) 
fig2 = fig1.twinx() 
lns3 = tuple(fig2.plot(manXnames, Vterror, marker='o', linestyle='-',label='V_terror')) 
pylab.legend((lns1, lns2, lns3), ('Plain Line', 'V_t', 'V_t Error')) 
pylab.show() 

これは、Python 2.7.6でLinux上で私のために動作します。

関連する問題