避免在 Parcats 痕迹中切断我的标签

问题描述 投票:0回答:1

如何避免我的标签在此图表中被截断?

library(plotly)
dd <- data.frame(from = c("Super Super Super Long Title", "A"), 
                   to = c("B", "Also very very long title"))
plot_ly(dd) %>% 
  add_trace(type = "parcats", 
            dimensions = list(list(values = ~ from), 
                              list(values =  ~ to)))

我尝试添加

layout(yaxis = list(automargin = TRUE))
但无济于事(我猜边界在技术上不是轴。

理想情况下,我正在寻找一种解决方案,不需要手动摆弄值,因为图表将成为闪亮应用程序的一部分,我无法控制最终标签。

任何其他巧妙的技巧,例如缩写标签并在悬停中显示它们,都值得赞赏,但我真的很好奇如何自动调整边距以合并我的所有情节。


手动添加一些边距可以解决这个问题,但正如我所说,我正在寻找一个自动版本(也就是说,如果我能找到一种方法来计算适当的边距,我也很乐意接受这个答案):

plot_ly(dd) %>% 
  add_trace(type = "parcats", 
            dimensions = list(list(values = ~ from), 
                              list(values =  ~ to))) %>% 
  layout(margin = list(l = 120, r = 90))

r plotly
1个回答
0
投票

您可以在绘图之前或之后包裹字符串。我提供了一种执行这两个选项的方法。如果您遇到任何问题,请告诉我。任一选项都会产生相同的结果。

选项1

在绘图之前用换行符包裹字符串。

lapply
中,我将其设置为查看每列中的每一行,并每 15 个字符换行一次长字符串。这不会分解一个单词,因此最多 15 个字符。

如果 15 个字符太多或不够,它只会在函数中出现一次,因此很容易更改:

strwrap(..., 15)

library(plotly)
dd <- data.frame(from = c("Super Super Super Long Title", "A"), 
                 to = c("B", "Also very very long title"))

# option 1 - wrap text before graphing
invisible(lapply(1:ncol(dd), function(j) {  # for every column
  lapply(1:nrow(dd), function(k) {          # for every row
    dd[j, k] <<- paste0(strwrap(dd[j, k], 15), collapse = "<br />")
  })                                        # break long strings with line breaks
}))

plot_ly(dd) %>% 
  add_trace(type = "parcats", 
            dimensions = list(list(values = ~ from), 
                              list(values =  ~ to))) %>% 
  layout(margin = list(l = 50, r = 50))

选项2

绘图后用换行符换行字符串。

在此选项中,我使用了 UDF,它可以在绘图构建后对其进行修改。这只是与您的图表一起调用。如果您有多种颜色,则可能需要进行一些调整。 (如果您因为这个原因需要我重新访问它......或任何其他原因,请告诉我。)

与上一个选项一样,该选项在换行字符串之前也设置为 15 个字符。

# option 2 - wrap text after graphing
wrapper <- function(plt) {
  plt <- plotly_build(plt)           # go to where the labels are, for each label
  lapply(1:length(plt$x$data[[1]]$dimensions), function(k) {
    lapply(1:length(plt$x$data[[1]]$dimensions[[k]]$values), function(j) {
      xx <- plt$x$data[[1]]$dimensions[[k]]$values[[j]]
      yy <- paste0(strwrap(xx, 15), collapse = "<br />")
      plt$x$data[[1]]$dimensions[[k]]$values[[j]] <<- yy
    })                                    # break long strings with line breaks
  })
  plt   # return the modified plot
}
dd <- data.frame(from = c("Super Super Super Long Title", "A"), 
                 to = c("B", "Also very very long title"))
plot_ly(dd) %>% 
  add_trace(type = "parcats", 
            dimensions = list(list(values = ~ from), 
                              list(values =  ~ to))) %>% 
  layout(margin = list(l = 50, r = 50)) %>% 
  wrapper()                                    # <--- calling the UDF!

© www.soinside.com 2019 - 2024. All rights reserved.