一、绘制直方图
1.1 绘制直方图
使用 pyplot 的 hist() 函数可以快速绘制直方图,hist() 函数的语法格式如下所示:
hist(x,bins=None,range=None,density=None,weights=None,
rcumulative=False,bottom=None,histtype='bar',align='mid',
orientation='vertical',rwidth=None,log=False,label=None,
stacked=False,normed=None,*,data=None,**kwargs)
该函数常用参数的含义如下.
x:表示x轴的数据,可以为单个数组或多个数组的序列。
bins:表示矩形条的个数,默认为10。
range:表示数据的范围。若没有提供 range 参数的值,则数据范围为(x.min(),x.max())。
cumulative:表示是否计算累计频数或频率。
hisype:表示直方图的类型,支持'bar'、'bartacked'、'step、'stepfilled' 四种取值,其中'bar'为默认值,代表传统的直方图;' barstacked' 代表堆积直方图 ;'step'代表未填充的线条直方图;'stepfilled'代表填充的线条直方图。
align:表示矩形条边界的对齐方式,可设置为'left'、'mid' 或'right',默认为'mid';
orientation:表示矩形条的摆放方式,默认为'vertical',即垂直方向。
rwidth:表示矩形条宽度的百分比,默认为0。若 histtype 的值为'tep'或'stepflled',则直接忽略 rwidth 参数的值。
stacked:表示是否将多个矩形条以堆积形式摆放。
例如,绘制一个具有 8 个矩形条填充的线条直方图,代码如下。
#导入模块
import numpy as np
import matplotlib.pyplot as plt
# 准备 50 个随机测试数据
scores = np.random.randint(0,100,50)
#创建Figure类的对象fig
fig = plt.figure()
#在画布fig上添加坐标系风格的绘图区域ax
ax = fig.add_subplot(111)
# 绘制直方图
ax.hist(data)
plt.show()
运行程序,结果如下所示:
1.2 实例:人脸识别的灰度直方图
随着计算机技术的不断发展,人工智能的应用已渗透到人们日常生活的方方面面,其中人脸识别技术是近两年较为热门的话题之一。人脸识别技术是一种生物特征识别技术,它过从装有摄像头的终端设备拍摄的人脸图像中抽取人的个性化特征,以此来识别人的身份灰度直方图便是实现人脸识别的方法之一,它将数字图像的所有像素,按照灰度值的大小统计其出现的频率。
下面使用一组 1000 个随机数作为人脸识别的灰度值,使用 hist() 函数绘制一个灰度方图,具体代码如下。
#05 face_recognition
import matplotlib.pyplot as plt
import numpy as np
#10000个随机数
random_state=np.random.RandomState(19680801)
random_x = random_state.randn(10000)
#绘制包含25个矩形条的直方图
plt.hist(random_x,bins=25)
plt.show()
运行程序,结果如图所示:
图中,x轴代表灰度值,y轴代表频率。由上图可知,位于-0.5~ 0之间的灰度值最多,位于-4 ~-3或3~4之间的灰度值最少。
二、绘制饼图或圆环图
2.1 使用pie()绘制饼图或圆环图
使用pyplot的pie()函数可以快熟地绘制饼图或圆环图,pie()函数的语法格式如下所示:
pie(x,explode=None,labels=None,autopct=None,
pctdistance=0.6,shadow=False,labeldistance=1.1,startangle=None,
radius=None,counterclock=True,wedgeprops=None,textprops=None,
center=(0,0),frame=False,rotatelabels=False, *, data=None)
该函数常用参数的含义如下。
x:表示扇形或楔形的数据。
explode:表示扇形或楔形离开圆心的距离。
labels:表示扇形或楔形对应的标签文本。
autopct:表示控制扇形或楔形的数值显示的字符串,可通过格式字符串指定小数点后的位数。
pctdistance:表示扇形或楔形对应的数值标签距离圆心的比例,默认为0.6。
shadow:表示是否显示阴影。
labeldistance:表示标签文本的绘制位置(相对于半径的比例),默认为 1.1。
startangle:表示起始绘制角度,默认从x轴的正方向逆时针绘制。
radius:表示扇形或楔形的半径。
wedgeprops:表示控制扇形或楔形属性的字典。例如,通过 wedgeprops = {'width' :07}将楔形的宽度设为 0.7。
textprops:表示控制图表中文本属性的字典。
center:表示图表的中心点位置,默认为(0,0)。
frame:表示是否显示图框。
例如,使用 pie()函数绘制一个饼图,代码如下。
import numpy as np
import matplotlib.pyplot as plt
#创建fig类对象并添加绘图区域
fig = plt.figure()
ax = fig.add_subplot(111)
#准备数据
data=np.array([20,50,10,15,30,55])
#添加标签
ax.labels = np.array(['A','B','C','D','E','F'])
#绘制并展示饼状图
ax.pie(data,radius=1.5,labels=pie_labels,autopct='%3.1f%%',startangle=90)
plt.show()
运行程序,结果如图所示:
例如,使用 pie() 函数绘制一个圆环图,代码如下。
import numpy as np
import matplotlib.pyplot as plt
data = np.array([20,50,10,15,30,55])
pie_labels = np.array(['A','B','C','D','E','E'])
# 绘制圆环图 : 外圆半径为 1.5,楔形宽度为 0.7
plt.pie(data,radius=1.5,wedgeprops={'width': 0.7},labels=pie_labels,
autopct='%3.lf%%',pctdistance=0.75)
plt.show()
运行程序,结果如图所示:
2.2 实例:支付宝月账单报告
近年来随着移动支付 App 的出现,人们的生活发生了翻天覆地的变化,无论是到超市选购商品,还是跟朋友聚餐,或是来一场说走就走的旅行,都可以使用移动支付 App 轻松完成支付,非常便捷。支付宝是人们使用较多的移动支付方式,它拥有自动记录每月账单的功能.可以方便用户了解每月资金的流动情况。例如,用户 A 某月使用支付宝的消费明细如表所示。
根据表的数据,将“分类”一列的数据作为饼图的标签,将各分类对应的金额与总支出金额的比例作为饼图的数据,使用 pie()函数绘制用户A 某月支付宝消费情况的饼图具体代码如下。
# 06 monthly bills of alipay
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
# 饼图外侧的说明文字
kinds = ['购物','人情往来','餐饮美食','通信物流','生活日用','交通出行','休闲娱乐','其他']
# 饼图的数据
money_scale=[800/3000,100/3000,1000/3000,200/3000,300/3000,200/3000,200/3000,200/3000]
dev_position = [0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]
#绘制饼图
plt.pie (money_scale,labels=kinds, autopct='%3.lf%%',shadow=True,explode=dev_position,startangle=90)
plt.show()
运行程序,如下图所示:
由图可知,绿色扇形的面积最大,说明餐饮美食方面的支出在当月总支出中占比最大 ;橙色扇形的面积最小,说明人情往来的支出在当月总支出中占比最小。
三、绘制散点图或气泡图
3.1 使用scatter()绘制散点或气泡图
使用 pyplot的scatter()函数可以快速绘制散点图或气泡图,scatter()函数的语法格式如下
所示 :
scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,
vmin=None,vmax=None,alpha=None,linewidths=None,verts=None,
edgecolors=None,*,plotnonfinite=False,data=None,**kwargs)
该函数常用参数的含义如下:
x,y: 表示数据点的位置。
s:表示数据点的大小。
c:表示数据点的颜色。
marker:表示数据点的样式,默认为圆形。
cmap:表示数据点的颜色映射表,仅当参数c为浮点数组时才使用。
norm:表示数据亮度,可以取值为0~1。
vmin,vmax:表示亮度的最小值和最大值。若传入了norm 参数,则忽略vmin和vmax参数。
alpha:表示透明度,可以取值为0~1。
linewidths: 表示数据点边缘的宽度。
edgecolors:表示数据点边缘的颜色。
使用 scatter()函数绘制一个散点图,代码如下。
num= 50
x= np.random.rand(num)
y= np.random.rand(num)
plt.scatter(x,y)
运行代码,结果如图所示:
使用 scatter()函数绘制一个气泡图,代码如下。
num = 50
x = np.random.rand(num)
y = np.random.rand(num)
area = (30*np.random.rand(num))**2
plt.scatter(x,y,s=area)
运行程序,如下图所示。
3.2 实例:汽车速度与制动距离的关系
汽车的制动距离主要取决于车速。若车速增加 1倍,则汽车的制动距离将增大至近 4 倍。某汽车生产公司对一批丰田汽车进行抽样测试,并分别记录了不同的车速对应的制动距离具体如表所示。
根据表的数据,将“车速 (km/h)”一列的数据作为x轴的数据,将“制动距离(m)”一列的数据作为y轴的数据,使用 scalter() 函数绘制汽车速度与制动距离关系的散点图,具体代码如下。
# 07 vehicle speed and braking distance
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 准备x轴和y轴的数据
x_speed = np.arange(10,210,10)
y_distance = np.array([0.5,2.0,4.4,7.9,12.3,
17.7,24.1,31.5,39.9,49.2,
59.5,70.8,83.1,96.4,110.7,
126.0,142.2,159.4,177.6,196.8])
# 绘制散点图
plt.scatter(x_speed,y_distance,s=50,alpha=0.9)
plt.show()
运行程序,结果如下图所示:
图中,x轴代表车速,y轴代表制动距离。由图可知,恒定条件下,制动距离随着车速的增大而增加。
使用面向对象API绘制散点图
#创建对象
fig = plt.figure()
ax = fig.add_subplot(111)
#添加数据
num = 100
x = np.random.rand(num)
y = np.random.rand(num)
ax.scatter(x,y)
#绘制并展示散点图
ax.scatter(x,y)
plt.show()
四、绘制误差棒图
4.1 使用errorbar()绘制误差棒图
使用pyplot的errorbar()函数可以快速绘制误差棒图,errorbar()函数的语法格式如下所示:
该函数常用参数的含义如下。
x,y:表示数据点的位置。
xerr,yerr:表示数据的误差范围。
fmt:表示数据点的标记样式和数据点之间连接线的样式。
ecolor:表示误差棒的线条颜色。
elinewidth:表示误差棒的线条宽度。
capsize:表示误差棒边界横杆的大小。
capthick:表示误差棒边界横杆的厚度。
使用errorbar()函数绘制一个误差棒图,代码如下
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(5)
y = (25,32,34,20,25)
y_offset = (3,5,2,3,3)
plt.errorbar(x,y,yerr=y_offset,capsize=3,capthick=2)
plt.show()
运行程序,结果如图所示
4.2 实例:4个树种不同季节的细根生物量
细根生物量反映了根系从土壤中吸收水分和养分的能力,是植物地下部分碳汇集能力重要体现。不同树种细根生物量存在差异性,各树种细根生物量在不同季节间差异较为明显。假设某大学分别于春季、夏季、秋季对马尾松、樟树、杉木、桂花 4 个树种进行观察,并记录了不同树种的细根生量,具体如表所示。
根据表的数据,将“季节”一列的数据作为x轴的刻度标签,将其他列的数据作为y轴的数据,绘制马尾松、樟树、杉木、桂花的细根生物量的误差棒图,具体代码如下。
# 10_fine_root_biomass
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 准备 x轴和y轴的数据
x = np.arange(3)
yl = np.array([2.04,1.57,1.63])
y2 = np.array([1.69,1.61,1.64])
y3 = np.array([4.65,4.99,4.94])
y4 = np.array([3.39,2.33,4.10])
# 指定测量偏差
error1 = [0.16,0.08,0.10]
error2 = [0.27,0.14,0.14]
error3 = [0.34,0.32,0.29]
error4 = [0.23,0.23,0.39]
bar_width = 0.2
# 绘制柱形图
plt.bar(x,yl,bar_width)
plt.bar(x + bar_width,y2,bar_width, align="center",
tick_label=["春季","夏季","秋季"])
plt.bar(x + 2*bar_width,y3,bar_width)
plt.bar(x + 3*bar_width, y4, bar_width)
# 绘制误差棒 : 横杆大小为 3,线条宽度为 3,线条颜色为黑色,数据点标记为像素点plt.errorbar(x,yl,yerr=errorl,capsize=3,elinewidth=2, fmt='k,')
plt.errorbar(x + bar_width, y2, yerr=error2, capsize=3,
elinewidth=2,fmt='k,')
plt.errorbar(x + 2*bar_width, y3, yerr=error3, capsize=3,
elinewidth=2,fmt='k,')
plt.errorbar(x + 3*bar_width, y4, yerr=error4, capsize=3,
elinewidth=2,fmt='k,')
plt.show()
运行代码,结果如图所示:
图中,x轴代表季节,y轴代表细根生物量,蓝色、橙色、绿色、红色的柱形依次代表马尾松、樟树、杉木、桂花,柱形上方的黑色短线代表误差棒。由图可知,杉木的细根生物量最多,说明杉木吸收水分和养分的能力最强 ; 樟树的细根生物量最少,说明樟树吸收水分和养分的能力最弱。
使用面向对象API绘制误差棒图
#创建对象
fig = plt.figure()
ax = fig.add_subplot(111)
#添加数据
x=np.arange(6) #添加5个误差棒
y=(25,32,34,20,25,30)
y_offset = (3,5,2,3,3,4)
#绘制并展示误差棒图
ax.errorbar(x,y,yerr=y_offset,capsize=3,capthick=2)
plt.show()