2016-06-10 3 views
6

Ниже приведен код R, который отображает график сгруппированных штрихов.ggplot, отображающий выражение по оси x

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 

Как это исправить?

ответ

4

Вот рабочий пример. Я изменил 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 
+1

Мне показалось, что один должен быть в состоянии создать вектор выражений вместо того, чтобы вводить каждый явно. Это лучшее, что я мог бы добавить, но, возможно, есть более элегантный метод: «scale_x_discrete (labels = sapply (paste0 (« A [", 1: 4," * x] "), функция (i) parse (text = я))) ' – eipi10

2

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

Смежные вопросы