Python matplotlib绘制条形图与直方图详解
本文详细介绍如何使用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绘制条形图(柱状图)及直方图的实例分享完毕,希望能为读者提供参考与支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













