如何在Plotly表格中对含"All"的行进行字体加粗高亮
需求说明
需要在Plotly生成的表格中,将Building、Floor或Team列包含"All"的行设置为字体加粗,实现高亮效果。
原代码
headerColor = 'darkgrey' rowEvenColor = 'lightgrey' rowOddColor = 'white' fig_occ_fl_team = go.Figure(data=[go.Table( header=dict( values=list(final_table_occ_fl_team.columns), line_color='black', fill_color=headerColor, align=['left','left','left','left','left','left','left','left','left','left'], font=dict(color='black', size=9) ), cells=dict( values=[final_table_occ_fl_team['Building'], final_table_occ_fl_team['Floor'], final_table_occ_fl_team['Team'], final_table_occ_fl_team['Number of Desks'], final_table_occ_fl_team['Avg Occu (#)'], final_table_occ_fl_team['Avg Occu (%)'], final_table_occ_fl_team['Avg Occu 10-4 (#)'], final_table_occ_fl_team['Avg Occu 10-4 (%)'], final_table_occ_fl_team['Max Occu (#)'], final_table_occ_fl_team['Max Occu (%)'], ], line_color='black', fill_color = [[rowOddColor,rowEvenColor]*56], align = ['left','left','left','left','left','left','left','left','left','left'], font = dict(color = 'black', size = 7) )) ]) fig_occ_fl_team.show()
数据集
data = {'Building': {0: 'All', 1: '1LWP', 2: '1LWP', 3: '1LWP', 4: '1LWP', 5: '1LWP', 6: '1LWP', 7: '1LWP', 8: '1LWP', 9: '1LWP'}, 'Floor': {0: 'All', 1: 'All', 2: '2nd', 3: '2nd', 4: '2nd', 5: '2nd', 6: '2nd', 7: '2nd', 8: '2nd', 9: '2nd'}, 'Team': {0: 'All', 1: 'All', 2: 'All', 3: 'Anderson/Money', 4: 'Banking & Treasury', 5: 'Charities', 6: 'Client Management', 7: 'Compliance, Legal & Risk', 8: 'DFM', 9: 'Emmerson'}, 'Number of Desks': {0: 2297, 1: 2008, 2: 381, 3: 22, 4: 8, 5: 19, 6: 9, 7: 41, 8: 20, 9: 33}, 'Avg Occu (#)': {0: 1261, 1: 1126, 2: 195, 3: 14, 4: 4, 5: 9, 6: 5, 7: 21, 8: 13, 9: 18}, 'Avg Occu (%)': {0: '55%', 1: '56%', 2: '51%', 3: '64%', 4: '50%', 5: '48%', 6: '56%', 7: '52%', 8: '65%', 9: '55%'}, 'Avg Occu 10-4 (#)': {0: 851, 1: 759, 2: 132, 3: 8, 4: 3, 5: 6, 6: 3, 7: 14, 8: 9, 9: 12}, 'Avg Occu 10-4 (%)': {0: '37%', 1: '38%', 2: '35%', 3: '37%', 4: '38%', 5: '32%', 6: '34%', 7: '35%', 8: '45%', 9: '37%'}, 'Max Occu (#)': {0: 1901, 1: 1680, 2: 274, 3: 22, 4: 6, 5: 13, 6: 7, 7: 27, 8: 17, 9: 25}, 'Max Occu (%)': {0: '83%', 1: '84%', 2: '72%', 3: '100%', 4: '75%', 5: '69%', 6: '78%', 7: '66%', 8: '85%', 9: '76%'}}
解决方案
核心思路是先判断每行是否满足"Building/Floor/Team列含All"的条件,生成对应字体粗细的列表,再将这个列表传给表格单元格的字体权重参数。
修改后的完整代码:
import plotly.graph_objects as go import pandas as pd # 将数据集转为DataFrame final_table_occ_fl_team = pd.DataFrame(data) headerColor = 'darkgrey' rowEvenColor = 'lightgrey' rowOddColor = 'white' # 生成字体粗细列表:满足条件的行设为bold,否则normal font_weights = [] for idx, row in final_table_occ_fl_team.iterrows(): if row['Building'] == 'All' or row['Floor'] == 'All' or row['Team'] == 'All': font_weights.append('bold') else: font_weights.append('normal') # 适配多列:Plotly需要与列数匹配的二维权重列表 font_weight_list = [font_weights for _ in range(len(final_table_occ_fl_team.columns))] fig_occ_fl_team = go.Figure(data=[go.Table( header=dict( values=list(final_table_occ_fl_team.columns), line_color='black', fill_color=headerColor, align=['left']*10, font=dict(color='black', size=9) ), cells=dict( values=[final_table_occ_fl_team['Building'], final_table_occ_fl_team['Floor'], final_table_occ_fl_team['Team'], final_table_occ_fl_team['Number of Desks'], final_table_occ_fl_team['Avg Occu (#)'], final_table_occ_fl_team['Avg Occu (%)'], final_table_occ_fl_team['Avg Occu 10-4 (#)'], final_table_occ_fl_team['Avg Occu 10-4 (%)'], final_table_occ_fl_team['Max Occu (#)'], final_table_occ_fl_team['Max Occu (%)'], ], line_color='black', # 根据行数自动生成交替行颜色,替代硬编码 fill_color = [rowOddColor if i%2==0 else rowEvenColor for i in range(len(final_table_occ_fl_team))], align = ['left']*10, font = dict(color = 'black', size = 7, weight=font_weight_list) )) ]) fig_occ_fl_team.show()
关键说明
- 字体权重列表生成:遍历每行数据,判断是否有目标列包含"All",生成对应行的字体粗细标记。
- 多列适配:Plotly表格的
font.weight参数需要传入与列数匹配的二维列表,因此将单行权重列表复制对应列数的次数。 - 行颜色优化:替换原代码硬编码的行颜色列表,改为根据实际行数自动生成交替颜色,提升代码灵活性。
内容的提问来源于stack exchange,提问作者Arina Belozerova
相关产品推荐
相关产品推荐

