使用 ggplot 和plotly 调整文本位置

Tho*_*rst 3 r ggplot2 plotly

ggplot我在打印从到 的绘图plotly并保持良好的文本位置时遇到问题。

数据示例:

library(ggplot2)
library(plotly)
library(dplyr)
library(reshape2)

#mock data
df1 <- data.frame( 
  Gruppering2     = factor(c("Erhverv Erhverv Salg","Erhverv Erhverv Salg","Erhverv Erhverv Salg")),
  periode    = factor(c("Denne maaned","Denne uge", "I gaard")),
  Answer_rate = c(0.01,0.4,0.7),
  SVL    = c(0.40,0.43,0.67),
  over_180     = c(0.5,0.7,0.3)  
)

#color 
plotCol <- c( rgb(44,121,91, maxColorValue = 255),  rgb(139,0,0, maxColorValue = 255),rgb(0,0,139, maxColorValue = 255)) 

#plot code
dfpct <- melt(df1[,c(2,3,4,5)], id.vars = "periode",
              measure.vars = c( "Answer_rate","SVL", "over_180"), 
              variable.name = "P", value.name = "value")
dfpct <- na.omit(dfpct)

pct <- ggplot(dfpct, aes(x = periode, y = value, fill = P, group = P, width = 0.6)) + 
  geom_bar(stat = "identity", position="dodge", colour = "black", width = 0.7, show.legend = FALSE) +
  labs(x = NULL, y = "Calls") +
  #ggtitle("Forecast Error") +
  theme_bw() +
  theme(panel.grid.major = element_blank(),
        plot.title = element_text(size = rel(1.2), face = "bold", vjust = 1.5),
        axis.title = element_text(face = "bold"),
        axis.text = element_text(),
        legend.position = "bottom",
        legend.direction = "vertical",
        legend.key.width = unit(2, "lines"),
        legend.key.height = unit(0.5, "lines"),
        legend.title = element_blank()) +
  geom_text(aes(label=paste(value*100,"%",sep="")), position = position_dodge(width=0.6), vjust = -0.5 ) +
  scale_fill_manual(values = plotCol)

pct # the is perfectly located above

ggplotly(pct, textposition = 'top center') # text crosses over the bars
Run Code Online (Sandbox Code Playgroud)

正如您所看到的 -ggplot效果非常好 - 但是当我转换为 时plotly,文本被移动。我尝试过在 ggplot 和plotly 中使用各种设置,但还没有运气。

Van*_*pez 5

看起来vjust未被识别,但可能在路线图上。来自 GitHub:

# convert ggplot2::element_text() to plotly annotation
make_label <- function(txt = "", x, y, el = ggplot2::element_text(), ...) {
  if (is_blank(el) || is.null(txt) || nchar(txt) == 0 || length(txt) == 0) {
    return(NULL)
  }
  angle <- el$angle %||% 0
  list(list(
    text = txt,
    x = x,
    y = y,
    showarrow = FALSE,
    # TODO: hjust/vjust?
    ax = 0,
    ay = 0,
    font = text2font(el),
    xref = "paper",
    yref = "paper",
    textangle = -angle,
    ...
  ))
}
Run Code Online (Sandbox Code Playgroud)

最简单的方法可能是在geom_text中分配y值,但您会失去一些高度缩放。

pct <- ggplot(dfpct, aes(x = periode, y = value, fill = P, group = P, width = 0.6)) + 
  geom_bar(stat = "identity", position="dodge", colour = "black", width = 0.7, show.legend = FALSE) +
  labs(x = NULL, y = "Calls") +
  theme_bw() +
  theme(panel.grid.major = element_blank(),
        plot.title = element_text(size = rel(1.2), face = "bold", vjust = 1.5),
        axis.title = element_text(face = "bold"),
        axis.text = element_text(),
        legend.position = "bottom",
        legend.direction = "vertical",
        legend.key.width = unit(2, "lines"),
        legend.key.height = unit(0.5, "lines"),
        legend.title = element_blank()) +
  geom_text(aes(label=paste(value*100,"%",sep=""), y = value+0.01), position = position_dodge(width = 0.6)) +
  scale_fill_manual(values = plotCol)

ggplotly(pct)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

或者,如果您知道最终输出的尺寸,您可以编辑plotly_build对象的组件:

gg <- plotly_build(pct)
gg$data[[4]]$y <- gg$data[[4]]$y+0.006
gg$data[[5]]$y <- gg$data[[5]]$y+0.006
gg$data[[6]]$y <- gg$data[[6]]$y+0.006
Run Code Online (Sandbox Code Playgroud)