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

Plotly山脊图顶部轨迹被截断,如何调整轴位置修复?

Plotly山脊图顶部轨迹被截断的解决办法

问题描述

用Plotly制作山脊图时,整体效果基本正常,但顶部轨迹被截断,无法通过代码向下移动轨迹,只能手动拖动轴调整。当前代码如下:

for i, time_unit in enumerate(time_units):
    fig = go.Figure()

    df_year = df[df['year'] == time_unit]
    months = sorted(df['month'].unique())
    for j, month in enumerate(months):
        df_month = df_year[df_year['month'] == month]
        fig.add_trace(go.Violin(
            x=df_month['metric_value'],
            name=calendar.month_name[month],
            side='negative',
            box_visible=False
        ))
    fig.update_layout(
        title=f'Ridge Plot for Year {time_unit}',
        xaxis_title='Metric Value',
        yaxis_title='Month',

        yaxis=dict(automargin=True, domain=[0.00, 0.00], autorange='reversed',),
        violingap=0,
        violingroupgap=0,
        violinmode='overlay',
        height=1200

    )
fig.show()

当前效果:
当前山脊图效果

目标效果:
目标山脊图效果

问题原因及修复方案

你的代码存在两个核心问题:

  1. y轴domain设置错误:domain=[0.00, 0.00]会把y轴压缩到几乎不可见的区域,直接导致顶部轨迹被截断。
  2. 未指定violin的y轴位置:所有轨迹没有分配独立的y值,导致堆叠在一起,进一步加剧了截断问题。

修复后的完整代码:

import calendar
import plotly.graph_objects as go

for i, time_unit in enumerate(time_units):
    fig = go.Figure()

    df_year = df[df['year'] == time_unit]
    months = sorted(df['month'].unique())
    for j, month in enumerate(months):
        df_month = df_year[df_year['month'] == month]
        fig.add_trace(go.Violin(
            x=df_month['metric_value'],
            y=[month]*len(df_month),  # 给每个月份的violin分配独立y值
            name=calendar.month_name[month],
            side='negative',
            box_visible=False,
            scalemode='count',  # 统一按数据量缩放轨迹高度
            scalegroup='all_months'  # 所有轨迹归为同一缩放组
        ))
    fig.update_layout(
        title=f'Ridge Plot for Year {time_unit}',
        xaxis_title='Metric Value',
        yaxis_title='Month',
        yaxis=dict(
            automargin=True,
            autorange='reversed',
            tickvals=months,  # 设置y轴刻度为月份数值
            ticktext=[calendar.month_name[m] for m in months]  # 显示月份名称替代数字
        ),
        violingap=0,
        violingroupgap=0,
        violinmode='overlay',
        height=1200
    )
    # 扩展y轴范围,给顶部/底部轨迹留出缓冲空间
    fig.update_yaxes(range=[min(months)-0.5, max(months)+0.5])
    
fig.show()

关键调整说明

  • 添加y参数:让每个月份的violin在y轴上按顺序排列,避免堆叠。
  • 移除错误的domain设置:恢复y轴的正常显示空间。
  • 统一轨迹缩放:通过scalemode和scalegroup确保所有轨迹高度比例一致,不会出现单个轨迹过高的情况。
  • 扩展y轴范围:range=[min-0.5, max+0.5]给顶部和底部轨迹留出额外空间,彻底解决截断问题。

内容的提问来源于stack exchange,提问作者Nathaniel Saxe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:05:15