2017-03-26 6 views
0

私は4セットのランダムな正規分布した数字を持っています。この手段は、各セットの95%信頼区間をエラーバーでプロットした棒グラフをプロットするために使用されます。インタラクティブスライダーバーチャートの色コントロール

与えられた4つの範囲に対応するバーに4つの異なる色が設定されます。yは: です。 2.上限までの平均; 3.下より低い。上の上4.。私はyの値を制御し、バーの色私がスライドするたびに更新するために、スライダーを使用したい

は、私は次のコードを使用しようとしたが、棒グラフは、すべてのアップデートをプロットすることはできません。

誰かが私にいくつかのアイデアを与えるだろうか?

import matplotlib.pyplot as plt 
import pandas as pd 
import numpy as np 
import scipy.stats as st 
from matplotlib.widgets import Slider 

np.random.seed(12345) 

df = pd.DataFrame([np.random.normal(33500,150000,3650), 
        np.random.normal(41000,90000,3650), 
        np.random.normal(41000,120000,3650), 
        np.random.normal(48000,55000,3650)], 
        index=[1992,1993,1994,1995]) 

N = len(df.columns)-1 # Degree of Freedom 
avg = df.mean(axis=1) # Mean for each row 
std = df.sem(axis=1) # Unbiased Standard Deviation 

year = df.index.map(str) # Convert to String 
conf95 = st.t.ppf(0.95, N)*std # 95% Confidence Interval 

upper = avg + conf95 
lower = avg - conf95 
colormap = ['blue', 'aqua', 'orange', 'brown'] 

ini = 39900 
chk1 = ini>upper # Check if y is greater than upper bound: blue 
chk2 = ini<lower # CHeck if y is smaller than lower bound: brown 
chk3 = (ini>=lower) & (ini<=avg) # Check if y is in between avg and lower: orange 
chk4 = (ini>avg) & (ini<=upper) # Check if y is in between avg and upper: aqua 


fig, ax =plt.subplots() 
ax.bar(df.index[chk1.values], avg.iloc[chk1.values], width=1, edgecolor='k', color='blue') 
ax.bar(df.index[chk2.values], avg.iloc[chk2.values], width=1, edgecolor='k', color='brown') 
ax.bar(df.index[chk3.values], avg.iloc[chk3.values], width=1, edgecolor='k', color='orange') 
ax.bar(df.index[chk4.values], avg.iloc[chk4.values], width=1, edgecolor='k', color='aqua') 
ax.axhline(y=ini,xmin=0,xmax=10,linewidth=1,color='k') 

ax.errorbar(df.index, avg, yerr=conf95, fmt='.',capsize=15, color='k') 
plt.subplots_adjust(left=0.1, bottom=0.2) 
plt.xticks(df.index, year) # Map xlabel with String 
plt.yticks(np.arange(0,max(avg)+1,max(avg)/5)) 

axcolor = 'lightgoldenrodyellow' 
axy = plt.axes([0.1, 0.1, 0.7, 0.03], axisbg=axcolor) 

sy = Slider(axy, 'y', 0.1, int(max(upper)+1), valinit=ini) 

この段階まで、色は正常に機能します。それでは、アップデート機能が動作しません。

def update(val): 
    ax.cla() 
    yy = sy.val  
    chk1 = yy>upper 
    chk2 = yy<lower 
    chk3 = (yy>=lower) & (yy<=avg) 
    chk4 = (yy>avg) & (yy<=upper) 
    ax.bar(df.index[chk1.values], avg.iloc[chk1.values], width=1, edgecolor='k', color='blue') 
    ax.bar(df.index[chk2.values], avg.iloc[chk2.values], width=1, edgecolor='k', color='brown') 
    ax.bar(df.index[chk3.values], avg.iloc[chk3.values], width=1, edgecolor='k', color='orange') 
    ax.bar(df.index[chk4.values], avg.iloc[chk4.values], width=1, edgecolor='k', color='aqua') 
    ax.bar(df.index, avg, width=1, edgecolor='k', color='silver') 
    ax.errorbar(df.index, avg, yerr=conf95, fmt='.',capsize=15, color='k') 
    ax.axhline(y=yy,xmin=0,xmax=10,linewidth=1,color='k') 
    fig.canvas.draw_idle() 

sy.on_changed(update) 

本当にありがとうございました。みなさんありがとう!

ベスト ショーン

答えて

0

は単に私はあなたがそこにそれを置く理由は分からないライン

ax.bar(df.index, avg, width=1, edgecolor='k', color='silver') 

を削除するが、それは色付きの棒の上に完全な単色の棒グラフをプロットし、それらを非表示になります。

いくつかの対話を可能にするために、対話型バックエンドを使用する必要があります。したがって、%matplotlib inlineモードが設定されている場合、IPythonのボックスの外では動作しません。オプションは、あなたが持っている:IPython Qtのコンソールまたはjupyterノートに%matplotlib notebookを使用して

  • コードをスクリプトとして実行するときにGUIバックエンドを使用する場合は、plt.show()を追加します。スパイダーでは、スクリプトを新しい専用ウィンドウでsketched hereという名前で実行することによって保証することができます。
+0

ラインが前回の試験から残されたことを申し訳ありません。 –

+0

しかし、この行を削除すると、スライダをスライドするたびにバーが消えます。あなたの方法についてもう少しヒントを教えてください。 –

+0

私は>色はスライダーイベントから新しいyyの値ごとに更新される持っているか、以前のものの上に単色の棒グラフをプロットした場合。この1行を削除するとき、< –

関連する問題