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

如何在R、Python、Excel或Quarto中生成含彩色条形的表格?

在表格内嵌入彩色条形的实现方法

Player and EPA

我想要从零开始构建与图中完全一致的表格,使用固定数值,请问如何在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实现

  1. 输入数据:将表格数据录入Excel,列名对应Player、Plays、EPA_play、Total_EPA。
  2. EPA_play列添加背景/数据条:
    • 选中EPA_play列,点击「开始」→「条件格式」→「数据条」→「实心填充」,选择绿色(正数值)和红色(负数值);
    • 若需圆角,Excel 365可在「条件格式规则管理器」中编辑规则,勾选「圆角数据条」。
  3. Total_EPA列添加带数值的条形:
    • 选中Total_EPA列,右键→「设置单元格格式」→「自定义」,输入格式代码:[Green]0.0 ;[Red]-0.0,区分正负数值颜色;
    • 再添加数据条,调整数据条仅占单元格左侧区域,数值显示在右侧,设置圆角即可;
    • 若需更精准的条形宽度,可手动插入圆角矩形形状,设置填充颜色后,用公式绑定宽度(如=ABS(A1)/MAX(ABS($A$1:$A$2))*100),再将数值放在形状旁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:24:51