求助:如何在Python中绘制按X值条件填充的连续密度脊线图
实现按X值条件填充的连续密度脊线图
要实现单一连续密度曲线按X值(>0和<=0)分色填充的效果,不能通过hue参数拆分数据(这会生成两个独立的KDE曲线),而是需要先计算完整的KDE曲线数据,再分别填充指定区间的区域。
完整实现代码
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import numpy as np from scipy.stats import gaussian_kde # 生成数据 data = pd.DataFrame({ 'A': np.random.normal(0, 0.25, 4000), 'B': np.random.normal(0.2, 0.25, 4000), 'C': np.random.normal(0.4, 0.25, 4000) }) data_melted = pd.melt(data, var_name='recipe', value_name='values') # 为每个类别绘制带条件填充的密度图 for recipe in data_melted['recipe'].unique(): recipe_data = data_melted[data_melted['recipe'] == recipe]['values'].values # 计算KDE曲线数据 kde = gaussian_kde(recipe_data) x_vals = np.linspace(recipe_data.min() - 0.2, recipe_data.max() + 0.2, 1000) y_vals = kde(x_vals) # 创建画布 plt.figure(figsize=(8, 4)) # 填充x <= 0的区域 mask = x_vals <= 0 plt.fill_between(x_vals[mask], y_vals[mask], color='red', alpha=0.5) # 填充x > 0的区域 mask = x_vals > 0 plt.fill_between(x_vals[mask], y_vals[mask], color='blue', alpha=0.5) # 绘制连续的KDE曲线 plt.plot(x_vals, y_vals, color='black', linewidth=0.5) # 设置图表属性 plt.title(f"Ridge Plot for Recipe {recipe}") plt.xlabel('Values') plt.ylabel('Density') plt.tight_layout() plt.show()
关键说明
- 计算完整KDE曲线:使用
scipy.stats.gaussian_kde对单组数据估计密度,生成连续的x和y值序列,保证曲线是单一连续的。 - 分区间填充:通过
plt.fill_between结合掩码(x_vals <= 0和x_vals > 0),分别对曲线下方的指定区域进行填充,实现分色效果。 - 避免拆分数据:不再用
hue参数分割数据集,确保KDE曲线是基于全部数据生成的单一连续曲线。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

