2017-04-19 23 views
2

これは質問タイトルを明確にするためです。あなたは散布図を作成したいとの整数、の4つのリストを持っていると言う:Matplotlib:プロット内の値を使用せずに双軸y軸を追加する

a=[3,7,2,8,12,17] 
b=[9,4,11,7,6,3] 
c=[9,3,17,13,10,5] 
d=[5,1,1,14,5,8] 

ように、あなたはまた、すべてのリストに適用される単純化f(x)=1/x、のために、機能を持っている:

from __future__ import division 
a1=[1/i for i in a] 
b1=[1/i for i in b] 
c1=[1/i for i in c] 
d1=[1/i for i in d] 

私の質問:はどのように散布図ではA1、B1、C1、D1リストのいずれかを使用しなくても値が0.06から、1.0に機能範囲によって返されたことを知って、第2のY軸を追加するには?

私が言っていることは、伝統的な方法で次のような散布図を作成した場合、a1、b1、c1、d1の値に基づいて2番目のy軸を追加する方法プロット自体の中でそれら?

import matplotlib.pyplot as plt 
plt.scatter(a,b,c='red',label='reds') 
plt.scatter(c,d,c='blue',label='blues') 
plt.legend(loc='best') 

これは第2のY軸なしの散乱である: enter image description here

、これはこれまでに議論第2のY軸を含む同じもの、で構成されたバージョンである。 enter image description here

NB:この質問は、thisとは異なり、私はさまざまなスケールでプロットしようとしていません。私は関連する値で2番目の軸を追加したいだけです。

+0

が重複する可能性を質問/ 43149703 /第2Y軸の追加 - 第1Y軸の追加) – ImportanceOfBeingErnest

+0

あなたが画像に表示する右側の尺度は、使用する機能が1/xであり、値b1とd1をその軸にプロットすることで分かります。 – ImportanceOfBeingErnest

+0

しかし、私はa1、b1およびそのようなシリーズのいずれもプロットしたくありません。そのスケールはその意味を示すためだけに置かれていました。また、関数は単純な例に過ぎません。 – FaCoffee

答えて

3

必ず新しい軸上の数字はそれらの逆に対応する位置にあるようにするには:

import matplotlib.pylab as plt 

a=[3,7,2,8,12,17] 
b=[9,4,11,7,6,3] 
c=[9,3,17,13,10,5] 
d=[5,1,1,14,5,8] 

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

ax.scatter(a,b,c='red',label='reds') 
ax.scatter(c,d,c='blue',label='blues') 
ax.legend(loc='best') 
ax.set_ylabel('Y') 
# make shared y axis 
axi = ax.twinx() 
# set limits for shared axis 
axi.set_ylim(ax.get_ylim()) 
# set ticks for shared axis 
inverse_ticks = [] 
label_format = '%.3f' 
for tick in ax.get_yticks(): 
    if tick != 0: 
     tick = 1/tick 
    inverse_ticks.append(label_format % (tick,)) 
axi.set_yticklabels(inverse_ticks) 
axi.set_ylabel('1/Y') 
fig.tight_layout() 
fig.show() 

enter image description here

そして、あなたはまた、X軸のためにそれを行うことができます(http://stackoverflow.com/ [最初のy軸に関連する第2のY軸を追加する]の

# make shared x axis 
xaxi = ax.twiny() 
# set limits for shared axis 
xaxi.set_xlim(ax.get_xlim()) 
# set ticks for shared axis 
inverse_ticks = [] 
label_format = '%.3f' 
for tick in ax.get_xticks(): 
    if tick != 0: 
     tick = 1/tick 
    inverse_ticks.append(label_format % (tick,)) 
xaxi.set_xticklabels(inverse_ticks) 
xaxi.set_xlabel('1/X') 

enter image description here

+0

また、 '0'の値を探し出して、目盛ラベルの文字列値だけを変更して、' 'inf ''などのラベルを付けることもできます。 – berna1111

1

だけで共有y軸と設定された所望の制限を行い、ここのような新しい軸の目盛:

import matplotlib.pylab as plt 
import numpy as np 

a=[3,7,2,8,12,17] 
b=[9,4,11,7,6,3] 
c=[9,3,17,13,10,5] 
d=[5,1,1,14,5,8] 

plt.scatter(a,b,c='red',label='reds') 
plt.scatter(c,d,c='blue',label='blues') 
plt.legend(loc='best') 
ax = plt.gca() 
# make shared y axis 
ax2 = ax.twinx() 
# set limits for shared axis 
ax2.set_ylim([0,1]) 
# set ticks for shared axis 
plt.yticks(np.arange(0.06, 1, 0.14)) 
plt.show() 

enter image description here

+1

この解決法は、明らかに正しくありません。反転リストをプロットしてみてください。ポイントは重複しません! – ImportanceOfBeingErnest

関連する問題