如何避免我的标签在此图表中被截断?
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))
您可以在绘图之前或之后包裹字符串。我提供了一种执行这两个选项的方法。如果您遇到任何问题,请告诉我。任一选项都会产生相同的结果。
在绘图之前用换行符包裹字符串。
在
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))
绘图后用换行符换行字符串。
在此选项中,我使用了 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!