ggplot在x轴上显示表达式

8
以下是我编写的R代码,用于绘制分组条形图。
group_name = c('A_1x', 'A_1x', 'A_2x', 'A_2x', 'A_3x', 'A_3x', 'A_4x', 'A_4x')

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


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

目前,图表如下所示。然而,我想展示x轴上的表情,就像下面的图片所示。

enter image description here

我已经尝试过这样做:

group_name = c(expression(A[1*x]),expression(A[1*x]),
               expression(A[2*x]),expression(A[2*x]),
               expression(A[3*x]),expression(A[3*x]),
               expression(A[4*x]),expression(A[4*x]))

但是它会提示以下错误:
Error in as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class ""expression"" to a data.frame

如何修复它?
3个回答

5

这里有一个可行的例子 - 我将group_name更改为4个元素而不是8个,并手动添加到ggplot表达式中。问题在于,表达式类型不能是data.frame的列名。这样可以避免这个问题。

library(ggplot2)
group_name = c('A_1x', 'A_1x', 'A_2x', 'A_2x', 'A_3x', 'A_3x', 'A_4x', 'A_4x')
mydata2 <- data.frame(mygroup = group_name, 
                      mysubgroup = factor(c("Yes", "No"), 
                                          levels = c("Yes", "No")), 
                      value = c(60,40,90,10,55,45,88,12))

group_name = c(expression(A[1*x]),
               expression(A[2*x]),
               expression(A[3*x]),
               expression(A[4*x]))

ggplot(mydata2, aes(mygroup, value, fill = mysubgroup)) + 
  geom_bar(position = "dodge", width = 0.5, stat = "identity")+ 
  coord_flip() +
  scale_x_discrete(labels=group_name)  # Adding the labels here 

3
在我看来,一个人应该能够创建一个表达式向量,而不是必须明确输入每个表达式。这是我能想出的最好方法,但或许有更加优雅的方法:scale_x_discrete(labels=sapply(paste0("A[", 1:4, "*x]"), function(i) parse(text=i))) - eipi10

5

labels可以是一个函数。

group_name = sprintf("A[%i*x]", rep(1:4,each=2))

# alternatively, use gsub with your original vector
# group_name = c('A_1x', 'A_1x', 'A_2x', 'A_2x', 'A_3x', 'A_3x', 'A_4x', 'A_4x')
# gsub("A_([0-9])x","A[\\1*x]", group_name)

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


ggplot(mydata2, aes(mygroup, value, fill = mysubgroup)) + 
  geom_bar(position = "dodge", width = 0.5, stat = "identity")+ 
  coord_flip() + scale_x_discrete(labels = function(l) parse(text=l))

enter image description here


1
@baptiste提出使用函数的建议很好,尽管他的代码可能不完整以产生预期的结果。一个人也可以直接使用函数parsescale_x_discrete(labels = parse(text=levels(mydata2$mygroup)))中。

修改后的代码以生成图表:

group_name = sprintf("A[%i*x]", rep(1:4,each=2))

# alternatively, use gsub with your original vector
# group_name = c('A_1x', 'A_1x', 'A_2x', 'A_2x', 'A_3x', 'A_3x', 'A_4x', 'A_4x')
# gsub("A_([0-9])x","A[\\1*x]", group_name)

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

ggplot(mydata2, aes(mygroup, value, fill = mysubgroup)) + 
  geom_bar(position = "dodge", width = 0.5, stat = "identity")+ 
  coord_flip() + 
  scale_x_discrete(labels = parse(text=levels(mydata2$mygroup)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接