Python绘制密度散点图

发布时间 2023-11-14 00:25:54作者: GEOLI

科研论文中,不管是数据介绍还是结果展示,免不了要使用散点图。最简单的即为x+y轴的二维散点图。python提供了丰富的API如matplotlib,让我们可以“一键成图”。可是默认的参数一言难尽,肯定满足不了导师、编辑、审稿人的要求。因此二次修饰是必须的。

本文介绍一种用于绘制大量xy坐标时的密度散点图,可用于区分数据聚集与稀疏的区域,效果如下:

image

具体绘图代码如下

  1. 导入必备的库,包含了耳熟能详的numpy, matplotlib两位元老级别的库,以及scipy中的核密度估计模块
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
np.random.seed(2023)
  1. 定义密度绘图函数
    if ax is None :
        fig , ax = plt.subplots()
    xy = np.vstack([x,y])
    z = gaussian_kde(xy)(xy)
    idx = z.argsort()
    x, y, z = x[idx], y[idx], z[idx]
    ax.scatter(x, y,c=z,cmap='Spectral_r')
    if is_cbar:
        norm = Normalize(vmin = np.min(z), vmax = np.max(z))
        cbar = plt.colorbar(cm.ScalarMappable(norm = norm,cmap='Spectral_r'), ax=ax)
        cbar.ax.set_ylabel('Density')

    return ax
  1. 生成样例数据
x = np.random.normal(size=800)
y = x + np.random.normal(size=800)
fig = plt.figure()
ax = fig.add_subplot(111)
# ax.scatter(x,y)
density_scatter(x=x,y=y,ax=ax,is_cbar=False)
  1. 加上colorbar(由于colorbar占空间,导致左侧的图横向受到了压缩,后期可微调)
density_scatter(x=x,y=y,ax=ax,is_cbar=True)

image