ggplot отображение выражения по оси x

ниже у меня есть код 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 ответов


вот рабочий пример - я поменял 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 

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


предложение @baptiste использовать функцию велико, хотя его код, возможно, не завершен, чтобы дать ожидаемые результаты. Можно также directely использовать функцию parse на scale_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)))