ggplot在x轴上显示表达式

Co *_*der 6 expression r bar-chart ggplot2

下面,我有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() 
Run Code Online (Sandbox Code Playgroud)

目前,情节如下图所示.但是,我想在x轴上显示表达式,如下图所示.

在此输入图像描述

我试过这个:

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]))
Run Code Online (Sandbox Code Playgroud)

但它给出了以下错误:

Error in as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class ""expression"" to a data.frame
Run Code Online (Sandbox Code Playgroud)

怎么解决?

cga*_*ge1 5

这是一个工作示例 - 我将其更改group_name为4个元素而不是8个,并手动将它们添加到ggplot表达式中.问题是表达式类型不能是a的列名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 
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,一个人应该能够创建一个表达式的向量,而不必显式地键入每个表达式。这是我能想到的最好的方法,但是也许有一个更优雅的方法:`scale_x_discrete(labels = sapply(paste0(“ A [”,1:4,“ * x]”)),function(i)parse(text = i)))` (2认同)

bap*_*ste 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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述