如何在R、Python、Excel或Quarto中生成含彩色条形的表格?
在表格内嵌入彩色条形的实现方法

我想要从零开始构建与图中完全一致的表格,使用固定数值,请问如何在R、Python甚至Excel中创建这类嵌入表格内的彩色条形/矩形/圆角矩形?
当前用R的kable输出的表格如下:
Player <- c('T.Lawrence', 'D.Carr') Plays <- c(35,62) EPA_play <- c(0.32, -0.28) Total_EPA <- c(11.3, -17.2) df <- data.frame(Player,Plays,EPA_play,Total_EPA) df kable(df)
输出结果:
|Player | Plays| EPA_play| Total_EPA| |:----------|-----:|--------:|---------:| |T.Lawrence | 35| 0.32| 11.3| |D.Carr | 62| -0.28| -17.2|
一、R(含Quarto)实现
推荐使用gt包,它支持在表格中添加自定义样式的条形,且完美兼容Quarto渲染:
library(gt) library(glue) # 构建数据框 Player <- c('T.Lawrence', 'D.Carr') Plays <- c(35,62) EPA_play <- c(0.32, -0.28) Total_EPA <- c(11.3, -17.2) df <- data.frame(Player,Plays,EPA_play,Total_EPA) # 创建带条形的表格 gt(df) %>% # 格式化数值 fmt_number(columns = c(EPA_play, Total_EPA), decimals = c(2,1)) %>% # 给EPA_play列添加背景色区分正负 data_color( columns = EPA_play, colors = scales::col_numeric( palette = c("#dc354520", "#ffffff", "#28a74520"), domain = range(df$EPA_play) ) ) %>% # 设置列宽和单元格样式 cols_width( Player = px(120), everything() = px(100) ) %>% tab_style( style = cell_borders(sides = "all", color = "#dee2e6", weight = px(1)), locations = cells_body() ) %>% tab_style( style = cell_text(align = "center"), locations = cells_body(columns = c(Plays, EPA_play, Total_EPA)) ) %>% # 给Total_EPA列添加圆角条形 text_transform( locations = cells_body(columns = Total_EPA), fn = function(x) { values <- as.numeric(x) max_abs <- max(abs(values)) bar_width <- paste0(abs(values)/max_abs * 80, "%") bar_color <- ifelse(values > 0, "#28a745", "#dc3545") glue( '<div style="display:flex;align-items:center;justify-content:center;"> <div style="width:{bar_width};height:20px;background:{bar_color};border-radius:10px;margin-right:6px;"></div> {x} </div>' ) } )
如果用Quarto,直接将这段代码放入R代码块,渲染为HTML格式即可得到和示例一致的效果,PDF渲染也支持基础样式。
二、Python实现
可以用plotly生成交互式表格,或用pandas Styler生成静态HTML表格:
方法1:Plotly交互式表格
import plotly.graph_objects as go import pandas as pd # 构建数据 data = { 'Player': ['T.Lawrence', 'D.Carr'], 'Plays': [35, 62], 'EPA_play': [0.32, -0.28], 'Total_EPA': [11.3, -17.2] } df = pd.DataFrame(data) # 计算条形参数 max_total_abs = max(abs(df['Total_EPA'])) bar_colors = ['#28a745' if val > 0 else '#dc3545' for val in df['Total_EPA']] bar_widths = [abs(val)/max_total_abs * 80 for val in df['Total_EPA']] # 创建表格 fig = go.Figure(data=[go.Table( header=dict( values=list(df.columns), fill_color='#f8f9fa', align='center', font=dict(size=12), line_color='#dee2e6' ), cells=dict( values=[ df['Player'], df['Plays'], df['EPA_play'], # 组合条形与数值 [f'<div style="display:flex;align-items:center;"> <div style="width:{w}%;height:20px;background:{c};border-radius:10px;margin-right:5px;"></div>{v} </div>' for w,c,v in zip(bar_widths, bar_colors, df['Total_EPA'])] ], align=['left', 'center', 'center', 'center'], fill_color=[ ['#ffffff']*2, ['#ffffff']*2, # EPA_play列的背景色 ['#28a74520' if val>0 else '#dc354520' for val in df['EPA_play']], ['#ffffff']*2 ], line_color='#dee2e6', font=dict(size=11) ) )]) fig.update_layout(width=600, height=220) fig.show()
方法2:Pandas Styler生成HTML表格
import pandas as pd # 构建数据 data = { 'Player': ['T.Lawrence', 'D.Carr'], 'Plays': [35, 62], 'EPA_play': [0.32, -0.28], 'Total_EPA': [11.3, -17.2] } df = pd.DataFrame(data) # 定义EPA_play列的背景色函数 def epa_bg(val): return f'background-color: {"#28a74520" if val>0 else "#dc354520"};' # 定义Total_EPA列的条形生成函数 def total_epa_html(val): max_abs = max(abs(df['Total_EPA'])) width = abs(val)/max_abs * 80 color = '#28a745' if val>0 else '#dc3545' return f''' <div style="display:flex;align-items:center;"> <div style="width:{width}%;height:20px;background:{color};border-radius:10px;margin-right:5px;"></div> {val:.1f} </div> ''' # 生成样式化表格 styled_table = df.style \ .applymap(epa_bg, subset=['EPA_play']) \ .format({'EPA_play': '{:.2f}'}) \ .format(total_epa_html, subset=['Total_EPA']) \ .set_properties(**{'text-align': 'center'}) \ .set_table_styles([ {'selector': 'th', 'props': [('background-color', '#f8f9fa'), ('border', '1px solid #dee2e6')]}, {'selector': 'td', 'props': [('border', '1px solid #dee2e6')]} ]) # 导出为HTML文件 styled_table.to_html('epa_player_table.html')
三、Excel实现
- 输入数据:将表格数据录入Excel,列名对应
Player、Plays、EPA_play、Total_EPA。 - EPA_play列添加背景/数据条:
- 选中
EPA_play列,点击「开始」→「条件格式」→「数据条」→「实心填充」,选择绿色(正数值)和红色(负数值); - 若需圆角,Excel 365可在「条件格式规则管理器」中编辑规则,勾选「圆角数据条」。
- 选中
- Total_EPA列添加带数值的条形:
- 选中
Total_EPA列,右键→「设置单元格格式」→「自定义」,输入格式代码:[Green]0.0 ;[Red]-0.0,区分正负数值颜色; - 再添加数据条,调整数据条仅占单元格左侧区域,数值显示在右侧,设置圆角即可;
- 若需更精准的条形宽度,可手动插入圆角矩形形状,设置填充颜色后,用公式绑定宽度(如
=ABS(A1)/MAX(ABS($A$1:$A$2))*100),再将数值放在形状旁。
- 选中
内容的提问来源于stack exchange,提问作者comtuner
相关产品推荐
相关产品推荐

