使用ggplotly时,不会解析ggplot2图形中的标签(注释)

时间:2017-02-27 12:15:03

标签: r ggplot2 knitr plotly

我在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)  

提前感谢您的建议。

1 个答案:

答案 0 :(得分:1)

Plotly为其文本使用HTML格式标记。

以下函数应该为您的示例处理。

fix_annotation <- function(old_text){
  new_text = gsub('==', '=', old_text)
  new_text = gsub(' \\* ', '&middot;', 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

enter image description here