常用的统计图有散点图, 折线图, 条形图和直方图, 在前面我们已经讲解了折线图的基本实现,但其实绘制其他图形和折线图比起来也是相差不多的, 下面就来逐个讲解他们的不同之处吧
下面给出一个matplotlib绘制散点图的实例代码
from matplotlib import pyplot as plt
from matplotlib import font_manager
"""
题目:
假设通过爬虫你获取到了重庆2019年3月,10月份的每天的平均气温(分别别位于列表a, b),那么
此时如何寻找出气温和随时间(天)变化的某种规律
y_3 = ['15', '11', '18', '12', '14', '13', '13', '12', '15', '20', '22', '17', '15', '13', '15', '18', '17', '22', '25', '26', '22', '12', '11', '12', '20', '21', '20', '25', '30', '18', '15']
y_10 = ['30', '29', '30', '22', '22', '27', '23', '21', '21', '22', '22', '22', '23', '19', '18', '19', '23', '24', '26', '18', '18', '19', '18', '20', '14', '14', '16', '20', '22', '23', '23']
数据来源:
"""
# 重庆3月份的天气气温
y_3 = ['15', '11', '18', '12', '14', '13', '13', '12', '15', '20', '22', '17', '15', '13', '15', '18', '17', '22', '25',
'26', '22', '12', '11', '12', '20', '21', '20', '25', '30', '18', '15']
# 重庆10月份的最高气温
y_10 = ['30', '29', '30', '22', '22', '27', '23', '21', '21', '22', '22', '22', '23', '19', '18', '19', '23', '24',
'26', '18', '18', '19', '18', '20', '14', '14', '16', '20', '22', '23', '23']
x_3 = range(1, 32)
x_10 = range(51, 82)
# 设置字体
my_font = font_manager.FontProperties(fname=r'C:\Windows\Fonts\simkai.ttf')
plt.figure(figsize=(20, 8), dpi=100)
# 绘制散点图, 添加图例
plt.scatter(x_3, y_3, label="3月份气温")
plt.scatter(x_10, y_10, label="10月份气温")
# 设置x轴的坐标刻度
_x = list(x_3) + list(x_10)
x_ticks_label = ["3月{}日".format(i) for i in x_3]
x_ticks_label += ["10月{}日".format(i - 50) for i in x_10]
plt.xticks(_x[::3], x_ticks_label[::3], fontproperties=my_font, rotation=45)
# 设置图例
plt.legend(prop=my_font, loc="upper left")
# 添加图像描述
plt.xlabel("时间", fontproperties=my_font)
plt.ylabel("日期", fontproperties=my_font)
plt.title("重庆三月份和十月份气温对比散点图", fontproperties=my_font)
plt.savefig('./重庆气味散点图.png')
plt.show()
代码运行之后的结果
可以看出,绘制散点图的方法和绘制折线图的方法就只有一点不同
条形图实例:
"""
练一练:
假设你获取到了2018年内地电影票房前20的电影(列表a)和电影票房数据(列表b)
那么应该如何更加直观的展示数据该数据
a = ['红海行动', '唐人街探案2', '我不是药神', '西虹市首富', '复仇者联盟3:无限战争', '捉妖记2', '海王', '毒液:致命守护者', '侏罗纪世界2', '头号玩家', '后来的我们', '一出好戏', '无双', '碟中谍6:全面瓦解', '巨齿鲨', '狂暴巨兽', '超时空同居', '蚁人2:黄蜂女现身', '无名之辈', '无问西东']
b = [36.22, 33.71, 30.75, 25.27, 23.7, 22.19, 19.97, 18.56, 16.82, 13.85, 13.5
13.44, 12.63, 12.34, 10.43, 9.94, 8.25, 7.88, 7.47]
数据来源: http://58921.com/alltime/2018
"""
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r'C:\Windows\Fonts\simkai.ttf')
# 设置画布大小
plt.figure(figsize=(20, 8), dpi=80)
a = ['红海行动', '唐人街探案2', '我不是药神', '西虹市首富', '复仇者联盟3:无限战争', '捉妖记2', '海王', '毒液:致命守护者', '侏罗纪世界2', '头号玩家', '后来的我们', '一出好戏', '无双', '碟中谍6:全面瓦解', '巨齿鲨', '狂暴巨兽', '超时空同居', '蚁人2:黄蜂女现身', '无名之辈', '无问西东']
b = [36.22, 33.71, 30.75, 25.27, 23.7, 22.19, 19.97, 18.56, 16.82, 13.85, 13.5,
13.44, 12.63, 12.34, 10.43, 9.94, 8.25, 7.88, 7.47, 6.5]
# 绘制横着的条形图,设置高度用height
plt.barh(range(len(a)), b, height=0.5, color="orange")
# plt.bar(range(len(a)), b, width=0.5, color="orange") # 绘制竖着的条形图,设置宽度用width
plt.yticks(range(len(a)), a, fontproperties=my_font)
# 添加图形描述
plt.ylabel("电影名称", fontproperties=my_font)
plt.xlabel("电影票房", fontproperties=my_font)
plt.title("2018年排名前20的电影", fontproperties=my_font)
# 增加网格
plt.grid(alpha=0.5)
plt.show()
绘制的条状图如下
值得注意的是:绘制竖向折线图使用plt.bar, 绘制横向折线图使用plt.barh
matplotlib绘制直方图如下:
"""
练一练:
假设你获取了250部电影的时长(列表a中),希望统计出这些电影
市场的分布状态(比图时长为100分钟到120分钟电影的数量, 出现的频率)等信息,
你应该如何呈现这些数据?
time = [114, 143, 116, 91, 134, 134, 108, 138, 99, 137, 98, 108, 140, 87, 110, 143, 123, 133, 143, 150, 146, 96, 80, 102, 81, 120, 81, 136, 139, 83, 115, 102, 115, 99, 141, 134, 131, 84, 93, 119, 119, 147, 90, 129, 113, 106, 138, 134, 84, 105, 112, 128, 86, 111, 108, 149, 92, 107, 125, 108, 94, 84, 131, 125, 87, 87, 120, 115, 110, 145, 100, 89, 150, 84, 139, 85, 131, 124, 126, 137, 81, 82, 83, 94, 87, 117, 108, 128, 117, 123, 145, 96, 118, 133, 115, 89, 144, 124, 119, 81, 138, 93, 114, 129, 109, 99, 90, 146, 132, 144, 106, 138, 132, 145, 143, 140, 125, 83, 137, 83, 135, 107, 150, 117, 82, 116, 106, 147, 87, 83, 126, 115, 80, 139, 111, 113, 112, 124, 88, 87, 111, 146, 140, 113, 81, 115, 94, 136, 129, 142, 146, 150, 117, 98, 81, 84, 104, 85, 149, 133, 119, 89, 134, 105, 130, 124, 84, 92, 110, 147, 104, 112, 83, 89, 88, 89, 134, 111, 135, 106, 106, 96, 129, 147, 111, 137, 107, 109, 142, 80, 83, 101, 120, 110, 140, 121, 102, 132, 118, 119, 140, 107, 89, 148, 133, 135, 148, 96, 138, 136, 120, 83, 100, 88, 146, 85, 99, 113, 83, 80, 132, 87, 81, 87, 148, 87, 90, 148, 143, 137, 90, 88, 118, 92, 108, 119, 144, 101, 140, 96, 111, 104, 112, 108, 137, 93, 108, 134, 126, 89]
"""
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 设置字体
my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simkai.ttf")
time = [114, 143, 116, 91, 134, 134, 108, 138, 99, 137, 98, 108, 140, 87, 110, 143, 123, 133, 143, 150, 146, 96, 80, 102, 81, 120, 81, 136, 139, 83, 115, 102, 115, 99, 141, 134, 131, 84, 93, 119, 119, 147, 90, 129, 113, 106, 138, 134, 84, 105, 112, 128, 86, 111, 108, 149, 92, 107, 125, 108, 94, 84, 131, 125, 87, 87, 120, 115, 110, 145, 100, 89, 150, 84, 139, 85, 131, 124, 126, 137, 81, 82, 83, 94, 87, 117, 108, 128, 117, 123, 145, 96, 118, 133, 115, 89, 144, 124, 119, 81, 138, 93, 114, 129, 109, 99, 90, 146, 132, 144, 106, 138, 132, 145, 143, 140, 125, 83, 137, 83, 135, 107, 150, 117, 82, 116, 106, 147, 87, 83, 126, 115, 80, 139, 111, 113, 112, 124, 88, 87, 111, 146, 140, 113, 81, 115, 94, 136, 129, 142, 146, 150, 117, 98, 81, 84, 104, 85, 149, 133, 119, 89, 134, 105, 130, 124, 84, 92, 110, 147, 104, 112, 83, 89, 88, 89, 134, 111, 135, 106, 106, 96, 129, 147, 111, 137, 107, 109, 142, 80, 83, 101, 120, 110, 140, 121, 102, 132, 118, 119, 140, 107, 89, 148, 133, 135, 148, 96, 138, 136, 120, 83, 100, 88, 146, 85, 99, 113, 83, 80, 132, 87, 81, 87, 148, 87, 90, 148, 143, 137, 90, 88, 118, 92, 108, 119, 144, 101, 140, 96, 111, 104, 112, 108, 137, 93, 108, 134, 126, 89]
# 设置图像大小
plt.figure(figsize=(20, 8), dpi=80)
# 设置组距
d = 2
# 设置组数 组数 = 极差 // 组距
num_bins = (max(time) - min(time)) // d
# 绘制直方图,目前官方已经废弃normed参数,使用density来替换
plt.hist(time, num_bins, density=True)
# 设置x轴的刻度
plt.xticks(range(min(time), max(time)+d, d))
plt.grid()
plt.show()
绘制图形如下
直方图与与其他matplotlib所绘制图形差别比较大,在plt.hist方法中所要传入的参数第一个为x轴上的数据,第二个参数是组数,其中组数的公式为:
- 组数: 将数据分组,当数据在100个以内时,按数据多少常分5-12组
- 组距:指每个小组的两个端点的距离
- 组数 = 极差 // 组距,
- 极差 = 数组中的最大值 - 数组中的最小值
- 但是需要根据极差来定义,一般来说,极差越大,组距就越大
在plt.hist()方法中使用density=true就可以显示各个分组的频率
除了这些以外与其他绘制图相比也没有什么大的区别了
小结: 一般来说能够使用plt.hist方法的是那些没有统计过的数据
直方图:有一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴
表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据,展示遗嘱或者多组数据的分布状况(统计)
条形图:排列在工作表的列或行中的数据可以绘制到条形图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
散点图: 用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种
关联或总结坐标点的分布模式。
特点: 判断变量之间是否存在数量关联趋势,展示离群点。(分布规律)
当然matplotlib还能绘制更加多种多样的图形,在这里就不多加赘述了,要是想了解更多图形的绘制方法,可以去matplotlib的官网查看学习,目前