Python绘制密度散点图
科研论文中,不管是数据介绍还是结果展示,免不了要使用散点图。最简单的即为x+y轴的二维散点图。python提供了丰富的API如matplotlib,让我们可以“一键成图”。可是默认的参数一言难尽,肯定满足不了导师、编辑、审稿人的要求。因此二次修饰是必须的。
本文介绍一种用于绘制大量xy坐标时的密度散点图,可用于区分数据聚集与稀疏的区域,效果如下:
具体绘图代码如下
- 导入必备的库,包含了耳熟能详的numpy, matplotlib两位元老级别的库,以及scipy中的核密度估计模块
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
from scipy.stats import gaussian_kde
np.random.seed(2023)
- 定义密度绘图函数
def density_scatter( x , y, ax = None, is_cbar=False, **kwargs ) :
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
- 生成样例数据
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)
- 加上colorbar(由于colorbar占空间,导致左侧的图横向受到了压缩,后期可微调)
density_scatter(x=x,y=y,ax=ax,is_cbar=True)