Измените порядок в соответствии с переменной расплавленного фрейма данных

#r #ggplot2 #melt

#r #ggplot2 #расплав

Вопрос:

У меня есть следующие данные:

 DF=structure(list(experiment = c("BR", "CH", "EP", "IP", "JU", "MA", 
"SA", "ST", "SV", "VI"), duration = c(28L, 9L, 20L, 4L, 14L, 
30L, 26L, 23L, 17L, 6L), percentage_total_exp = c(47.2222222222222, 
51.063829787234, 52.3809523809524, 79.0322580645161, 48.6842105263158, 
72.7272727272727, 62.0689655172414, 34.469696969697, 61.1111111111111, 
34.8837209302326), nb_reaction = c(29, 29, 14, 11, 40, 11, 14, 
14, 23, 18)), .Names = c("experiment", "duration", "percentage_total_exp", 
"nb_reaction"), row.names = c(NA, -10L), class = "data.frame")
 

Я расплавил свои данные, чтобы показать их в виде следующего ggplot

 meltR=melt(DF)
ggplot(meltR, aes(x=experiment , y = value, group = variable, fill = variable))   geom_bar(stat = "identity", position="dodge")
 

Теперь проблема в том, что я хочу иметь 3 версии этого сюжета. Один упорядочен по переменной : duration , а второй по переменной: percentage_total_exp и последний по переменной : nb_reaction .

Я не знаю, как это уточнить. Я пытался y = reorder(value, -duration) , но на самом деле он не распознал длительность. Является ли плавление плохой идеей в данном случае ? как это сделать ?

РЕДАКТИРОВАНИЕ 2: минимальный код для добавления, потому что мое experiment имя на самом деле очень длинное

 plots <- lapply(levels(meltR$variable), function(lev) {
  meltR$experiment <- factor(meltR$experiment, levels = meltR$experiment[order(meltR$value[meltR$variable == lev])])
  ggplot(meltR, aes(x=experiment , y = value, group = variable, fill = variable))   geom_bar(stat = "identity", position="dodge")   ggtitle(lev)   theme_bw()   theme(axis.text.x = element_text(size=10, angle=45, hjust=1, vjust=1, face="bold"))
    })
grid.arrange(grobs = plots)
 

Большое спасибо

Ответ №1:

duration это не имя столбца, а уровень фактора столбца, названного variable в вашем примере. Таким образом, это работает не так. Одним из вариантов может быть перебор трех уровней факторов или variable изменение их порядка в соответствии с value ними, а затем построение графика. Вот как это может работать:

 library(ggplot2)
library(reshape2)
library(gridExtra)
DF=structure(list(experiment = c("BR", "CH", "EP", "IP", "JU", "MA", 
"SA", "ST", "SV", "VI"), duration = c(28L, 9L, 20L, 4L, 14L, 
30L, 26L, 23L, 17L, 6L), percentage_total_exp = c(47.2222222222222, 
51.063829787234, 52.3809523809524, 79.0322580645161, 48.6842105263158, 
72.7272727272727, 62.0689655172414, 34.469696969697, 61.1111111111111, 
34.8837209302326), nb_reaction = c(29, 29, 14, 11, 40, 11, 14, 
14, 23, 18)), .Names = c("experiment", "duration", "percentage_total_exp", 
"nb_reaction"), row.names = c(NA, -10L), class = "data.frame")
meltR=melt(DF)
plots <- lapply(levels(meltR$variable), function(lev) {
  meltR$experiment <- factor(meltR$experiment, levels = meltR$experiment[order(-meltR$value[meltR$variable == lev])])
  ggplot(meltR, aes(x=experiment , y = value, group = variable, fill = variable))   geom_bar(stat = "identity", position="dodge")   ggtitle(lev)
})
grid.arrange(grobs = plots)
 

введите описание изображения здесь

Комментарии:

1. Так мило !! большое спасибо 🙂 ! последний момент, поддерживал ли он добавление темы? (смотрите мою правку). Когда я добавляю его, у меня нет значений в моем графике :/

2. Не имеет никакого значения, добавляете ли вы тему или нет; например plots <- lapply(levels(meltR$variable), function(lev) { meltR$experiment <- factor(meltR$experiment, levels = meltR$experiment[order(-meltR$value[meltR$variable == lev])]) ggplot(meltR, aes(x=experiment , y = value, group = variable, fill = variable)) geom_bar(stat = "identity", position="dodge") ggtitle(lev) theme_bw() theme(axis.text.x = element_text(angle = 90)) }); grid.arrange(grobs = plots) , тоже работает.

3. о, я вижу, у меня нет панели, потому что заголовок оси был слишком длинным, поэтому не было никакой панели, теперь все в порядке, большое спасибо за вашу помощь!