Python Matplotlib绘制横竖条形图及分组条形图详解
本文介绍如何使用Python的Matplotlib库绘制竖条形图、横条形图以及分组条形图。通过plt.bar()和plt.barh()函数,结合width和height参数控制条柱宽度,实现离散数据的直观展示。重点讲解分组条形图中通过调整x轴坐标实现多组数据无缝拼接的技巧,并强调条柱宽度总和不超过1以避免混叠的关键注意事项。
条形图基础概念
条形图是一种使用宽度一致的矩形条,通过其高度或长度来反映数据大小的图形。它适用于展示离散型数据,能够直观地呈现各数据点的大小差异,便于进行数据间的对比分析。
竖条形图的绘制方法
绘制条形图的基本流程与折线图类似,主要区别在于将拟合函数从替换为。以2017年内地电影票房前20名及其票房数据为例,通过条形图进行可视化分析是直观且有效的方式。
以下是具体的实现代码:
# coding =utf-8
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\MSYHL.TTC")
a = ['战狼2', '速度与激情8', '功夫瑜伽', '西游伏妖篇', '变形金刚5:最后的骑士', '摔跤吧,爸爸',
'加勒比海盗5:死无对证', '金刚:骷髅岛', '极限特工:终极回归', '生化危机6:终章', '乘风破浪',
'神偷奶爸3', '智取威虎山', '大闹天竺', '金刚狼3:殊死一战', '蜘蛛侠:英雄归来', '悟空传', '银河护卫队2',
'情圣', '新木乃伊']
b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88, 6.86, 6.58, 6.23]
# 设置图像大小
plt.figure(figsize=(20, 15), dpi=80)
# 绘制条形图
plt.bar(range(len(a)), b, width=1)
# 设置字符串到X轴
plt.xticks(range(len(a)), a, fontproperties=my_font, rotation=90)
# 显示图形
plt.show()运行结果如下所示:

从程序逻辑来看,绘制条形图与折线图、散点图的思路基本一致,核心差异仅在于使用了进行绘制。需要特别注意的是,在绘制竖条形图时,必须确保每个条柱的宽度不超过1,否则会导致条柱之间出现混叠现象。
横条形图的转换技巧
上述竖条形图中,电影名称显示在底部,对于数据分析而言可读性较差。因此,通常需要将竖条形图转换为横条形图。实现这一转换非常简单,只需将替换为即可。完整的横条形图代码如下:
# coding =utf-8
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\MSYHL.TTC")
a = ['战狼2', '速度与激情8', '功夫瑜伽', '西游伏妖篇', '变形金刚5:最后的骑士', '摔跤吧,爸爸',
'加勒比海盗5:死无对证', '金刚:骷髅岛', '极限特工:终极回归', '生化危机6:终章', '乘风破浪',
'神偷奶爸3', '智取威虎山', '大闹天竺', '金刚狼3:殊死一战', '蜘蛛侠:英雄归来', '悟空传', '银河护卫队2',
'情圣', '新木乃伊']
b = [56.01, 26.94, 17.53, 16.49, 15.45, 12.96, 11.8, 11.61, 11.28, 11.12, 10.49, 10.3, 8.75, 7.55, 7.32, 6.99, 6.88, 6.86, 6.58, 6.23]
# 设置图像大小
plt.figure(figsize=(20,8),dpi=80)
# 绘制条形图
plt.barh(range(len(a)), b, height=0.3, color='orange') # 区别于竖的条形图 不能使用width
# 设置字符串到X轴
plt.yticks(range(len(a)), a, fontproperties=my_font)
plt.grid(alpha=0.3)
# 保存图片
plt.savefig('./movie.png')
# 显示图形
plt.show()运行后的结果如下:

对比可见,横条形图在此场景下的效果优于竖条形图,更便于观测与分析。在实际应用中,应根据具体数据特征和需求选择合适的图表类型。
分组条形图的实现与注意事项
接下来探讨一个更复杂的情况:如果已知四部电影——《猩球崛起3:终极之战》、《敦刻尔克》、《蜘蛛侠:英雄归来》和《战狼2》在三天内的票房数据,如何绘制条形图来展示每部电影在这三天内的票房变化趋势?
相关实现代码如下:
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\MSYHL.TTC")
a = ['猩球崛起3:终极之战', '敦刻尔克', '蜘蛛侠:英雄归来', '战狼2']
b_16 = [15746, 312, 4497, 319]
b_15 = [12357, 156, 2045, 168]
b_14 = [2358, 399, 2358, 362]
bar_width = 0.2 # 乘以3小于1
# 设置相邻的宽度
x_14 =list(range(len(a)))
x_15 = [i+bar_width for i in x_14]
x_16 = [i+bar_width*2 for i in x_14]
# 设置图像大小
plt.figure(figsize=(20,8),dpi=80)
# 设置X轴
plt.xticks(x_15,a,fontproperties=my_font)
# 绘制图像 设置条形图宽度
plt.bar(range(len(a)), b_14, width=bar_width, label='9月14日')
plt.bar(x_15, b_15, width=bar_width, label='9月15日')
plt.bar(x_16, b_16, width=bar_width, label='9月16日')
# 设置图例
plt.legend(prop=my_font)
# 显示图像
plt.show()运行结果如下:

从结果可以看出,该图表很好地满足了分析需求。《猩球崛起3:终极之战》的三日票房最高,且总票房呈上升趋势;《敦刻尔克》与《战狼2》的票房总体较低;《蜘蛛侠:英雄归来》票房中等但呈上升趋势。实现这一效果的关键在于将宽度参数设置为合适的值,使得三个直方图能够无缝连接。具体操作是:第一个条形图从0开始,第二个条形图的起始点为第一个条形的宽度,第三个条形图的起始点为两个条形的宽度,从而形成三部电影在三天内票房数目的对比效果。需要注意的是,每个直方图的宽度不能超过1/3,即三个条柱重叠后的总宽度不能超过1,否则会造成条形图混叠,影响视觉效果。

总结而言,绘制条形图的核心在于正确使用或函数,并严格控制条柱宽度。务必确保条柱宽度不超过1(分组条形图中单个宽度不超过1/3),以避免混叠,确保图表清晰有效。
以上就是本文的全部内容,希望能为您的学习提供帮助,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









