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

Plotly柱状图末尾柱子注释文本被截断的修复方案咨询

Plotly柱状图最后一根柱子注释文本截断的修复方法

问题描述

使用Plotly绘制柱状图时,最后一根柱子的注释文本出现截断情况,示例截图如下:
柱状图注释截断截图

相关代码

#!/usr/bin/env python3
import pandas as pd
import re
import datetime
import os

import plotly.graph_objects as go
import numpy as np
import math
import datetime

def save_fig(fig,pngname):
    fig.write_image(pngname,format="png", width=800, height=400, scale=1)
    print("[[%s]]"%pngname)    
    return

def plot_bars(df,pngname):
    colors = ['#5891ad','#004561','#ff6f31','#1c7685','#0f45a8','#4cdc8b','#0097a7']
    fig = go.Figure()
    traces = []
    xname = df.columns[0]
    for i,yname in enumerate(df.columns):
        if i == 0: continue
        trace1 = go.Bar(
            name=yname,
            x=df[xname],y=df[yname],meta=df.index,
            #texttemplate="%{%.1f}",
            text=df[yname],
            textposition="outside",
            textangle=-25,
            textfont_color="black",
            marker_color=colors[i-1], 
            hovertemplate='<br>'.join([
                'id:%{meta}',
                'ts: %{x|%H:%M:%S}',
                'val: %{y:.1f}',            
            ]),        
        )
        traces.append(trace1)
        
    fig.add_traces(traces)
    #d0 = df[xname][0].replace(minute=0, second=0) - datetime.timedelta(hours=1)
    fig.update_layout(
        margin=dict(l=10,t=40,r=10,b=40),
        plot_bgcolor='#ffffff',#'rgb(12,163,135)',
        paper_bgcolor='#ffffff',        
        title="Boot progress",
        xaxis_title="Keypoints",
        yaxis_title="Timestamp(secs)",
        title_x=0.5,
        barmode='group',
        bargap=0.05,
        bargroupgap=0.0,
        legend=dict(x=.02,y=1),
        xaxis=dict(
            #tick0 = d0,
            #dtick=7200000,
            tickangle=-25,            
            #tickmode='array',
            #tickvals = xvals,
            #ticktext= xtexts,
            #tickformat = '%m-%d %H:%M:%S',#datetime format
            showline=True,
            linecolor='black',
            color='black',
            linewidth=.5,
            ticks='outside',
            #mirror=True,
        ),
        yaxis=dict(
            dtick=10,
            showline=True,
            linecolor='black',
            color='black',
            linewidth=.5,            
            #tickvals = yvals,
            #ticktext= ytexts,      
            showgrid=True,
            gridcolor='#ececec',
            gridwidth=.5,
            griddash='solid',#'dot',
            zeroline=True,
            zerolinecolor='grey',
            zerolinewidth=.5,
            showticklabels=True,
            #mirror=True,
        ),        
    )
    
    anns = []
    #anns = add_line(fig,anns,x0,y0,x1,y1,text=None)
    #add_anns(fig,anns)
    
    save_fig(fig,pngname)
    return

def main():
    data = [
        ["A",10,12],
        ["B",12,11],
        ["C",14,13],
        ["D",16,15],
        ["E",18,19]        
        ]
    
    df = pd.DataFrame(data,columns=["Kepoint","g1","g2"])
    plot_bars(df,"demo.png")
    return
main()

修复方案

方法一:增大右侧边距

截断的核心原因是图表右侧边距过小,注释文本超出了画布范围。只需在update_layout的margin参数中增大r(右侧边距)的值即可:

修改后的margin配置:

margin=dict(l=10,t=40,r=40,b=40),

这样能给右侧的注释文本留出足够的显示空间,避免被截断。

方法二:优化文本位置或角度(可选)

如果不想调整边距,也可以通过调整文本相关参数来避免截断:

  • 将textposition从"outside"改为"auto",让Plotly自动判断文本的最佳显示位置;
  • 减小textangle的角度(比如从-25改为-15),减少文本横向占用的宽度。

修改后的Bar trace示例:

trace1 = go.Bar(
    name=yname,
    x=df[xname],y=df[yname],meta=df.index,
    text=df[yname],
    textposition="auto",  # 自动调整位置
    textangle=-15,        # 减小倾斜角度
    textfont_color="black",
    marker_color=colors[i-1], 
    hovertemplate='<br>'.join([
        'id:%{meta}',
        'ts: %{x|%H:%M:%S}',
        'val: %{y:.1f}',            
    ]),        
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 06:09:19