Python matplotlib绘制条形图与直方图详解

今天早睡
今天早睡
发布时间:2026-10-13| 4人浏览过
原创

本文详细介绍如何使用Python的matplotlib库绘制竖放、横放及并列条形图,解析bar与barh函数的参数设置。同时深入辨析条形图与直方图在数据展示、图形排列及适用数据类型上的核心区别,通过代码实例帮助读者避免常见绘图错误。

条形图基础概念

条形图(bar chart),亦称柱状图,是一种利用长方形长度来表现变量数值的统计图表,长方形的长度与对应变量数值成正比。

竖放条形图绘制

1. 竖放条形图的绘制方法

在Python中绘制条形图需调用pyplot模块下的bar函数,其基础语法结构如下:

bar(x, height, [width], **kwargs)

x 数组,每个条形的横坐标
height 个数或一个数组,条形的高度
[width] 可选参数,一个数或一个数组,条形的宽度,默认为 0.8
**kwargs 不定长的关键字参数,用字典形式设置条形图的其他属性

在**kwargs参数中,通常可以配置图形标签label、颜色color以及不透明度alpha等属性。

假设有一项关于男女大学生饮用水购买偏好的调查数据,如下表所示:

男 女
碳酸饮料 6 9
绿茶 7 4
矿泉水 6 4
其他 2 6
果汁 1 5
总计 22 28

基于上述数据,绘制男生饮用水购买情况的直方图(注:原文此处语境实为条形图,但保留原文用词逻辑或修正为条形图更准确,根据上下文a2代码实为bar函数,故改写为条形图),具体代码如下:


import matplotlib.pyplot as plt

# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

waters = ('碳酸饮料', '绿茶', '矿泉水', '果汁', '其他')
buy_number = [6, 7, 6, 1, 2]

plt.bar(waters, buy_number)
plt.title('男性购买饮用水情况的调查结果')

plt.show()

生成的图形效果如下:

横放条形图绘制

2. 横放条形图的绘制方法

若需生成横向的条形图,可使用barh函数,其语法结构与bar函数高度相似。

bar(x, width, [height], **kwargs)

y 数组,每个条形的纵坐标
width 一个数或一个数组,条形的宽度
[height] 可选参数,一个数或一个数组,条形的高度,默认为 0.8
**kwargs 不定长的关键字参数,用字典形式设置条形图的其他属性

实现横放条形图的代码如下:


import matplotlib.pyplot as plt

# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

waters = ('碳酸饮料', '绿茶', '矿泉水', '果汁', '其他')
buy_number = [6, 7, 6, 1, 2]

plt.barh(waters, buy_number) # 横放条形图函数 barh
plt.title('男性购买饮用水情况的调查结果')

plt.show()

并列条形图实现

3. 并列条形图的绘制技巧

若需将男生与女生的调查数据以两组条形图并排显示,可分别调用bar或barh函数两次,并通过调整坐标位置及刻度,使两组条形图并排呈现。


import matplotlib.pyplot as plt
import numpy as np

# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 输入统计数据
waters = ('碳酸饮料', '绿茶', '矿泉水', '果汁', '其他')
buy_number_male = [6, 7, 6, 1, 2]
buy_number_female = [9, 4, 4, 5, 6]

bar_width = 0.3 # 条形宽度
index_male = np.arange(len(waters)) # 男生条形图的横坐标
index_female = index_male + bar_width # 女生条形图的横坐标

# 使用两次 bar 函数画出两组条形图
plt.bar(index_male, height=buy_number_male, width=bar_width, color='b', label='男性')
plt.bar(index_female, height=buy_number_female, width=bar_width, color='g', label='女性')

plt.legend() # 显示图例
plt.xticks(index_male + bar_width/2, waters) # 让横坐标轴刻度显示 waters 里的饮用水, index_male + bar_width/2 为横坐标轴刻度的位置
plt.ylabel('购买量') # 纵坐标轴标题
plt.title('购买饮用水情况的调查结果') # 图形标题

plt.show()

条形图与直方图的区别

补充知识:Python中条形图与直方图存在显著差异

主要区别如下:

首先,条形图通过条形长度表示各类别频数,其宽度固定代表类别;

直方图则通过面积表示各组频数,矩形高度代表频数或频率,宽度代表组距,因此高度与宽度均具有统计意义。

其次,由于分组数据具有连续性,直方图的矩形通常连续排列,而条形图则是分开排列。

最后,条形图主要用于展示分类数据,而直方图主要用于展示数据型数据分布。初中所学的条形统计图(如身高-年龄条形统计图)即在坐标上画出每个年龄对应的频数,这是研究数据分布的常用方式。若仍感困惑,可通过下方相同数据的对比图直观理解:

相关数据如下:

年龄 0 1 2 3 4 5 6 7 8 9 10 总数
人数 3 6 7 11 13 18 15 11 7 5 4 100

条形统计图(注重每类多少个):

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
 
# d=pd.read_excel('E:\Python\projects\data\data100.xlsx',header=None)
# d=d[0]
# d=list(d)
 
ages=range(11)
count=[3,6,7,11,13,18,15,11,7,5,4]
plt.bar(ages,count, label='graph 1')
# params
# x: 条形图x轴
# y:条形图的高度
# width:条形图的宽度 默认是0.8
# bottom:条形底部的y坐标值 默认是0
# align:center / edge 条形图是否以x轴坐标为中心点或者是以x轴坐标为边缘
plt.legend()
plt.xlabel('ages')
plt.ylabel('count')
plt.title(u'测试例子——条形图')
 
for i in range(11):
  plt.text(i,count[i]+0.1,"%s"%count[i],va='center')
 
plt.show()

条形图效果:


import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文
plt.rcParams['axes.unicode_minus']=False #正常显示负号
# d=np.random.normal(0,1,100)
d=pd.read_excel('E:\Python\projects\data\data100.xlsx',header=None)
d=d[0]
d=list(d)
print(d)
n, bins, patches = plt.hist(x=d, bins=11, color='#0504aa',
        alpha=0.8, rwidth=0.6) #alpha 是颜色深度 rwidth 条形宽度,bins条形箱的数目
 
plt.grid(axis='y', alpha=0.4) #alpha 网格颜色深度
plt.xlabel('age')
plt.ylabel('count')
plt.title('100个样本分布如下')
plt.text(20, 40, r'$\mu=0, sigma=1$')#前面是坐标,写字
# plt.ylim(19) #设置y的范围
 
plt.show()

通过对比两图可知,条形图严格区分类别,而直方图通过间隔划分柱体。虽然两者大体相似,但在数据研究层面影响巨大。明确二者区别有助于避免绘图错误。

以上关于Python绘制条形图(柱状图)及直方图的实例分享完毕,希望能为读者提供参考与支持。

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

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 算法库。