如何使表达式在 ggplot 中的轴标签上出现多行?

How to make an expression go onto multiple lines for axis labels in ggplot?

对于下面的一段代码,我希望能够做到 group_name 进入轴标签中的多行。类似于 str_wrap 在 R 中的工作方式。

我一直在努力让它在 make_labels2 函数中以及它之外工作。不确定是否有最佳方法?

非常感谢任何帮助。

group_name = sprintf("A[%i*x This is a long string and I would like it to look nicely wrapped on the x axis label]", rep(1:4,each=2)) #added long string from code solution
group_name3 = sprintf("A[%i*y]", rep(1:4,each=2))

make_labels2 <- function(value) {
  x <- as.character(value)
  #do.call(expression, lapply(x, function(y) bquote(atop(bold(.(y)), "this"~italic("degree")~x)) ))
  do.call(expression, lapply(x, function(y) bquote(atop(bold(.(strsplit(y,split="_")[[1]][[1]]))~"_"~italic(.(strsplit(y,split="_")[[1]][[2]])), "this"~italic("degree")~x)) ))
}

mydata2 <- data.frame(mygroup = group_name, 
                      mygroup3 = group_name3,
                      mysubgroup = factor(c("Yes", "No"), 
                                          levels = c("Yes", "No")), 
                      value = c(60,40,90,10,55,45,88,12))
mydata2$mygrp2 <- paste0(mydata2$mygroup,"_",mydata2$mygroup3)

ggplot(mydata2, aes(mygrp2, value, fill = mysubgroup)) + 
  geom_bar(position = "dodge", width = 0.5, stat = "identity")+ 
  coord_flip() + 
  scale_x_discrete(labels = make_labels2)

要将标签添加到新行中,请使用 "\r\n" 来创建。这是一个例子

library(ggplot2)

group_name = sprintf("A[%i*x This is a long string and I would like it to look nicely wrapped on the x axis label]", rep(1:4,each=2)) #added long string from code solution
group_name3 = sprintf("A[%i*y]", rep(1:4,each=2))

make_labels2 <- function(value) {
  x <- as.character(value)
  #do.call(expression, lapply(x, function(y) bquote(atop(bold(.(y)), "this"~italic("degree")~x)) ))
  x <- lapply(x, function(x) { paste(strwrap(x, width = 10), collapse = "\r\n") })
  x <- do.call(expression, lapply(x, function(y) bquote(atop(bold(.(strsplit(y,split="_")[[1]][[1]]))~"_"~italic(.(strsplit(y,split="_")[[1]][[2]])), "this"~italic("degree")~x)) ))
  x
}

mydata2 <- data.frame(mygroup = group_name, 
  mygroup3 = group_name3,
  mysubgroup = factor(c("Yes", "No"), 
    levels = c("Yes", "No")), 
  value = c(60,40,90,10,55,45,88,12))
mydata2$mygrp2 <- paste0(mydata2$mygroup,"_",mydata2$mygroup3)

ggplot(mydata2, aes(mygrp2, value, fill = mysubgroup)) + 
  geom_bar(position = "dodge", width = 0.5, stat = "identity")+ 
  coord_flip() + 
  scale_x_discrete(labels = make_labels2)

输出图