matplotlib

1.什么是matplotlib

matplotlib: 最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建

  1. 能将数据进行可视化,更直观的呈现
  2. 使数据更加客观更具说服力

2.安装

1
pip install matplotlib

3.基本使用

1.绘图

每隔两个小时(range(2,26,2))的气温(℃)分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],使用matplotlib将数据可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#导入pyplot
from matplotlib import pyplot as plt

x = range(2, 26, 2)#数据在x轴的位置是一个可迭代的对象
y = [15, 13, 14.5, 17, 20, 25, 26, 26, 27, 22, 18, 15]#数据在y轴的位置是一个可迭代的对象

# 设置图片大小
# dpi可以控制图片清晰度
plt.figure(figsize=(20, 8), dpi=80)

# 绘图
# 传入x和y,通过plot绘制出折线图
plt.plot(x, y)

# 保存图片
plt.savefig("./t1.png")

# 在程序执行的时候展示图片
plt.show()

image-20230117122122905

可以发现x轴的刻度与我们定义的的刻度不一样

2.调整X或者Y轴上的刻度

1
2
3
4
5
6
7
8
# 设置x轴的刻度
# 当刻度太密集时候使用列表的步长(间隔取值)来解决,matplotlib会自动帮我们对应
plt.xticks(x[::1])
# 对列表进行迭代
# plt.xticks([i / 2 for i in range(2, 49)])

# 设置y轴的刻度
plt.yticks(range(min(y), max(y) + 1))

image-20230117122526826

实践

如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况?
a= [random.randint(20,35) for i in range(120)]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from matplotlib import pyplot as plt
import random

x = range(120)

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)]
# 取步长,数字和字符串一一对应,数据的长度一样
plt.xticks(x[::3], _xtick_labels[::3], rotation=45) # rotation旋转的度数

plt.show()

image-20230117122908512

可以发现中文无法正确显示

为什么无法显示中文:

matplotlib默认不支持中文字符,因为默认的英文字体无法显示汉字

3.设置中文显示

在一开始加入

1
2
# 设置中文显示
plt.rcParams["font.sans-serif"] = ["SimHei"]

image-20230117123143617

那么x轴y轴和当前图形到底表示什么是不是应该明确一下呢?

4.添加描述信息

1
2
3
4
# 添加描述消息
plt.xlabel("时间")
plt.ylabel("温度 单位(°C)")
plt.title("10点到12每分钟气温的变化情况")

image-20230117123627695

5.自定义绘制图形的风格

image-20230117124149529

image-20230117124244713

6.图例

1
2
3
4
5
6
# label和legend一起使用设置图例
plt.plot(x, y1, label="自己", color="orange", linestyle=":", linewidth=5)
plt.plot(x, y2, label="同桌", color="cyan", linestyle="--")

# 添加图例(loc设置图例位置)
plt.legend(loc=0)

4.常用统计图

折线图:以折线的上升或下降来表示统计数量的增减变化的统计图

特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)

直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。

一般用横轴表示数据范围,纵轴表示分布情况。

特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)

条形图:排列在工作表的列或行中的数据可以绘制到条形图中。

特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)

散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量

之间是否存在某种关联或总结坐标点的分布模式。

特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)

折线图的更多应用场景

  • 呈现公司产品(不同区域)每天活跃用户数
  • 呈现app每天下载数量
  • 呈现产品新功能上线后,用户点击次数随时间的变化
  • 呈现员工每天上下班时间

1.绘制散点图

scatter方法可以绘制散点图

获取北京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]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from matplotlib import pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]

y3 = [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]

y10 = [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]

x3 = range(1, 32)
x10 = range(51, 82)

# 设置图片大小
plt.figure(figsize=(20, 8), dpi=80)

# scatter绘制散点图
plt.scatter(x3, y3, label="3月")
plt.scatter(x10, y10, label="10月")

# 调整x轴的刻度
_x = list(x3) + list(x10)
_xtick_labels = ["3月{}".format(i) for i in x3]
_xtick_labels += ["10月{}".format(i) for i in x3]
plt.xticks(_x, _xtick_labels, rotation=45)

# 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("标题")

# 设置图例
plt.legend()

# 展示
plt.show()

image-20230117130223913

散点图的更多应用场景

  • 不同条件(维度)之间的内在关联关系
  • 观察数据的离散聚合程度

2.绘制条形图

barh绘制条形图

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.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23] 单位:亿

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from matplotlib import pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]

x = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机6:终章","乘风破浪","神偷奶爸3","智取威虎山","大闹天竺","金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传","银河护卫队2","情圣","新木乃伊",]

y = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

plt.figure(figsize=(20, 8), dpi=100)

# 绘制横着的条形统计图(height设置条形的宽度)
plt.barh(range(len(x)), y, height=0.5, color="orange")

plt.yticks(range(len(x)), x)

# 绘制网格
plt.grid()

plt.show()

image-20230117130716640

电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,应该如何更加直观的呈现该数据?

a = [“猩球崛起3:终极之战”,”敦刻尔克”,”蜘蛛侠:英雄归来”,”战狼2”]

b_16 = [15746,312,4497,319]

b_15 = [12357,156,2045,168]

b_14 = [2358,399,2358,362]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from matplotlib import pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]

a = ["猩球崛起3:终极之战", "敦刻尔克", "蜘蛛侠:英雄归来", "战狼2"]
b_14 = [2358, 399, 2358, 362]
b_15 = [12357, 156, 2045, 168]
b_16 = [15746, 312, 4497, 319]

# 规定宽度
bar_width = 0.2

plt.figure(figsize=(20, 8), dpi=80)

# 添加多个条形需要向左右偏移,否则图形将画在一起
plt.bar([i - bar_width for i in range(len(a))], b_14, width=bar_width, label="9月14日")
plt.bar(range(len(a)), b_15, width=bar_width, label="9月15日")
plt.bar([i + bar_width for i in range(len(a))], b_16, width=bar_width, label="9月16日")

plt.xticks(range(len(a)), a)

plt.legend()

plt.show()

条形图的更多应用场景

  • 数量统计
  • 频率统计(市场饱和度)

3.绘制直方图

hist绘制直方图

获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,你应该如何呈现这些数据?

a=[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]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from matplotlib import pyplot as plt
plt.figure(figsize=(20, 8), dpi=80)

a=[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]

# 设置组距
bin_width = 3

# 计算组数
num_bins = (max(a) - min(a)) // bin_width

# 绘制直方图(density将y轴设置为频率分布直方图)
plt.hist(a, num_bins, density=True)

# 设置x轴的刻度
plt.xticks(range(min(a), max(a) + bin_width, bin_width))

plt.grid()

plt.show()

image-20230117132426522

直方图更多应用场景

  • 用户的年龄分布状态
  • 一段时间内用户点击次数的分布状态
  • 用户活跃时间的分布状态

4.matplotlib更多的图形样式

matplotlib支持的图形是非常多的,如果有其他的需求,我们可以查看一下url地址:http://matplotlib.org/gallery/index.html

5.更多的绘图工具

plotly:可视化工具中的github,相比于matplotlib更加简单,图形更加漂亮,同时兼容matplotlib和pandas

使用用法:简单,照着文档写即可

文档地址: https://plot.ly/python/