#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. о, я вижу, у меня нет панели, потому что заголовок оси был слишком длинным, поэтому не было никакой панели, теперь все в порядке, большое спасибо за вашу помощь!