• 售前

  • 售后

热门帖子
入门百科

matplotlib bar()实现多组数据并列柱状图通用简便创建方法

[复制链接]
晚景入寒窗 显示全部楼层 发表于 2021-10-25 20:34:10 |阅读模式 打印 上一主题 下一主题
在利用柱状图时,经常遇到必要多组数据举行比较的情况。
绘制单个数据系列的柱形图比较简朴,多组数据柱状图绘制的关键有三点:
      
  • 多次调用bar()函数即可在同一子图中绘制多组柱形图。
      
      
  • 为了防止柱子重叠,每个柱子在x轴上的位置必要依次递增,如果柱子紧挨,这个间隔即柱子宽度。
      
      
  • 为了使刻度标签居中,必要调解x轴刻度标签的位置。
由上述可知,多组数据并列柱状图必要盘算柱子
  1. x
复制代码
轴上的位置和
  1. x
复制代码
轴刻度标签。
因此,有两种实现方案:
      
    1. x
    复制代码
    轴刻度标签位置固定,根据
    1. x
    复制代码
    轴刻度盘算每个柱子的宽度  
  • 每个柱子的宽度固定,盘算
    1. x
    复制代码
    轴刻度标签位置,使之居中
下面利用第一种方法演示两组数据、三组数据、四组数据的并列柱状图。
利用方法一、方法二演示通用多组并列柱状图的创建方法。
两组数据、三组数据、四组数据的并列柱状图

  1. import matplotlib
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. plt.figure(figsize=(13, 4))
  5. # 构造x轴刻度标签、数据
  6. labels = ['G1', 'G2', 'G3', 'G4', 'G5']
  7. first = [20, 34, 30, 35, 27]
  8. second = [25, 32, 34, 20, 25]
  9. third = [21, 31, 37, 21, 28]
  10. fourth = [26, 31, 35, 27, 21]
  11. # 两组数据
  12. plt.subplot(131)
  13. x = np.arange(len(labels)) # x轴刻度标签位置
  14. width = 0.25 # 柱子的宽度
  15. # 计算每个柱子在x轴上的位置,保证x轴刻度标签居中
  16. # x - width/2,x + width/2即每组数据在x轴上的位置
  17. plt.bar(x - width/2, first, width, label='1')
  18. plt.bar(x + width/2, second, width, label='2')
  19. plt.ylabel('Scores')
  20. plt.title('2 datasets')
  21. # x轴刻度标签位置不进行计算
  22. plt.xticks(x, labels=labels)
  23. plt.legend()
  24. # 三组数据
  25. plt.subplot(132)
  26. x = np.arange(len(labels)) # x轴刻度标签位置
  27. width = 0.25 # 柱子的宽度
  28. # 计算每个柱子在x轴上的位置,保证x轴刻度标签居中
  29. # x - width,x, x + width即每组数据在x轴上的位置
  30. plt.bar(x - width, first, width, label='1')
  31. plt.bar(x, second, width, label='2')
  32. plt.bar(x + width, third, width, label='3')
  33. plt.ylabel('Scores')
  34. plt.title('3 datasets')
  35. # x轴刻度标签位置不进行计算
  36. plt.xticks(x, labels=labels)
  37. plt.legend()
  38. # 四组数据
  39. plt.subplot(133)
  40. x = np.arange(len(labels)) # x轴刻度标签位置
  41. width = 0.2 # 柱子的宽度
  42. # 计算每个柱子在x轴上的位置,保证x轴刻度标签居中
  43. plt.bar(x - 1.5*width, first, width, label='1')
  44. plt.bar(x - 0.5*width, second, width, label='2')
  45. plt.bar(x + 0.5*width, third, width, label='3')
  46. plt.bar(x + 1.5*width, fourth, width, label='4')
  47. plt.ylabel('Scores')
  48. plt.title('4 datasets')
  49. # x轴刻度标签位置不进行计算
  50. plt.xticks(x, labels=labels)
  51. plt.legend()
  52. plt.show()
复制代码
通用多组并列柱状图的轻巧创建方法

上面的示例比较浅易,有一些题目没有考虑。为了便于重复利用,下面的通用方法可调解x轴标签刻度步长、每组柱子的总宽度、每组柱子之间的间隙、组与组之间的间隙。

方法一
  1. import matplotlib
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. label = ['G1', 'G2', 'G3', 'G4', 'G5']
  5. first = [20, 34, 30, 35, 27]
  6. second = [25, 32, 34, 20, 25]
  7. third = [21, 31, 37, 21, 28]
  8. fourth = [26, 31, 35, 27, 21]
  9. data = [first, second, third, fourth]
  10. def create_multi_bars(labels, datas, tick_step=1, group_gap=0.2, bar_gap=0):
  11.   '''
  12.   labels : x轴坐标标签序列
  13.   datas :数据集,二维列表,要求列表每个元素的长度必须与labels的长度一致
  14.   tick_step :默认x轴刻度步长为1,通过tick_step可调整x轴刻度步长。
  15.   group_gap : 柱子组与组之间的间隙,最好为正值,否则组与组之间重叠
  16.   bar_gap :每组柱子之间的空隙,默认为0,每组柱子紧挨,正值每组柱子之间有间隙,负值每组柱子之间重叠
  17.   '''
  18.   # ticks为x轴刻度
  19.   ticks = np.arange(len(labels)) * tick_step
  20.   # group_num为数据的组数,即每组柱子的柱子个数
  21.   group_num = len(datas)
  22.   # group_width为每组柱子的总宽度,group_gap 为柱子组与组之间的间隙。
  23.   group_width = tick_step - group_gap
  24.   # bar_span为每组柱子之间在x轴上的距离,即柱子宽度和间隙的总和
  25.   bar_span = group_width / group_num
  26.   # bar_width为每个柱子的实际宽度
  27.   bar_width = bar_span - bar_gap
  28.   # baseline_x为每组柱子第一个柱子的基准x轴位置,随后的柱子依次递增bar_span即可
  29.   baseline_x = ticks - (group_width - bar_span) / 2
  30.   for index, y in enumerate(datas):
  31.     plt.bar(baseline_x + index*bar_span, y, bar_width)
  32.   plt.ylabel('Scores')
  33.   plt.title('multi datasets')
  34.   # x轴刻度标签位置与x轴刻度一致
  35.   plt.xticks(ticks, labels)
  36.   plt.show()
  37.   
  38. create_multi_bars(label, data, bar_gap=0.1)
复制代码
方法二
  1. import matplotlib
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. label = ['G1', 'G2', 'G3', 'G4', 'G5']
  5. first = [20, 34, 30, 35, 27]
  6. second = [25, 32, 34, 20, 25]
  7. third = [21, 31, 37, 21, 28]
  8. fourth = [26, 31, 35, 27, 21]
  9. data = [first, second, third, fourth]
  10. def create_multi_bars(labels, datas, tick_step=1, group_gap=0.2, bar_gap=0):
  11.   '''
  12.   labels : x轴坐标标签序列
  13.   datas :数据集,二维列表,要求列表每个元素的长度必须与labels的长度一致
  14.   tick_step :默认x轴刻度步长为1,通过tick_step可调整x轴刻度步长。
  15.   group_gap : 柱子组与组之间的间隙,最好为正值,否则组与组之间重叠
  16.   bar_gap :每组柱子之间的空隙,默认为0,每组柱子紧挨,正值每组柱子之间有间隙,负值每组柱子之间重叠
  17.   '''
  18.   # x为每组柱子x轴的基准位置
  19.   x = np.arange(len(labels)) * tick_step
  20.   # group_num为数据的组数,即每组柱子的柱子个数
  21.   group_num = len(datas)
  22.   # group_width为每组柱子的总宽度,group_gap 为柱子组与组之间的间隙。
  23.   group_width = tick_step - group_gap
  24.   # bar_span为每组柱子之间在x轴上的距离,即柱子宽度和间隙的总和
  25.   bar_span = group_width / group_num
  26.   # bar_width为每个柱子的实际宽度
  27.   bar_width = bar_span - bar_gap
  28.   # 绘制柱子
  29.   for index, y in enumerate(datas):
  30.     plt.bar(x + index*bar_span, y, bar_width)
  31.   plt.ylabel('Scores')
  32.   plt.title('multi datasets')
  33.   # ticks为新x轴刻度标签位置,即每组柱子x轴上的中心位置
  34.   ticks = x + (group_width - bar_span) / 2
  35.   plt.xticks(ticks, labels)
  36.   plt.show()
  37. create_multi_bars(label, data[:3], bar_gap=0.1)
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作