Python处理CSV数据时结合山脊图与散点图解决点重叠可视化问题
散点叠山脊图实现方案
前置依赖
需要提前安装pandas、matplotlib、seaborn三个库,安装命令:
pip install pandas matplotlib seaborn
完整实现代码
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import numpy as np # 设置基础绘图样式 sns.set(style="white", rc={"axes.facecolor": (0, 0, 0, 0)}) # 1. 读取并筛选数据,保留原业务逻辑 df = pd.read_csv("result.csv") filter_df = df[df["result"] > 0].copy() param_cols = df.columns[:-1].tolist() # 提取A-G参数列 # 2. 数据格式转换为长表,适配密度计算要求 melt_df = filter_df[param_cols].melt(var_name="param", value_name="value") # 3. 初始化画布 fig, ax = plt.subplots(figsize=(10, 6)) param_order = param_cols # 保持A-G的参数排序 x_ticks = np.arange(len(param_order)) bw_adjust = 0.5 # 密度曲线平滑度调整参数 # ---------------------- 绘制山脊图(频率分布) ---------------------- for i, param in enumerate(param_order): # 提取当前参数的所有有效值 values = melt_df[melt_df["param"] == param]["value"].dropna() # 临时绘制kde曲线获取密度数据 temp_kde = sns.kdeplot(values, bw_adjust=bw_adjust, cut=0, ax=ax) line = temp_kde.lines[-1] density_val = line.get_ydata() value_range = line.get_xdata() # 移除临时曲线,手动调整位置绘制山脊 line.remove() # 密度值缩放后对齐到对应参数的x轴位置,半透明填充避免遮挡散点 ax.fill_betweenx( y=value_range, x1=i - density_val/density_val.max()*0.4, x2=i + density_val/density_val.max()*0.4, alpha=0.3, color="#1f77b4" ) # ---------------------- 绘制散点(保留原逻辑) ---------------------- plot_scatter_count = min(10, len(filter_df)) # 超过10条仅取前10条 scatter_data = filter_df[param_cols].head(plot_scatter_count).T # 遍历绘制散点,zorder设为10确保散点在山脊上层显示 for sample_idx in scatter_data.columns: ax.scatter( x=x_ticks, y=scatter_data[sample_idx], marker="o", color="#ff7f0e", edgecolor="white", s=50, zorder=10 ) # ---------------------- 样式调整 ---------------------- ax.set_xticks(x_ticks) ax.set_xticklabels(param_order) ax.set_xlabel("参数名", fontsize=12) ax.set_ylabel("参数值", fontsize=12) ax.set_title("参数值分布散点+山脊图", fontsize=14) sns.despine() plt.show()
核心逻辑说明
- 山脊图部分:对每个参数的所有符合条件的样本值计算核密度,半透明填充的宽度对应数值的出现频率,无需额外坐标轴即可直观看到各参数的数值分布差异
- 散点部分:完全保留原需求逻辑,符合条件的样本数超过10时仅绘制前10条,
zorder参数设为10确保散点始终显示在山脊图上层 - 可自定义调整参数:
- 修改
bw_adjust数值:调整密度曲线平滑度,数值越小曲线越尖锐,越贴合原始数据分布 - 修改
fill_betweenx中的缩放系数0.4:调整山脊图的横向宽度,避免不同参数的山脊互相重叠 - 修改
color参数:自定义山脊、散点的配色
- 修改
内容的提问来源于stack exchange,提问作者user157522
相关产品推荐
相关产品推荐

