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

如何在Lets-Plot Kotlin中实现多轴刻度,同时展示直方图与密度图

在Lets-Plot(Kotlin)中叠加直方图与密度图的解决方案

方案1:将直方图归一化为密度刻度(匹配Seaborn默认行为)

Seaborn的sns.histplot(..., kde=True)默认会把直方图高度归一化为密度值,以此和密度图共用同一Y轴。在Lets-Plot中,你可以给geomHistogram指定y = stat(density)来实现相同效果:

// 假设数据框为df,差值列名为diff_value
letsPlot(df) { x = "diff_value" } +
    geomHistogram(
        binWidth = 1.0, // 根据数据分布调整bin宽度
        color = "white", // 柱子边框色
        fill = "#4285F4", // 柱子填充色
        y = stat(density) // 将直方图高度转换为密度
    ) +
    geomDensity(
        color = "#EA4335", // 密度线颜色
        size = 1.2 // 线条粗细
    ) +
    ggtitle("差值的分布(密度归一化)") +
    xlab("差值") +
    ylab("密度")

这个方案完全对齐Seaborn的默认表现,无需处理双轴,是最直接的替代方案。

方案2:使用双Y轴保留原始计数与密度

如果需要同时查看原始计数和密度分布,可以借助Lets-Plot的次坐标轴功能实现:

  1. 先获取直方图的最大计数,计算缩放因子(将密度值放大到计数的范围)
  2. 给密度图的Y值应用缩放因子,再通过次坐标轴反转缩放显示密度刻度

示例代码:

// 计算直方图最大计数,用于确定缩放因子
val maxCount = df.groupBy("diff_value").count().maxOf { it.second }
val scaleFactor = maxCount / 0.02 // 0.02为你观察到的密度最大值,需根据实际数据调整

letsPlot(df) { x = "diff_value" } +
    geomHistogram(
        binWidth = 1.0,
        color = "white",
        fill = "#4285F4"
    ) +
    geomDensity(
        color = "#EA4335",
        size = 1.2,
        y = stat(density) * scaleFactor // 缩放密度值到计数范围
    ) +
    scaleYContinuous(
        name = "计数",
        secAxis = secAxis(
            trans = { it / scaleFactor }, // 反转缩放,显示原始密度值
            name = "密度"
        )
    ) +
    ggtitle("差值的分布(双Y轴)") +
    xlab("差值")

注意:缩放因子需要根据你的实际数据调整,确保密度线高度和直方图匹配,同时次轴刻度显示正确。

内容的提问来源于stack exchange,提问作者Alberto S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:55:39