条形图(bar chart),也称为柱状图,是一种以长方形的长度为变量的统计图表,长方形的长度与它所对应的变量数值呈一定比例。
1. 竖放条形图
画条形图要用到 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 |
画出男生饮用水情况的直方图,代码如下:
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 函数两次,并调整 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 画条形图(柱状图)实例
- Author -
心态与做事习惯决定人生高度声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@