上一节我们讲了柱状图的画法,这节课我们继续讲述直方图、散点图、饼图的画法。
直方图
直方图一般用来描述等距数据,柱状图一般用来描述名称(类别)数据或顺序数据。直观上,直方图各个长条形是衔接在一起的,表示数据间的数学关系;条形图各长条形之间留有空隙,区分不同的类。直方图比较常见于统计数据的分布情况,比如统计样本的几种分布区间。
绘制直方图使用plt.hist()函数:
plt.hist(data,bins,facecolor,edgecolor)
其中,常用的四个参数含义分别为:
data绘图用到的数据
bins控制直方图区间个数
facecolor矩形的填充颜色
edgecolor条形的边框颜色
比如我们用250个电影的时长统计电影时长的主要分布区间,就可以绘制直方图进行观测:
from matplotlib import pyplot as plt
from matplotlib import font_manager
from matplotlib.font_manager import FontProperties
my_font = FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=10)
time = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114,
119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99,
136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144,
105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123,
117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116,
108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125,
138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,
107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109,
106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123,
111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109,
141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103,
130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98,
117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111,
101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116,
111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
# 设置分组间距为2
distance = 2
# 计算组数
group_num = int((max(time) - min(time)) / distance)
# 创建画布
plt.figure(figsize=(14, 8), dpi=100)
# 绘制直方图
plt.hist(time, bins=group_num,facecolor='y', edgecolor='r')
# 修改x轴刻度显示
plt.xticks(range(min(time), max(time))[::2])
# 添加网格显示
plt.grid(linestyle=":", alpha=0.5)
# 添加x, y轴和图片标题信息
plt.xlabel("电影时长(h)",fontproperties=my_font)
plt.ylabel("电影的数据量(部)",fontproperties=my_font)
plt.title("250组电影数据分析",fontproperties=my_font)
# 显示图像
plt.show()
从这张图中,可以清楚地看出电脑时间最常分布在110到120分钟之间。大家学会了吗?
下面我们介绍一下直方图与普通柱形图的区别:
- 柱形图中用柱形的高度表示各类别的数值,横轴表示类别,宽度是固定的;而直方图是用矩形的高度表示每一组的频数或频率,宽度则表示各组的组距,因此其高度与宽度均有意义。
- 直方图主要用于展示连续型数值型数据,所以各矩形通常是连续排列的;而柱形图主要用于展示分类型数据,常常是分开排列的。
散点图
散点图是判断变量之间是否存在数量关联趋势,展示离群点。每个点的坐标位置由变量的值决定,并由一组不连接的点完成,用于观察两种变量的相关性。例如,身高—体重、温度—维度。
绘制散点图用到的函数是:
plt.scatter(x,y,s,c,marker,alpha,linewidths)
其中,七个常见参数的含义分别为:
x,y表示点的横纵坐标,实际使用中通常传递两个维度一样的列表;
s散点图中点的大小;
c散点图中点的颜色;
marker:散点图的形状,该形状表示符号和折线图端点形状表示符号相同;
alpha:表示透明度,在 0~1 取值;
linewidths:表示线条粗细。
这些参数之中,只有x和y必须给定。如果想要在一张画布上绘制多个散点图,设置方法也和折线图是一样的。
下面我们尝试绘制一张散点图:
import pandas as pd
from matplotlib import pyplot as plt
x=[178,167,175,154,180]
y=[152,168,144,155,150]
x1=[160,165,170,172,164,167]
y1=[150,158,162,152,163,149]
# 使用scatter绘制散点图
plt.scatter(x1,y1,alpha=0.5,c='g',marker='.')
plt.scatter(x,y,alpha=1,c='b')
plt.show()
至于添加图例等,方法也和之前一样。
饼图
饼图是展示分类数据的占比情况,即某个部分占整体的比重,比如贫穷人口占总人口的百分比。饼图的整个圆代表总数据,各个扇形表示每项数据,我们可以根据扇形的角度清楚地看出每个扇形占总数据的比例。
绘制饼图的方法为:
plt.pie(x, labels, autopct, shadow, startangle)
其中,五个常见参数的含义分别为:
x绘制用到的数据
labels用于设置饼图中每一个扇形外侧的显示说明文字
autopct设置饼图内百分比数据,可以使用format字符串或者format function保留小数位数。例如’%.1f%%’指小数点后保留1位小数
shadow表示是否在饼图下面画阴影,默为False,即无阴影
startangle设置起始绘制角度,默认图是从x轴正方向逆时针画起,如果设定startangle=90,则从y轴正方向画起
下面我们用一个表格展示如何绘制饼图:
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=10)
df = pd.read_excel('lagou.xlsx')
plt.figure(figsize = (10,8))
num = df.groupby('学历').size() # 获取表格中包含的所有学历及每个学历对应的人数
# num为Series类型,可以设置其列索引为对应扇形外侧的显示说明文字
# 绘制饼图
patches, l_text, p_text = plt.pie(num,labels = num.index, autopct='%.1f%%',startangle=90)
for t in l_text:
t.set_fontproperties(my_font)
plt.show()
plt.pie()方法可以接受Series类型的数据,并且自动求出各部分的占比。当然也可以传入列表类型的数据,稍后我们再介绍。
plt.pie()会有三个返回值:
patches: matplotlib.patches.Wedge列表(扇形实例)
l_text:label matplotlib.text.Text列表(标签实例)
p_text:label matplotlib.text.Text列表(百分比标签实例)
我们想要在扇形外面添加标签实例,需要在plt.pie()方法中提供载有需添加的实例列表,然后通过set_fontproperties()方法设置自定义字体。
虽然介绍起来有些复杂,但是我们在实际使用的时候,只需要依照这个套路写代码即可。下面我们再来试一下传递两个列表给plt.pie()方法:
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=10)
figure=[10,8,5,15,20]
edu=['高中','高职','博士','研究生','本科']
# 绘制饼图
patches, l_text, p_text = plt.pie(figure,labels = edu, autopct='%.1f%%',startangle=90)
for t in l_text:
t.set_fontproperties(my_font)
plt.show()
大家学会了吗?
本节主要讲述了主要的几个常见图像的绘制,至于对图层和画布的设置,则是和折线图中介绍的方法一样。统计学中经常会用到这些图,每种图都有固定的绘制方法,我们只需要注意对应参数的调整和设置图层及画布的语句位置即可。