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

x轴为分类轴时,如何设置图表新增注释的坐标?

解决Plotly小提琴图注释重叠问题

你的核心问题是同一分组下不同方法的注释共用了相同的x坐标,导致重叠;同时原代码中均值中位数的计算未过滤分组,得到的是全局统计值而非对应组的数值,以下是修正后的方案:

关键修改点

  • 给不同方法的注释设置x轴偏移量,让同一分组下的注释左右分开
  • 修正统计值计算逻辑,确保只计算当前方法+分组的均值和中位数

修正后的代码

import numpy as np
import plotly.express as px
from plotly.offline import iplot

# 自定义图表尺寸(根据需求调整)
fig_height = 600
fig_width = 800

fig = px.violin(CVs,
                y="cv %",
                x="group",
                color="method",
                box=True,
                points=False,
                hover_data=CVs.columns)

# 为每个method分配x轴偏移,同一group下左右错开
method_offset = dict(zip(CVs['method'].unique(), [-0.2, 0.2]))

for method in CVs['method'].unique():
    for group in CVs['group'].unique():
        # 筛选当前method+group的子集
        subset = CVs[(CVs['method'] == method) & (CVs['group'] == group)]
        mean_val = np.round(subset['cv %'].mean(), 2)
        median_val = np.round(subset['cv %'].median(), 2)
        
        # 获取分组对应的整数x坐标,加上偏移量
        x_index = list(CVs['group'].unique()).index(group)
        x_pos = x_index + method_offset[method]
        
        # 添加均值注释
        fig.add_annotation(
            x=x_pos, y=0,
            yshift=-65,
            text=f"Mean: {mean_val}%",
            font=dict(size=10),
            showarrow=False
        )
        # 添加中位数注释
        fig.add_annotation(
            x=x_pos, y=0,
            yshift=-75,
            text=f"Median: {median_val}%",
            font=dict(size=10),
            showarrow=False
        )

fig.update_traces(meanline_visible=True)
fig.update_layout(
    template='plotly_white',
    yaxis_zeroline=False,
    height=fig_height,
    width=fig_width
)
iplot(fig)

补充说明

  • 如果注释位置仍不合适,可以调整yshift的数值(比如-50/-60),确保注释显示在图表底部不被遮挡
  • 偏移量-0.2和0.2可根据分组宽度调整,避免注释超出分组范围

内容的提问来源于stack exchange,提问作者Bob McBobson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:15:40