用表格填充 CSS 样式的方式实现,可复现的代码如下。
library(DT)
library(data.table)
data <- data.frame(
'统计期' = c(2024, 2023, 2022, 2021, 2020, 2019, 2018, 2017),
'运用四种形态批评教育和处理万人次' = c(87.9, 171.8, 183.8, 212.5, 195.4, 184.9, 173.7, 131.6),
'第一种形态' = c(54.2, 109.6, 123.2, 148.7, 133, 124.6, 110.4, 78.6),
'第二种形态' = c(27.1, 49.2, 47.8, 49.4, 48.5, 46.3, 49.5, 41.2),
'第三种形态' = c(3.1, 6.4, 6.4, 7, 7.1, 7.2, 8.2, 7),
'第四种形态' = c(3.6, 6.6, 6.4, 7.4, 6.8, 6.8, 5.5, 4.8)
)
setDT(data)
# 为了缩减代码数量,将表格中填充圆形图案的部分迁移出来
format_add <- function(...) {
formatStyle(
...,
# 'display' = 'flex', # 四个圆会竖向排列在一个单元格
# 'display' = 'inline', # 四个圆会横向排列在一个单元格
# 'display' = 'table-row', # 竖向的四个圆变成竖向的四个格子
'display' = 'table-cell', # 四个圆分在四列
'align-items' = 'center',
'justify-content' = 'center',
'width' = '1.875rem',
'height' = '1.875rem',
'border' = '0.5px solid rgb(0,0,0,0.1)',
'border-radius' = '50%',
'color' = '#000',
'font-size' = '1.25rem',
'letter-spacing' = '-1px'
)
}
datatable(data = data[, ':='(
`第一种形态` = round(`第一种形态` / `运用四种形态批评教育和处理万人次`, 2),
`第二种形态` = round(`第二种形态` / `运用四种形态批评教育和处理万人次`, 2),
`第三种形态` = round(`第三种形态` / `运用四种形态批评教育和处理万人次`, 2),
`第四种形态` = round(`第四种形态` / `运用四种形态批评教育和处理万人次`, 2)
)][`统计期` >= 2017, c('统计期', '运用四种形态批评教育和处理万人次', '第一种形态', '第二种形态', '第三种形态', '第四种形态')],
rownames = FALSE,
options = list(dom = 't')) |>
formatStyle(
columns = '运用四种形态批评教育和处理万人次',
background = styleColorBar(c(0, data$`运用四种形态批评教育和处理万人次`), 'steelblue'),
# 填充条形
# 填充背景的尺寸,第一个值为宽度,第二个值为高度
backgroundSize = '100% 90%',
backgroundRepeat = 'no-repeat',
color = 'white'
) |>
format_add(columns = '第一种形态', backgroundColor = "#FF6347") |>
format_add(columns = '第二种形态', backgroundColor = "#ff2700") |>
format_add(columns = c('第三种形态', '第四种形态'),
backgroundColor = "#B50A2AFF") |>
formatPercentage(columns = c(3:6), digits = 0)
执行代码后的表格见https://yuanfan.rbind.io/project/ccdi/#%E4%B8%89%E5%A4%84%E5%88%86%E5%B9%B2%E9%83%A8%E6%83%85%E5%86%B5