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

Plotly子图中柱状图数值文本截断问题的解决方法(Python)

解决Plotly子图柱状图文本截断问题

你遇到的是Plotly子图顶部空间不足导致柱状图上方数值文本被截断的问题,这是因为默认布局没给外部文本标签预留足够垂直空间,咱们可以通过调整布局或优化设置来解决,同时还能简化你的代码结构。

问题根源

当设置textposition="outside"时,文本会显示在柱子顶端,但Plotly默认的子图顶部边距和y轴范围刚好到柱子顶端,没有额外空间容纳文本,所以就出现了截断情况。

解决方案与优化代码

我把你的代码做了简化(不用每次新建go.Figure,直接创建Bar trace添加到子图),同时加入了两种解决截断的核心设置,你可以根据自己的需求选择或组合使用:

import plotly.graph_objects as go
from plotly.subplots import make_subplots

# 替换成你实际的x/y数据
x1, y1 = ["类别1", "类别2", "类别3"], [12, 25, 18]
x2, y2 = ["组A", "组B"], [30, 22]
x3, y3 = ["项X", "项Y", "项Z"], [8, 15, 20]
x4, y4 = ["类型P", "类型Q"], [28, 35]

# 创建2行2列子图
fig = make_subplots(rows=2, cols=2, shared_yaxes=True)

# 直接添加柱状图轨迹到对应子图,省去多余的中间Figure创建
fig.add_trace(go.Bar(x=x1, y=y1, text=y1, textposition="outside"), row=1, col=1)
fig.add_trace(go.Bar(x=x2, y=y2, text=y2, textposition="outside"), row=1, col=2)
fig.add_trace(go.Bar(x=x3, y=y3, text=y3, textposition="outside"), row=2, col=1)
fig.add_trace(go.Bar(x=x4, y=y4, text=y4, textposition="outside"), row=2, col=2)

# 方案1:增加整个图表的顶部边距,给文本留空间
fig.update_layout(
    margin=dict(t=70)  # t代表顶部边距,可根据文本长度调整数值
)

# 方案2:为每个子图的y轴扩大范围(可选,和方案1二选一或搭配使用)
# 把y轴最大值设为数据最大值的1.1倍,预留10%空间给文本
data_list = [y1, y2, y3, y4]
row_col_pairs = [(1,1), (1,2), (2,1), (2,2)]
for idx, (row, col) in enumerate(row_col_pairs):
    max_val = max(data_list[idx])
    fig.update_yaxes(range=[0, max_val * 1.1], row=row, col=col)

# 可选:调整文本字体大小,避免过大导致截断
fig.update_traces(textfont=dict(size=10))

fig.show()

关键设置说明

  • margin=dict(t=70):增大图表顶部的空白区域,让文本有足够的显示空间,你可以根据文本的实际长度微调t的数值。
  • range=[0, max_val * 1.1]:为每个子图的y轴设置比数据最大值稍大的范围,从根源上避免文本被y轴顶端截断。
  • 简化后的代码去掉了不必要的中间go.Figure创建步骤,更简洁易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:57:31