Plotly图表数据不匹配及标签分隔符修改问题求助
Plotly条形图问题修复方案
问题1:条形数值未正确匹配data中的值
原因
原代码遍历所有data行查找架构匹配项,找到第一个符合条件的就停止,导致每个策略对应的条形取的是data中第一个出现该架构的值,而非对应策略行的数值。
修复逻辑
针对每个架构,遍历策略时直接定位到data中对应策略的行(data[j],j为当前策略的索引),在该行内查找匹配的架构,获取对应数值。
问题2:替换条形标签的小数点分隔符为逗号
原因
原代码错误地修改fig.layout.annotations,但Plotly条形的标签存储在每个trace的text属性中,而非annotations。
修复逻辑
- 生成标签文本时直接将小数点替换为逗号
- 配置y轴的
separators参数,确保刻度显示也使用逗号作为小数点分隔符
修改后的完整代码
import plotly.graph_objects as go import plotly.io as pio data = [ ['FT-Transformer', 0.8102, 'MLP', 0.7790, 'TabNet', 0.7904, 'TabTransform', 0.7960, 'FT-Transformer', 0.7989, 'TabNet', 0.8073], ['TabNet', 0.8101, 'TabNet', 0.7592, 'NODE', 0.7790, 'NODE', 0.7847, 'NODE', 0.7904, 'NODE', 0.7818], ['NODE', 0.7989, 'NODE', 0.7535, 'TabTransform', 0.7677, 'TabNet', 0.7818, 'MLP', 0.7904, 'FT-Transformer', 0.7790], ['MLP', 0.7932, 'FT-Transformer', 0.7375, 'MLP', 0.6742, 'FT-Transformer', 0.7648, 'TabNet', 0.7705, 'TabTransform', 0.7592], ['TabTransform', 0.7705, '1D-CNN', 0.7365, '1D-CNN', 0.6685, 'MLP', 0.7082, 'TabTransform', 0.7677, 'MLP', 0.7535], ['1D-CNN', 0.6799, 'TabTransform', 0.7337, 'FT-Transformer', 0.5864, '1D-CNN', 0.5609, '1D-CNN', 0.7025, '1D-CNN', 0.7082] ] strategies = ['TA/HI', 'PCA', 'SA', 'UNDER', 'OVER', 'AUMENTADO'] architectures = ['1D-CNN', 'FT-Transformer', 'MLP', 'NODE', 'TabNet', 'TabTransform'] colors = { '1D-CNN': '#1f77b4', # Azul 'FT-Transformer': '#ff7f0e', # Laranja 'MLP': '#2ca02c', # Verde 'NODE': '#9467bd', # Roxo 'TabNet': '#8c564b', # Marrom 'TabTransform': '#d62728' # Vermelho } fig = go.Figure() for arch in architectures: y_values = [] text_values = [] color_values = [] for j in range(len(strategies)): # 定位到当前策略对应的data行 current_row = data[j] found_val = 0 # 在当前行中查找匹配的架构 for l in range(0, len(current_row), 2): if current_row[l] == arch: found_val = current_row[l+1] break # 添加数值和格式化后的文本 y_values.append(found_val) # 直接替换小数点为逗号 percent_text = f"<b>{found_val:.2%}</b>".replace('.', ',') text_values.append(percent_text) color_values.append(colors[arch]) fig.add_trace(go.Bar( name=arch, x=strategies, y=y_values, text=text_values, textposition="outside", textangle=0, textfont=dict(size=10), marker=dict(color=color_values) )) fig.update_layout( font=dict(size=12), plot_bgcolor='rgba(0,0,0,0)', barmode='group', bargap=0.1, bargroupgap=0.05, legend=dict(orientation='h', yanchor='bottom', y=1.02, xanchor='center', x=0.5), margin=dict(t=200) ) # 设置y轴刻度的百分比格式和逗号分隔符 fig.update_layout( yaxis=dict( tickformat='.2%', separators=',.' # 第一个是小数点分隔符,第二个是千位分隔符 ) ) fig.show()
内容的提问来源于stack exchange,提问作者PM92
相关产品推荐
相关产品推荐

