python可视化——图的绘制(气泡图)
00 前言
大学期间毕业论文以及大创项目都使用到了python进行机器学习,虽然机器学习部分并不是很深入,但是涉及的面对于目前的我来说仍然有些广泛。除了对数据的处理让我有些吃力,绘图更是让零基础的我摸不着头脑。之前都是直接从网上搜集到的代码,也没有去深入解读每一行的意思,思来想去,这样始终不是解决问题的办法,因此,打算从目前开始好好地把绘图部分整理一下。
01 概述
气泡图(Bubble)是一种多变量图表,是散点图 的变体,也可以认为是散点图和百分比区域图的组合。 其可用于展示三个变量之间的关系,和散点图一样,绘制时将一个变量放在横轴,另一个变量放在纵轴,而第三个变量则用气泡的大小来表示。
排列在工作表的列中的数据(第一列中列出x值,在相邻列中列出相应的y值和气泡大小的值)可以绘制在气泡图中。
气泡图与散点图相似,不同之处在于:气泡图允许在图表中额外加入一个表示大小的变量进行对比,而第四维度的数据则可以通过不同的颜色来表示(甚至在渐变中使用阴影来表示)。
另一种使用气泡元素的流行方法是使用气泡地图。在气泡地图中,x和y分别代表一个地理位置的经纬坐标。在不要求定位非常精确的情况下,气泡地图可以将数据的相对集中度完美地体现在地理背景中。
此外,表示时间维度的数据时,可以将时间维度作为直角坐标系中的一个维度,或者结合动画来表现数据随着时间的变化情况。
气泡图通常用于比较和展示不同类别圆点(这里我们称为气泡)之间的关系,通过气泡的位置以及面积大小。从整体上看,气泡图可用于分析数据之间的相关性。
但需要注意的是,气泡图的数据大小容量有限,气泡太多会使图表难以阅读。但是可以通过增加一些交互行为弥补:隐藏一些信息,当鼠标点击或者悬浮时显示,或者添加一个选项用于重组或者过滤分组类别。
最后,气泡的大小是映射面积而非半径或直径,如果是基于半径或者直径,圆的大小不仅会呈现指数级的变化,而且还会导致视觉上的误差。如图1所示。
▲图1 气泡图
02 Matplotlib
由于是零基础,所以直接使用现成的库会轻松很多,先从Matplotlib库开始介绍一些必要的参数吧。
贴上详细的介绍:Matplotlib 教程
介绍
Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。这里将会探索 matplotlib 的常见用法。
pylab
pylab 是 matplotlib 面向对象绘图库的一个接口。它的语法和 Matlab 十分相近。也就是说,它主要的绘图命令和 Matlab 对应的命令有相似的参数。
初始实例
先从正弦余弦函数图像开始吧。
x1# 引入需要的库
2import numpy as np
3import matplotlib.pyplot as plt
4
5# 解决中文显示问题
6plt.rcParams['font.sans-serif'] = ['SimHei']
7plt.rcParams['axes.unicode_minus'] = False
8
9# 生成所需的数据
10X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
11C, S = np.cos(X), np.sin(X)
12
13# 绘图
14plt.plot(X, C, label='sin')
15plt.plot(X, S, label='cos')
16
17# 设置横轴的上下限
18plt.xlim(-4, 4)
19plt.ylim(-1, 1)
20
21# 设置图例的函数
22plt.legend(loc="upper left") # upper lower / right left
23
24# 标题
25plt.title("正弦余弦图像")
26
27# 显示(没有这个就无法显示出来)
28plt.show()
- X 是一个 numpy 数组,包含了从 −π 到 +π 等间隔的 256 个值。
- C 和 S 则分别是这 256 个值对应的余弦和正弦函数值组成的 numpy 数组。
- plot函数
- xlim / ylim函数
- legend函数
plot函数
函数功能:
展现变量的趋势变化。
函数语法:
11plt.plot(x, y, ls="-", lw=2, label=“plot figure”)
参数说明:
y: y轴上的数值
ls:折线图的线条风格('-', '–', '-.', ':', 'None', ' ', '', 'solid', 'dashed', 'dashdot', 'dotted')
lw:折线图的线条宽度
label:标记图内容的标签文本(需要结合legend使用)
注意:上面格式中单引号和双引号可以相互替换
legend函数
函数功能:
设置图例的字体、大小、颜色等属性,制定个性化。
函数语法:
11plt.legend(loc="upper left")
参数说明:
loc:指代地理位置(upper lower / right left)
其余参数见:legend参数详解
注意:如果在plot设置了label参数,需要加上legend函数,才可以显示label。
03 散点图
1 plot绘制
131# 导入需要的包
2import matplotlib.pyplot as plt
3import numpy as np
4
5# 所需数据
6x = np.random.randn(100)
7y = np.random.randn(100)
8
9# 画图
10plt.plot(x, y, '.')
11
12# 显示
13plt.show()
2 scatter绘制
131# 引入所需的库
2import matplotlib.pyplot as plt
3import numpy as np
4
5# 生成数据
6a = np.random.randn(100)
7b = np.random.randn(100)
8
9# 绘图
10plt.scatter(a, b)
11
12# 显示
13plt.show()
scatter函数
函数功能:
根据x, y坐标,绘制散点;可更改点的颜色(c)、大小(s)、形状(marker)等
函数语法:
11plt.scatter(x, y, s=None, c=None, marker=None, cmap=None)
参数说明:
x:指定 X 轴数据。
y:指定 Y 轴数据。
s:指定散点的大小。
c:指定散点的颜色。
alpha:指定散点的透明度。
linewidths:指定散点边框线的宽度。
edgecolors:指定散点边框的颜色。
marker:指定散点的图形样式。
cmap:指定散点的颜色映射,会使用不同的颜色来区分散点的值。
其余参数见:scatter参数详解
与plot区别:scatter绘制散点,plot绘制经过点的曲线。
简单的散点图,用plot方法绘制速度会更快,scatter方法则慢一点,所以只有当颜色和大小超过了一定数量时,才推荐使用scatter方法。
04 气泡图
易知,scatter更适合绘制复杂的气泡图。
271# 引入所需库
2import numpy as np
3import matplotlib.pyplot as plt
4
5# 生成数据
6x = np.random.randn(10)
7y = np.random.randn(10)
8s = 40 * np.arange(10)
9c = np.random.choice(np.arange(4), 10)
10
11# 画图
12fig, ax = plt.subplots()
13scatter = ax.scatter(x=x, y=y, s=s, c=c)
14
15# 气泡分类图例
16legend1 = ax.legend(*scatter.legend_elements(prop='colors'),
17 loc='upper left', title='colors',
18 bbox_to_anchor=(1, 0, 0.5, 1))
19ax.add_artist(legend1)
20
21# 气泡大小图例
22legend2 = ax.legend(*scatter.legend_elements(prop='sizes', num=6),
23 loc='lower left', title='sizes',
24 bbox_to_anchor=(1, 0, 0.5, 1))
25
26# 显示图
27plt.show()
scatter.legend_elements函数
scatter函数的返回值为一个PathCollections对象,通过其legend_elements方法,可以获得绘制图例所需的信息.
1. 颜色图例
legend_elements方法默认返回的就是colors的信息,可以直接用于绘制图例,代码如下
101import numpy as np
2import matplotlib.pyplot as plt
3
4x = np.random.randn(10)
5y = np.random.randn(10)
6s = 40 * np.arange(10)
7c = np.random.choice(np.arange(4), 10)
8scatter = plt.scatter(x=x, y=y, s=s, c=c)
9plt.legend(*scatter.legend_elements())
10plt.show()
注意,其中*号是必须的,上述代码会将所有颜色都显示在图例上,输出结果如下
当颜色的值为连续型变量时,采用colorbar的图例更加直观,代码如下
121import numpy as np
2import matplotlib.pyplot as plt
3
4x = np.random.randn(10)
5y = np.random.randn(10)
6s = 40 * np.arange(10)
7c = np.random.choice(np.arange(4), 10)
8
9scatter = plt.scatter(x=x, y=y, s=s, c=c)
10plt.colorbar(scatter)
11
12plt.show()
输出结果如下
2. 点的大小图例
legend_elements方法是有很多参数可以调整的,其中prop参数指定返回的信息,有两种取值,默认是colors, 表示返回的是点的颜色信息,取值为sizes时,返回的是点的大小信息。另外还有一个参数是num, 当图例的取值为连续型时,num指定了图例上展示的点的个数,用法如下
121import numpy as np
2import matplotlib.pyplot as plt
3
4x = np.random.randn(10)
5y = np.random.randn(10)
6s = 40 * np.arange(10)
7c = np.random.choice(np.arange(4), 10)
8
9scatter = plt.scatter(x=x, y=y, s=s, c=c)
10plt.legend(*scatter.legend_elements(prop='sizes', num=6))
11
12plt.show()
输出结果如下
3. 组合图例
上述的可视化效果都比较简单,通过matplotlib.pyplot就可以搞定了,对于图例的组合,需要借助axes来实现,代码如下
191import numpy as np
2import matplotlib.pyplot as plt
3
4x = np.random.randn(10)
5y = np.random.randn(10)
6s = 40 * np.arange(10)
7c = np.random.choice(np.arange(4), 10)
8
9fig, ax = plt.subplots()
10scatter = ax.scatter(x=x, y=y, s=s, c=c)
11legend1 = ax.legend(*scatter.legend_elements(prop='colors'),
12 loc='upper left', title='colors',
13 bbox_to_anchor=(1, 0, 0.5, 1))
14ax.add_artist(legend1)
15legend2 = ax.legend(*scatter.legend_elements(prop='sizes', num=6),
16 loc='lower left', title='sizes',
17 bbox_to_anchor=(1, 0, 0.5, 1))
18
19plt.show()
输出结果如下
从这里也可以看出,对于简单的图片展示,pyplot模块为我们提供了便利,但是复杂的图形组合,还是需要用axes来实现。
05 参考文献
- matplotlib基础绘图命令之scatter
- 什么是气泡图?怎样用Python绘制?怎么用?终于有人讲明白了
- 用python的Matplotlib库画散点图、气泡图和箱线图
- Python Matplotlib.axes.Axes.add_artist()用法及代码示例
- 在Python中用matplotlib作图时,若多个子图的图例相同,那怎样将该图例在总图上显示出来?
- Matplotlib 教程