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

如何创建带副标题的ggplotly对象并让注释文本自动居顶居中?

解决方案:自动定位注释 + 添加副标题的ggplotly散点图

针对你的需求,我们可以通过plotly原生注释系统解决注释自动定位问题,同时利用ggplot或plotly的标题配置添加副标题。下面是完整的修改代码和细节解释:

完整代码实现

library(data.table)
library(plotly)
library(ggplot2)
library(lubridate)

# 生成示例数据
dt.allData <- data.table(
  date = seq(as.Date('2020-01-01'), by = '1 day', length.out = 365),
  DE = rnorm(365, 4, 1),
  Austria = rnorm(365, 10, 2),
  Czechia = rnorm(365, 1, 2),
  check.names = FALSE
)

# 计算皮尔逊相关系数
corrCoeff <- round(cor(dt.allData$Austria, dt.allData$DE, method = "pearson", use = "complete.obs"), digits = 2)

# 拟合线性回归并提取参数
regLine <- lm(DE ~ Austria, data = dt.allData)
k <- round(regLine$coef[2], digits = 5)
d <- round(regLine$coef[1], digits = 2)
linRegFunction <- paste0("y = ", d, " + ", k, "x")
annotation_text <- paste0("ρ = ", corrCoeff, "\n", linRegFunction)

# 绘制基础ggplot图(移除手动annotate)
p1 <- ggplot(data = dt.allData, aes(
    x = Austria, 
    y = DE, 
    text = paste(
      "Date: ", date, '\n',
      "Austria: ", round(Austria,2), " MWh/h", '\n',
      "DE: ", round(DE,2), " €/MWh"
    ),
    group = 1
  )) +
  geom_point(aes(color = ifelse(date >= now()-weeks(5), "#419F44", "#F07D00"))) +
  scale_color_manual(values = c("#F07D00", "#419F44")) +
  geom_smooth(method = "lm", se = FALSE, color = "#007d3c") +
  theme_classic() +
  theme(legend.position = "none", panel.background = element_blank()) +
  xlab("Austria (MWh/h)") +
  ylab("DE (€/MWh)") +
  ggtitle(
    label = "DE vs Austria",
    subtitle = paste("Pearson Correlation: ρ =", corrCoeff)  # 直接添加ggplot副标题
  ) +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"),
        plot.subtitle = element_text(hjust = 0.5))

# 转换为ggplotly并设置自动定位注释
plot <- ggplotly(p1, tooltip = "text") %>%
  layout(
    # 添加自动定位的注释:使用paper坐标(相对绘图区域)
    annotations = list(
      list(
        x = 0.5,  # 水平居中(0=左,1=右)
        y = 1.05, # 垂直顶部上方(0=底,1=顶)
        xref = "paper",  # 基于绘图区域的相对坐标,不受数据轴范围影响
        yref = "paper",
        text = annotation_text,
        showarrow = FALSE,
        font = list(size = 10),
        align = "center"
      )
    )
  )

# 查看结果
plot

关键修改点说明

1. 解决注释自动定位问题

  • 放弃了ggplot::annotate()的手动坐标设置,改用plotly原生注释系统,避免受数据轴缩放影响
  • 使用xref = "paper"和yref = "paper":这两个参数让注释坐标基于整个绘图区域的相对位置,而非数据轴数值。x=0.5表示水平居中,y=1.05表示在绘图区域顶部上方,无论数据范围如何变化,注释都会固定在顶部中间
  • 设置showarrow = FALSE隐藏箭头,让注释更简洁

2. 添加副标题

  • 方法一:在ggplot::ggtitle()中通过subtitle参数直接设置,ggplotly会自动保留副标题的居中样式
  • 如果你需要更精细的格式控制(比如字体大小、颜色),可以在plotly::layout()的title参数中用HTML标签实现,示例代码中注释了这种方式

3. 其他细节优化

  • 优化了工具提示文本,添加小数位数保留,提升可读性
  • 完善了坐标轴标签的单位,让图表信息更清晰

这样修改后,不管你的dt.allData数据轴范围怎么变,注释都会自动保持在顶部中间,同时ggplotly对象会带有清晰的副标题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:02:48