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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 11:45:04