Python Plotly go.Bar设置textposition属性不生效问题
问题根因
textposition参数仅控制文本标签的显示位置,无法单独触发标签渲染,你当前代码存在两个问题导致标签不显示:
- 柱状图(
go.Bar)未传入text属性指定要展示的数值内容,Plotly 没有可渲染的文本对象 - 折线图(
go.Scatter)默认渲染模式仅包含线条、标记,未开启文本渲染模式,且同样未传入text属性指定要展示的百分比数值
修正方案
- 提前计算好毛利率、净利率字段,避免重复计算
- 为所有柱状图、折线图trace补充
text属性,传入需要展示的数值,可按需配置texttemplate格式化数值显示样式 - 为折线图trace的
mode参数添加text枚举值,开启文本渲染能力 - 可选配置:统一文本最小字号,调整两个折线的标签位置避免重叠,防止标签被自动隐藏
修正后核心代码
# 提前计算毛利率、净利率 try: df['GPM'] = (df['Gross Profit'] * 100 / df['Total Turnover']).round(2) except KeyError: print('No GP') df['NPM'] = (df['Net Profit'] * 100 / df['Total Turnover']).round(2) fig = make_subplots(specs=[[{"secondary_y": True}]]) # 营收柱状图 fig.add_trace(go.Bar( name='Revenue', x=df['Closing Date'], y=df['Total Turnover'], base=0, text=df['Total Turnover'], textposition="inside", texttemplate='%{text:,.2f}' # 格式化数值为千分位分隔、保留2位小数 ),secondary_y=False) # 净利润柱状图 fig.add_trace(go.Bar( name='Net Profit', x=df['Closing Date'], y=df['Net Profit'], base=0, text=df['Net Profit'], textposition="inside", texttemplate='%{text:,.2f}' ),secondary_y=False) # 毛利率折线 try: fig.add_trace(go.Scatter( x=df['Closing Date'], y=df['GPM'], name="GPM%", mode='lines+markers+text', text=df['GPM'].astype(str) + '%', textposition="bottom center" ),secondary_y=True) except NameError: print('No GP') # 净利率折线 fig.add_trace(go.Scatter( x=df['Closing Date'], y=df['NPM'], name="NPM%", mode='lines+markers+text', text=df['NPM'].astype(str) + '%', textposition="top center" # 标签移到点位上方,避免和毛利率标签重叠 ),secondary_y=True) fig.update_layout( barmode='group', template="seaborn", title_text=str(df_stock[df_stock['StockCode'] == int(stockcode)]['Name of Securities'].values[0]) + ' ' + stockcode +'.HK', xaxis_title="date", title_font_color="red", yaxis_title=df['Unit'].values[0] +' '+ df['Currency'].values[0], font=dict(size=18), uniformtext_minsize=10, # 标签最小字号 uniformtext_mode='show' # 强制显示所有标签,不自动隐藏 )
内容的提问来源于stack exchange,提问作者Napas Vinitnantharat
相关产品推荐
相关产品推荐

