安装
视频学习地址
pip install matplotlib
常用统计图对比:
- 折线图:以折线的上升或者下降来表示统计数量的增减变化的统计图
- 特点:能够显示数据的变化趋势,反映事物的变化情况(变化)-plot
- 直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围,纵轴表示分布情况-hist
- 特点:绘制连续性的数据,詹氏一族或者多组数据的分布情况(统计)
- 场景:用户的年龄分布状态;一段时间内用户点击次数的分布状态;用户活跃时间的分布状态
- 条形图:排列在工作表的列或行中的数据可以绘制到条形图中。-bar/barh
- 特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
- 场景:数量统计,频率统计
- 散点图 :用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或者总结坐标点的分布模式-scatter
- 特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
- 应用场景:不同条件(维度)之间的内在关联关系;观察数据的离散聚合程度
折线图
- 简单示例
from matplotlib import pyplot as plt
x = range(2, 26, 2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
plt.plot(x, y)
plt.show()
为折线图添加更多元素(修改默认元素)
- 设置图片大小(想要一个高清无码大图)
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(20.8), dpi=80)
# figure图形图标的意思,在这里值得就是画的图,figsize,宽高,dpi像素,dpi每英寸的像素
# 通过实例化一个fihure并且传递参数,能够在后台自动使用改figure实例
# 在图像模糊的时候可以传入dpi参数,让图片更加清晰
- 保存到本地
- 描述信息,比如x轴和y轴表示什么,这个图表示什么
- 调整x或者y的刻度的间距
- 标记处特殊的点(比如告诉别人最高点和最低点)
- 给图片添加一个水印(防伪,防止盗用)
from matplotlib import pyplot as plt
x = range(2, 26, 2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 设置图片大小
plt.figure(figsize=(20,8), dpi=80)
# 绘图
plt.plot(x, y)
# 绘制x轴的刻度
plt.xticks(x) # 原生x值 # 自定义,传列表即可,[range(1,24)],
# 设置y轴的刻度
plt.xticks(range(min(y), max(y)+1))
# 保存图片,可以保存为svg这种矢量图格式,放大不会有锯齿
plt.savefig('./1.png')
plt.show()
显示中文刻度
matpoltlib默认不支持中文字符,外国人写的东西
import random
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 方式一(失败率高):
# font = {'family': 'MicroSoft YaHei',
# 'weight': 'bold',
# 'size': 'larger'}
#
# matplotlib.rc("font", **font)
# # matplotlib.rc("font", family='MicroSoft YaHei',weight='bold')
# 方式二:
my_font = font_manager.FontProperties(fname=r'c:\windows\fonts\msyh.ttc')
x = range(0,120)
y = [random.randint(20, 35) for i in range(120)]
plt.figure(figsize=(20, 8),dpi=80)
plt.plot(x,y)
# 调整x轴的刻度
_x = x[::3]
_xtick_labels = ['哈哈,{}'.format(i) for i in _x]
plt.xticks(_x, _xtick_labels, rotation=45, fontproperties=my_font)
# 添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度",fontproperties=my_font)
plt.title("时间温度图",fontproperties=my_font)
plt.show()
练习1:
x轴表示年龄,11-30岁
y轴表示女友数量
from matplotlib import pyplot as plt, font_manager
my_font = font_manager.FontProperties(fname=r'c:\windows\fonts\msyh.ttc')
y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
x = range(11,31)
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
# 设置x轴刻度
_xtrick_labels = [f'{i}岁' for i in x]
plt.xticks(x, _xtrick_labels, fontproperties=my_font)
plt.yticks(range(0,9))
# 绘制网格
plt.grid(alpha=0.4)
plt.show()
练习2:
添加两个图形
from matplotlib import pyplot as plt, font_manager
my_font = font_manager.FontProperties(fname=r'c:\windows\fonts\msyh.ttc')
y_1 = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y_2 = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]
x = range(11,31)
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y_1, label='自己',color="blue",linestyle=':', alpha=0.5) # 颜色,线条类型,透明度
plt.plot(x,y_2, label='另一个')
# 设置x轴刻度
_xtrick_labels = [f'{i}岁' for i in x]
plt.xticks(x, _xtrick_labels, fontproperties=my_font)
plt.yticks(range(0,9))
# 添加图例
plt.legend(prop=my_font,loc="upper left") # loc表示图例位置,默认右上角 注意:设置字体,是prop不是properies,只有这里是例外
# 绘制网格
plt.grid(alpha=0.4)
plt.show()
散点图
案例:假设通过爬虫获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间(天)变化的某种规律?
a = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
b = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r'c:\windows\fonts\msyh.ttc')
y_3 = [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
x_3 = range(1, 32)
x_10 = range(51, 82)
# 设置图形大小
plt.figure(figsize=(20, 8), dpi=80)
plt.scatter(x_3, y_3, label='3月份', s=100 # 可以设置点的大小,区分两个图的重合点)
plt.scatter(x_10, y_10,label = '10月分')
# 调整x轴的刻度
_x = list(x_3) + list(x_10)
_x_labels = [f"3月{i}日"for i in x_3]
_x_labels += [f"10月{i}日" for i in x_10]
plt.xticks(_x[::3], _x_labels[::3], fontproperties=my_font, rotation=45)
# 添加描述信息
plt.xlabel('时间',fontproperties=my_font)
plt.ylabel('温度',fontproperties=my_font)
plt.title('温差变化图',fontproperties=my_font)
# 添加图例
plt.legend(loc="upper left", prop=my_font)
# 展示
plt.show()
条形图
案例:假设获取了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据?
a = [“战狼2”,“速度与激情8”,“功夫瑜伽”,“西游伏妖篇”,“变形金刚5”,“最后的骑士”,“摔跤吧!爸爸”,“加勒比海盗5”,“死无对证”,“金刚”,“骷髅岛”,“极限特工:终极回归”,“生化危机6:终章”,“乘风破浪”,“神偷奶爸3”,“智取威虎山”,“大闹天竺”,“金刚狼3”,“殊死一战”,“蜘蛛侠:英雄归来”,“悟空传”,“银河护卫队2”,“情圣”,“新木乃伊”]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]
纵向:
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r'c:\windows\fonts\msyh.ttc')
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5","最后的骑士","摔跤吧!爸爸\n","加勒比海盗5","死无对证","金刚","骷髅岛","极限特工:终极回归\n","生化危机6\n终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3","殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,3.25,4.25,2.25,3.25]
plt.figure(figsize=(20, 15), dpi=80)
plt.bar(range(len(a)), b, width=0.3)
plt.xticks(range(len(a)), a, fontproperties=my_font, rotation=90)
plt.show()
横向
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r'c:\windows\fonts\msyh.ttc')
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5","最后的骑士","摔跤吧!爸爸\n","加勒比海盗5","死无对证","金刚","骷髅岛","极限特工:终极回归\n","生化危机6\n终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3","殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,3.25,4.25,2.25,3.25]
plt.figure(figsize=(20, 15), dpi=80)
plt.barh(range(len(a)), b, height=0.3, color="orange")
plt.yticks(range(len(a)), a, fontproperties=my_font)
plt.show()
直方图
from matplotlib import pyplot as plt, font_manager
import random
# 模拟随机数
a = [random.randint(80,120) for i in range(120)]
d = 5 # 组距
num_bins = (max(a)-min(a))//d
plt.hist(a, num_bins)
plt.xticks(range(min(a), max(a)+d, d))
plt.show()
常见问题总结
- 应该选择那种图形来呈现数据
- matplotlib.plot(x, y) 折线图
- matplotlib.bar(x, y) 条形图
- matplotlib.scatter(x, y) 散点图
- matplotlib.hist(data, bins.normed) 直方图
- xticks和yticks的设置
- label和tittle.grid的设置
- 绘制的大小和保存图片