Python Matplotlib绘制横竖条形图及分组条形图详解

周末不加班
周末不加班
发布时间:2026-10-15| 7人浏览过
原创

本文介绍如何使用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),以避免混叠,确保图表清晰有效。

以上就是本文的全部内容,希望能为您的学习提供帮助,也欢迎大家继续支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。