You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中带渐变填充的密度图绘制问题求助

实现KDE密度图的渐变填充

Seaborn的kdeplot自带的fill=True仅支持单色填充,要实现渐变填充效果,需要结合Matplotlib的底层绘图API来完成。以下是具体实现方案:

核心思路

  • 绘制KDE曲线并提取其坐标数据
  • 构造曲线与x轴围成的闭合区域
  • 为该区域应用渐变色填充

完整代码

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from matplotlib.patches import Polygon
from matplotlib.colors import Normalize

# 替换为你的实际数据
np.random.seed(42)
df = pd.DataFrame({'Overall Rating': np.random.normal(7, 1.5, 500)})

plt.figure(figsize=(6, 4))
ax = plt.gca()

# 绘制KDE曲线,获取曲线数据
sns.kdeplot(data=df, x='Overall Rating', color='black', linewidth=1.5, ax=ax)
line = ax.lines[0]
x, y = line.get_data()

# 构造填充区域的顶点(曲线+ x轴首尾点,形成闭合区域)
verts = np.column_stack([x, y])
verts = np.vstack([verts, [x[-1], 0], [x[0], 0]])

# 创建渐变色映射,这里使用viridis色阶
cmap = plt.get_cmap('viridis')
norm = Normalize(y.min(), y.max())  # 将密度值映射到0-1范围

# 创建多边形填充区域并应用渐变
poly = Polygon(verts, closed=True)
ax.add_patch(poly)
poly.set_facecolor(cmap(norm(y)))

# 调整坐标轴范围,确保底部从0开始
ax.set_ylim(bottom=0)
plt.tight_layout()
plt.show()

关键细节解释

  • ax.lines[0]用于获取KDE曲线的实例,提取的x、y坐标是构造填充区域的核心依据
  • 用Polygon创建闭合区域时,必须将曲线的首尾端点与x轴对应位置连接,保证区域闭合才能正常填充
  • 通过Normalize将曲线的y值(密度值)映射到色阶的取值范围,实现密度越高颜色越深/越亮的渐变效果

如果需要调整渐变方向(比如横向渐变而非纵向),可以修改verts的构造逻辑,或者使用LinearSegmentedColormap自定义渐变的方向和颜色区间。

内容的提问来源于stack exchange,提问作者codemachine98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 08:31:14