2017-06-03 11 views
0

matplotlibを使用するこのPythonコードを修正する方法を教えてください。棒の幅はプロットされているスコアの数に関係なく一定に保たれますか?前もって感謝します!このmatplotlibプロットのバー幅を固定する方法

# data to plot 
    n_groups = len(math_scores) 
    ###print "im here", math_scores,verbal_scores 
    scores_readingwriting = verbal_scores 
    scores_math = math_scores 

# create plot 
    fig, ax = plot.subplots() 
    index = np.arange(n_groups) 
    bar_width = 0.35 
    opacity = 0.8 

    rects1 = plot.bar(index, scores_readingwriting, bar_width, 
       alpha=opacity, 
       color='black', 
       label='R/W') 

    rects2 = plot.bar(index + bar_width, scores_math, bar_width, 
       alpha=opacity, 
       color='grey', 
       label='Math') 

    plot.xlabel('Date',size='14') 
    plot.ylabel('Scores',size='14') 

    plot.title(str(first_names[i])+' '+str(last_names[i])+"'s History",size='17') 
    num=len(scores) 
    ###print datesofinterest 
    plot.xticks(index + bar_width/2, datesofinterest,size='12') 
    plot.yticks(size='12') 
    axes = plot.gca() 
    axes.set_ylim([200,800]) 
    plot.legend() 

    plot.tight_layout() 
    fig.savefig('img'+str(student_ids[i])+'.png') 

答えて

1

バーは同じ幅です!

index = np.arange(n_groups) 

をこれはあなたのxの値を変更するので、あなたのx軸のスケールます:あなたはこのラインを使用しているので、彼らは同じように見ていない理由があります。この効果を打ち消すには、x軸の限界を変更するか、スコアの数に応じてバーの幅を変えるかのいずれかを行うことができます。例えば、10点の幅に対して0.35の幅があれば、バー幅の半分(およびその逆)。

import numpy as np 
import matplotlib.pyplot as plt 

# make some dummy data 
scores_reading = np.random.randint(50,100,10) 
scores_math = np.random.randint(50,100,10) 

fig = plt.figure(figsize=(16,5)) 
bar_width = 0.35 
index = np.arange(10) 

ax1 = fig.add_subplot(1,4,1) 
ax1.bar(index, scores_reading, bar_width, fc='b', edgecolor='none') 
ax1.bar(index+bar_width, scores_math, bar_width, fc='r', edgecolor='none') 
ax1.set_xlim(0,10) 
ax1.set_title('Original - 10 scores') 

ax2 = fig.add_subplot(1,4,2) 
ax2.bar(index[:5], scores_reading[:5], bar_width, fc='b', edgecolor='none') 
ax2.bar(index[:5]+bar_width, scores_math[:5], bar_width, fc='r', edgecolor='none') 
ax2.set_title('Original - 5 scores') 

ax3 = fig.add_subplot(1,4,3) 
ax3.bar(index[:5], scores_reading[:5], bar_width, fc='b', edgecolor='none') 
ax3.bar(index[:5]+bar_width, scores_math[:5], bar_width, fc='r', edgecolor='none') 
ax3.set_xlim(0,10) 
ax3.set_title('Changed limit - 5 scores') 

ax4 = fig.add_subplot(1,4,4) 
ax4.bar(index[:5], scores_reading[:5], bar_width/2., fc='b', edgecolor='none') 
ax4.bar(index[:5]+bar_width, scores_math[:5], bar_width/2., fc='r', edgecolor='none') 
ax4.set_title('Changed width - 5 scores') 

fig.show() 

enter image description here

+0

をありがとう:あなたは、どちらかの軸の範囲やバーの幅を変更すると同じ幅に見えるバーを与える方法を見ることができます!私はこれが働いたことを確認した。私の唯一のフォローアップの質問は、どのように5つのスコアを近づけて2番目の棒グラフのバーを作成するのでしょうか?バーは常に触っておく必要があります。ご協力いただきありがとうございます。 :) –

+0

あなたが作った間違いは、赤い棒があります。 'bar_width'を' index [:5] 'に追加しましたが、青いバーのサイズは' bar_width/2'です。この行は次のようになります ax4.bar(index [:5] +(bar_width/2)、scores_math [:5]、bar_width/2、fc = 'r'、edgecolor = 'none') –

+0

@FemiOladeji - 棒を動かすので、触れたままになります:-) – Robbie

関連する問題