文本以及后续的系列文章中均会使用到numpy这个库,numpy是Python的一种开源的数值计算扩展,主要用来生产一些随机数作为绘图的原始数据。具体和安装matplotlib类似,可以参考安装Matplotlib这篇文章。
文章目录
条形图:
长条图(英语:bar chart),亦称条图(英语:bar graph)、条状图、棒形图、柱状图、条形图表、条形图,是一种以长方形的长度为变量的统计图表。用水平或者垂直的条形图来展示各种分类间分散不连续的数字比较。通常利用于较小的数据集分析。长条图亦可横向排列,或用多维方式表达。
一、bar函数
1. 函数定义:
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, \*, align='center', data=None, \*\*kwargs)
- 常用参数:
- x:
需要显示的数据,包含所有柱子的下标的列表,也就是每个柱子的标签; - height:
包含所有柱子的高度值的列表 - width:
每个柱子的宽度。 可以指定一个固定值, 那么所有的柱子都是一样的宽。 或者设置一个列表, 这样可以分别对每个柱子设定不同的宽度 - align:
柱子对齐方式,有两个可选值:center 和 edge - color:
柱子的颜色,可传入一个固定值或一个列表 - edgecolor:
柱子的边框颜色,可传入一个固定值或一个列表 - linewidth:
每根柱子的边框宽度。 如果没有设置,默认没有边框 - tick_label:
每根柱子上显示的标签, 默认是没有 - log:
对于y轴数据进行log操作,默认false;这个对于多个数据列表,数值差异较大的时候进行显示的时候有用
2、bar的详细定义:
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html?highlight=bar#matplotlib.pyplot.bar
二、示例说明:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
"""
font:设置中文
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
men_means= (20, 35, 30, 35, 27)
women_means= (25, 32, 34, 20, 25)
#设置X轴上分组的位置,arange函数使用给定间隔内的均匀间隔的值来创建数组,产生[0,1,2,3,4]
ind = np.arange(len(men_means))
#设置bar条的宽度
width = 0.35
fig, ax = plt.subplots()
rects1 = ax.bar(ind - width/2, men_means, width, color='SkyBlue', label='男生')
rects2 = ax.bar(ind + width/2, women_means, width,color='IndianRed', label='女生')
#为增加X轴标签,为绘图区域添加标题
ax.set_ylabel('分数')
ax.set_title('各组分数')
plt.xticks(ind,('1组', '2组', '3组', '4组', '5组'))
ax.legend()
plt.show();
运行结果如下:
三、扩展应用
1、 柱体颜色
通过 facecolor(或fc) 关键字参数可以设置柱体颜色
通过 color 关键字参数 可以一次性设置多个颜色
import matplotlib.pylab as plt
x = [0,1,2,3,4]
y = [39,10,20,25,15]
fig = plt.figure()
# 生成第一个子图在1行2列第一列位置
ax1 = fig.add_subplot(121)
# 生成第二子图在1行2列第二列位置
ax2 = fig.add_subplot(122)
# 通过fc设置柱体的颜色
ax1.bar(x, y, width=0.5,fc = 'SkyBlue')
# 通过color分布设置各个柱体的颜色
ax2.bar(x, y,color=['b', 'g', 'r', 'c', 'm'])
plt.show()
运行结果如下:
2、设置柱体描边
相关的关键字参数为:
- edgecolor(ec) 描边颜色
- linestyle(ls)描边样式
- linewidth(lw)描边宽度
import matplotlib.pyplot as plt
x = [0,1,2,3,4]
y = [39,10,20,25,15]
fig,ax = plt.subplots()
#设置描边的颜色,样式,宽度
ax.bar(x, y, ec='k', ls='-.', lw=5,color='#ADD8E6')
plt.show()
运行结果如下:
3、设置柱体描边填充
hatch 关键字可用来设置填充样式,可取值为: / , \ , | , - , + , x , o , O , . , *
import matplotlib.pyplot as plt
x = [0,1,2,3,4]
y = [39,10,20,25,15]
#设置填充的样式
plt.bar(x,y,hatch='o')
plt.show()
运行结果如下:
4、堆积条形图
通过 bottom 参数,可以绘制堆叠条形图,其中bottom参数决定了距离x轴的位置。通过堆积图可以有效的进行对比。
import matplotlib.pyplot as plt
import matplotlib
"""
font:设置中文
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
x = [1,2,3,4,5]
salary = [5,10,20,25,15]
parttime_income=[30,5,10,20,15]
# x轴的刻度为1-5月
labels =["{}月".format(item) for item in x]
fig,ax = plt.subplots(figsize=(12,6),dpi=80)
ax.bar(x,parttime_income,tick_label=labels,label='兼职收入')
ax.bar(x,salary,bottom=parttime_income,tick_label=labels,label="工资")
ax.legend()
plt.show()
运行结果如下:
5、并列条形图
通过并列条形图,可以直观的对比多个数据样本之间的差异。
import matplotlib.pyplot as plt
import matplotlib
"""
font:设置中文
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
#设置bar条的宽度
width = 0.4
X = [1,2,3,4,5]
salary = [5,10,20,25,15]
parttime_income=[30,5,10,20,15]
# x轴的刻度为1-5月
labels =["{}月".format(item) for item in x]
fig,ax = plt.subplots(figsize=(12,6),dpi=80)
##绘制兼职收入的柱状图
ax.bar([x-width/2 for x in X],parttime_income,width,tick_label=labels,label='兼职收入')
ax.bar([x+width/2 for x in X],salary,width,tick_label=labels,label="工资")
ax.legend()
plt.show()
运行结果如下:
5、水平条形图
水平条形图通过barh函数进行绘制。
barh(bottom, width, height=0.8, left=None, **kwargs)
import matplotlib.pyplot as plt
import matplotlib
"""
font:设置中文
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
#设置bar条的宽度
width = 0.4
X = [1,2,3,4,5]
salary = [5,10,20,25,15]
parttime_income=[30,5,10,20,15]
# x轴的刻度为1-5月
labels =["{}月".format(item) for item in x]
fig,ax = plt.subplots(figsize=(12,6),dpi=80)
##绘制兼职收入的柱状图
ax.barh([x-width/2 for x in X],parttime_income,width,tick_label=labels,label='兼职收入')
ax.barh([x+width/2 for x in X],salary,width,tick_label=labels,label="工资")
ax.legend()
plt.show()
6、正负条形图
通过左右两边进行数据的呈现
import matplotlib.pyplot as plt
import matplotlib
"""
font:设置中文
"""
matplotlib.rcParams['font.family'] = ['Heiti TC']
#设置bar条的宽度
width = 0.4
X = [1,2,3,4,5]
salary = [5,10,20,25,15]
parttime_income=[30,5,10,20,15]
# x轴的刻度为1-5月
labels =["{}月".format(item) for item in x]
fig,ax = plt.subplots(figsize=(12,6),dpi=80)
##绘制兼职收入的柱状图
ax.barh(X,parttime_income,width,tick_label=labels,label='兼职收入')
##通过列表生成式将salary的数据变为负值
ax.barh(X,[-s for s in salary],width,tick_label=labels,label="工资")
ax.legend()
plt.show()
总结
条形图简单直观,根据柱子的长短看出值的大小,易于比较各组数据之间的差别及走势,对应的优势
- 1、能够使人们一眼看出各个数据的大小。
- 2、易于比较数据之间的差别。
在实际的使用中容易将直方图和条形图混淆,这两者图形的主要区别如下:
条形图与直方图的区别是:
- 1、条形图是用条形的高度表示频数的大小,而直方图实际上是用长方形的面积表示频数,当长方形的宽相等的时候可以用矩形的高表示频数;
- 2、条形图中,横轴上的数据是孤立的,是一个具体的数据,而直方图中,横轴上的数据是连续的,是一个范围;
- 3、条形图中,各长方形之间有空隙,而直方图中,各长方形是靠在一起的