如何创建带副标题的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
相关产品推荐
相关产品推荐

