如何为Plotly绘制的箱形图(boxplot)添加样本计数信息
实现方案
以下分别对应三个位置的实现代码,可直接运行测试:
1. 标注放在中位数线顶部
核心思路是遍历箱线图的每条轨迹,提取对应中位数坐标后添加文本标注:
import plotly.express as px df = px.data.iris() fig = px.box(df, x='species', y='sepal_length') # 生成物种-样本数映射字典 count_dict = df['species'].value_counts().to_dict() # 遍历每个物种的箱线轨迹 for trace in fig.data: species = trace.name sample_cnt = count_dict[species] # 提取当前箱线的中位数数值 median_val = trace.median[0] # 在中位数上方添加计数标注 fig.add_annotation( x=species, y=median_val, text=f'n={sample_cnt}', showarrow=False, yshift=12, # 向上偏移避免和中位数线重叠,可根据需求调整 font=dict(size=13, color='#222') ) fig.show()
2. 标注放在最大值/最小值线顶部
只需修改上述代码中提取的坐标值即可:
- 放在最大值(上须)顶部:将
median_val = trace.median[0]替换为median_val = trace.whiskerhigh[0] - 放在最小值(下须)顶部:将
median_val = trace.median[0]替换为median_val = trace.whiskerlow[0]
同时可调整yshift参数控制标注和线的间距。
3. 计数放在悬浮提示框内部
通过修改hover模板实现,无需额外添加标注:
import plotly.express as px df = px.data.iris() # 生成物种-样本数映射字典 count_dict = df['species'].value_counts().to_dict() # 给原数据新增样本数列 df['sample_count'] = df['species'].map(count_dict) fig = px.box( df, x='species', y='sepal_length', custom_data=['sample_count'] # 将样本数传入自定义数据 ) # 修改悬浮提示模板,添加样本数显示 fig.update_traces( hovertemplate='<br>'.join([ '物种: %{x}', '花萼长度: %{y}', '样本数: %{customdata[0]}', '<extra></extra>' # 去掉默认的额外信息,可选 ]) ) fig.show()
如果不想重新生成图表,也可以直接修改已有图表的轨迹属性:
# 接你最初写的基础代码 count_dict = df['species'].value_counts().to_dict() for trace in fig.data: trace.customdata = [[count_dict[trace.name]]] trace.hovertemplate='<br>'.join([ '物种: %{x}', '花萼长度: %{y}', '样本数: %{customdata[0]}', '<extra></extra>' ]) fig.show()
内容的提问来源于stack exchange,提问作者JDDS
相关产品推荐
相关产品推荐

