15.Matplotlib-绘制散点图
扫码关注【牵引小哥讲Python】,关注回复【资源】领取学习资源!
原创作者:牵引小哥
微信公众号:牵引小哥讲Python
注:转载或复制请注明出处——牵引小哥
本期小哥主要讲解散点图的绘制方法。在Matplotlib中使用ax.scatter()
函数绘制散点图。官方参考链接:
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter
1. ax.scatter()
的基础用法
ax.scatter(x, y, s=None, c=None, marker=None, cmap=None, alpha=None, edgecolors=None, **kwargs)
关键参数说明:
- x:x轴数据序列
- y:y轴数据序列
- c:数据点的颜色,可以是单一颜色,也可是颜色序列
- marker:数据点形状(默认圆形)
- camp:可对数据点指定色谱映射
- alpha:数据点透明度
- edgecolors:数据点轮廓颜色
- **kwargs:其他参数
应用举例:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.size'] = 16
mpl.rcParams['figure.figsize'] = (6,5)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#%% 基础用法
x = np.arange(0, 6, 0.2)
y1 = x**2
y2 = (x - 5.8)**2
# 根据数据特点定义数据点颜色和大小的映射序列
colors = np.linspace(y1.min(), y1.max(), len(x)) #颜色序列与y轴数值对应
size =15 * np.linspace(1, 10, len(x))
fig, ax = plt.subplots()
ax.scatter(x, y1, s=size, c=colors, alpha=0.75, cmap='hsv')
# cmap='hsv'意为使用Matplotlib内置的‘hsv’色谱,更多讲解可参考小哥之前关于颜色的文章
plt.show()
plt.tight_layout()
可以看到,数据点的颜色和大小均随数值变化。
小哥Tips:数据点的size随数据顺序,由小变大。
接下来,小哥简单讲解下关于颜色和大小的映射顺序问题。比如我们绘制y1,y2
两个关于x = 5.8
对称的函数散点图:
# y1 = x**2
# y2 = (x - 5.8)**2
ax.scatter(x, y1, s=size, c=colors, alpha=0.75, cmap='hsv')
ax.scatter(x, y2, s=size, c=colors, alpha=0.75, cmap='viridis')
从结果可以看出,数据点的大小并不对称。为了使其对称,就需要更改数据序列的顺序,使其逆序。在这里,小哥使用数组切片技巧[: : -1]
获得元组的逆序结果。
ax.scatter(x, y1, s=size, c=colors, alpha=0.75, cmap='hsv')
ax.scatter(x[::-1], y2[::-1], s=size, c=colors, alpha=0.75, cmap='hsv')
还可以为散点图添加图例:
scatter = ax.scatter(x, y1, s=size, c=colors, alpha=0.75, cmap='hsv')
ax.legend(*scatter.legend_elements(), bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0)
不同的颜色对应不同的与y轴的数值大小对应。
2. 离散数据的散点图
对于离散的数据可以使用散点图进行可视化。
np.random.seed(0)
fig, ax = plt.subplots()
citys = ['成都', '武汉', '重庆']
colors = ['blue', 'red', 'yellow']
for i in range(len(citys)):
color = colors[i]
city = citys[i]
n = 20
x, y = np.random.rand(2, n) # 生成随机数数组
scale = 200.0 * np.random.rand(n)
ax.scatter(x, y, c=color, s=scale, label=city,
alpha=0.5, edgecolors='none')
ax.legend(loc='lower center', ncol=3, bbox_to_anchor=(0.5, 1))
ax.grid(color='k', linestyle='--', linewidth=0.2)
plt.show()
plt.tight_layout()