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

如何在ggplot绘制的风险度量柱状图中查看精确数值?

解决方案:给ggplot柱状图添加精确数值标签

针对你用tidyverse+tidyquant绘制的VaR/ES对比柱状图,以下是适配的数值标签添加方案,分两种常见数据结构处理:


情况1:数据为长格式(tidyverse标准结构)

如果你的风险度量数据框是长格式(包含portfolio(区分MyPort/Benchmark)、metric(区分VaR/ES)、value(风险数值)三列),直接在原绘图代码后添加geom_text即可:

library(tidyverse)
library(tidyquant)

# 示例长格式数据(替换为你的实际数据框)
risk_metrics <- tibble(
  portfolio = rep(c("MyPort", "Benchmark"), each = 2),
  metric = rep(c("VaR", "ES"), 2),
  value = c(-2.3, -3.1, -1.9, -2.7) # VaR/ES通常为负数,示例数值
)

# 原绘图代码
p <- risk_metrics %>%
  ggplot(aes(x = metric, y = value, fill = portfolio)) +
  geom_col(position = position_dodge(width = 0.8)) +
  labs(title = "组合与基准的VaR/ES对比", 
       x = "风险度量", 
       y = "数值", 
       fill = "组合类型") +
  theme_tq()

# 添加精确数值标签
p + geom_text(
  aes(label = round(value, 2)), # 保留2位小数,可按需调整
  position = position_dodge(width = 0.8), # 与柱状条的dodge宽度对齐,避免错位
  vjust = ifelse(risk_metrics$value < 0, -0.5, 1.5), # 负数标签放柱子上方,正数放下方,避免重叠
  size = 4 # 标签字号,按需调整
)

情况2:数据为宽格式

如果你的数据是宽格式(比如列名是MyPort_VaR、MyPort_ES、Benchmark_VaR、Benchmark_ES),先通过pivot_longer转成长格式,再用上述方法添加标签:

# 示例宽格式数据(替换为你的实际数据框)
wide_risk <- tibble(
  metric = c("VaR", "ES"),
  MyPort = c(-2.3, -3.1),
  Benchmark = c(-1.9, -2.7)
)

# 转长格式
long_risk <- wide_risk %>%
  pivot_longer(cols = -metric, 
               names_to = "portfolio", 
               values_to = "value")

# 绘图并添加标签
long_risk %>%
  ggplot(aes(x = metric, y = value, fill = portfolio)) +
  geom_col(position = position_dodge(width = 0.8)) +
  geom_text(aes(label = round(value, 2)),
            position = position_dodge(width = 0.8),
            vjust = -0.5,
            size = 4) +
  labs(title = "组合与基准的VaR/ES对比", 
       x = "风险度量", 
       y = "数值", 
       fill = "组合类型") +
  theme_tq()

解决标签重叠问题

如果柱子密集导致标签重叠,改用ggrepel包的geom_text_repel自动调整标签位置:

# 安装包(首次使用需执行)
# install.packages("ggrepel")
library(ggrepel)

p + geom_text_repel(
  aes(label = round(value, 2)),
  position = position_dodge(width = 0.8),
  size = 4,
  box.padding = 0.3 # 标签与柱子的间距
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:05:24