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
相关产品推荐
相关产品推荐

