matplotlib是最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建
为什么要学习matplotlib?
- 能将数据进行可视化,更直观的呈现
- 使数据更加客观、更具说服力
好了我摊牌了,以上全都是我复制的
通过下面的小例子我们来看一下matplotlib该如何简单的使用:
假设一天中每隔两个小时(range(2,26,2))的气温(℃)分别是[15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]
from matplotlib import pyplot as plt
# x轴和y轴的数据一起组成了所有要绘制出的坐标 -> (2, 15), (4, 13), (6, 14.5), balabalabla....
# 数据在x轴的位置,是一个可迭代对象
x = range(2, 26, 2)
# 数据在y轴的位置,是一个可迭代对象
y = [15, 13, 14, 5 , 17, 20, 25, 26, 27, 22, 18, 15]
# 设置图片大小
# figure图形图标的意思,通过实例化一个figure并且传递参数,能够在后台自动使用该figure实例
# 在图像模糊的时候可以传入dpi参数,让图片更加清晰
plt.figure(figsize=(20, 8), dpi=80)
# 绘图
plt.plot(x, y)
# 设置x轴的刻度
_xtick_labels = [i/2 for i in range(4, 49)]
plt.xticks(_xtick_labels[::3]) # 刻度太密集我们使用列表的步长来解决
plt.yticks(range(min(y), max(y) + 1))
# 保存 还可以保存成svg这种矢量图
plt.savefig("./t1.png")
# 展示
plt.show()
那么问题来了:
如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况?
a= [random.randint(20, 35) for i in range(120)]
from matplotlib import pyplot as plt
import random
# 这玩意不支持中文,这句话可以设置一下支持中文的字体
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
x = range(0, 120)
random.seed(10) # 设置随机种子,让不同时候随机得到的结果都一样
y = [random.randint(20, 35) for i in range(120)]
plt.figure(figsize=(20, 8), dpi=80)
# 绘图
plt.plot(x, y)
# 设置x轴的刻度
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
# 取步长,数字和字符串一一对应,数据的长度一样 rotation可以让字符串旋转90°
plt.xticks(list(x)[::3], _xtick_labels[::3], rotation=45)
# 给图像添加描述信息,可以让别人更好的观察数据
plt.xlabel("时间")
plt.ylabel("温度 单位(℃)")
plt.title("10点到12点每分钟的气温变化情况")
# 保存
plt.savefig("./t1.png")
# 展示
plt.show()
好,来点稍微不枯燥的:
假设大家在30岁的时候,根据自己的实际情况,统计出来了从11岁到30岁每年交的女(男)朋友的数量 如列表a,请绘制出该数据的折线图,以便分析自己每年交女(男)朋友的数量走势
a = [1, 0, 1, 1, 2, 4, 3, 2, 3, 4, 4, 5, 6, 5, 4, 3, 3, 1, 1, 1]
要求 y轴表示个数,x轴表示岁数,比如11岁,12岁等
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
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轴可读
_xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(x, _xtick_labels)
plt.yticks(range(0, 9))
# 绘制网格 alpha是透明度
plt.grid(alpha=0.4)
# 保存
plt.savefig("./t1.png")
# 展示
plt.show()
你看奥,14之前咱就不看了,在16岁的时候应该是初入爱河,但是又非常的放荡不羁,所以断断续续交了4个女(男)朋友,
18岁的时候成人了,多多少少成熟了一些,只谈了两个。这时候啊应该上大学了,见到好看的小哥哥小姐姐就像拥有,于是不停地修炼爱情,交往数量成上升趋势。
22岁毕业了,在大学里你已经修炼成了海王,到社会上开始全面撒网,创造了当年谈6个对象的巅峰记录。
再之后随着年龄的增长,玩不动了,逐渐趋于稳定,开始找那么最后一个人 余生鲜衣怒马,陪你看烈焰繁华。
没完呢,怎么滴也得做出个像样的图吧~
现在奥,你已经找到那个满眼都是你的女(男)朋友了,然后你俩闲着没有事想找点刺激。
假设你和你伴侣在30岁的时候,根据自己的实际情况,统计出来了你和Ta各自从11岁到30岁每年交的女(男)朋友的数量如列表a和b,请在一个图中绘制出该数据的折线图,以便比较自己和你身边这个人20年间的差异,同时分析每年交女(男)朋友的数量走势
a = [1, 0, 1, 1, 2, 4, 3, 2, 3, 4, 4, 5, 6, 5, 4, 3, 3, 1, 1, 1]
b = [1, 0, 3, 1, 2, 2, 3, 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1]
要求: y轴表示个数,x轴表示岁数,比如11岁,12岁等
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
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, 2, 1, 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="orange", linestyle=":")
plt.plot(x, y_2, label="你的女(男)朋友", color="cyan", linestyle='-.')
# 设置x轴可读
_xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks(x, _xtick_labels)
# 绘制网格
plt.grid(alpha=0.4)
# 添加图例
plt.legend(loc="upper left")
# 保存
plt.savefig("./t1.png")
# 展示
plt.show()
作为线性图的替代,可以使用以下格式化字符,在plot函数里的linestyle指定。
字符 | 描述 |
---|---|
'-' |
实线样式 |
'--' |
短横线样式 |
'-.' |
点划线样式 |
':' |
虚线样式 |
'.' |
点标记 |
plt.legend(loc=”upper left”)可以指定图例的位置,我一般直接用best。
继续分析,cyan颜色的那条线是你的伴侣,我喜欢把cyan叫“卡宴。从图片上我们可以看到你的伴侣感情经历就没你丰富,好好珍惜……哎跑题了,
总结一下我们前面都做了什么:
- 绘制了折线图(plt.plot)
- 设置了图片的大小和分辨率(plt.figure)
- 实现了图片的保存(plt.savefig)
- 设置了xy轴上的刻度和字符串(xticks)
- 解决了刻度稀疏和密集的问题(xticks)
- 设置了标题,xy轴的lable(title,xlable,ylable)
- 设置了字体(plt.rcParams[‘font.sans-serif’] = [‘Microsoft YaHei’])
- 在一个图上绘制多个图形(plt多次plot即可)
- 为不同的图形添加图例
matplotlib能够绘制折线图,散点图,柱状图,直方图,箱线图,饼图等。
但是我们需要知道不同的统计图到底能够表示出什么,以此来决定选择哪种统计图来更直观的呈现我们的数据
对比常用统计图
折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连*续性*的数据,展示一组或者多组数据的分布状况(统计)
条形图:排列在工作表的列或行中的数据可以绘制到条形图中。
特点:绘制连*离散*的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量
之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
正因为天有不测风云, 所以我们要未雨绸缪。
Macsen Chu