我在Rstudio下使用knitr生成报告,当我使用ggplotly时,我有一个问题需要掌握注释。
此后,当我使用正确的注释打印ggplot2图形时,它是一个正常工作的示例,如果我用ggplotly打印它,我会得到正确的图形,但注释没有被解析。
library(ggplot2)
library(plotly)
lm_fit <- lm(Sepal.Length ~ Sepal.Width, data=iris)
summary(lm_fit)
formule <- sprintf("italic(y) == %.2f % + .2f * italic(x)",
round(coef(lm_fit)[1], 2),
round(coef(lm_fit)[2], 2))
r_2 <- summary(lm_fit)$r.squared
r2 <- sprintf("italic(r)^2 == %.4f", r_2)
graph1 <- ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) +
geom_point() +
geom_smooth(method = 'lm', aes(fill = 'confidence'), alpha = 0.5) +
annotate("text",
x=min(iris$Sepal.Width),
y=max(iris$Sepal.Length),
label=formule,
parse=TRUE,
hjust=0) +
annotate("text",
x=min(iris$Sepal.Width),
y=max(iris$Sepal.Length) - 0.3,
label=r2,
parse=TRUE,
hjust=0)
out.format <- "html" # KO for the annotations ; they are not parsed.
out.format <- "pdf" # OK for the annotations.
if (out.format == "html") plotly::ggplotly(graph1) else print(graph1)
提前感谢您的建议。
答案 0 :(得分:1)
Plotly为其文本使用HTML格式标记。
以下函数应该为您的示例处理。
fix_annotation <- function(old_text){
new_text = gsub('==', '=', old_text)
new_text = gsub(' \\* ', '·', new_text)
new_text = gsub('italic\\(([0-9a-zA-z]*)\\)', '<i>\\1</i>', new_text)
new_text = gsub('\\^([0-9]*)', '<sup>\\1</sup>', new_text)
return(new_text)
}
文本以scatter
添加为mode: text
跟踪(不要问为什么......),因此我们会覆盖文本并修复位置。
p <- plotly::ggplotly(graph1)
for (i in 4:5) {
p[['x']][['data']][[i]][['text']] <- fix_annotation(p[['x']][['data']][[i]][['text']])
p[['x']][['data']][[i]][['x']] <- min(p[['x']][['data']][[1]][['x']]) + 0.1 * (max(p[['x']][['data']][[1]][['x']]) - min(p[['x']][['data']][[1]][['x']]))
}
p