Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
634 views
in Technique[技术] by (71.8m points)

python - How to fix bar width in this matplotlib plot

Could someone please tell me how to modify this Python code that uses matplotlib such that the width of the bars will stay constant regardless of how many scores are plotted? Thank you in advance!

# 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')
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The bars are the same width! The reason they don't look the same is because you are using this line:

index = np.arange(n_groups)

This will change your x-values and hence the scale of your x-axis. To counteract this effect you can either change the limits of your x-axis, or make the bar width depend on the number of scores, so for example if a width of 0.35 works for 10 scores then if you double the number of scores you would half the bar width (and vice versa). You can see how either changing the axis limits or bar width gives bars that look the same width:

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...