Как управлять упорядочением сложенной гистограммы с использованием идентификатора на ggplot2
Используя этот манекен data.frame
ts <- data.frame(x=1:3, y=c("blue", "white", "white"), z=c("one", "one", "two"))
Я пробую и рисую с категорией "синий" сверху.
ggplot(ts, aes(z, x, fill=factor(y, levels=c("blue","white" )))) + geom_bar(stat = "identity")
![введите описание изображения здесь]()
дает мне "белый" сверху. и
ggplot(ts, aes(z, x, fill=factor(y, levels=c("white", "blue")))) + geom_bar(stat = "identity")
![введите описание изображения здесь]()
меняет цвета, но все же дает мне "белый" сверху. Как я могу получить "синий" сверху?
Ответы
Ответ 1
Я боролся с тем же вопросом раньше. Похоже, что ggplot разбивает бары на основе их внешнего вида в dataframe. Таким образом, решение вашей проблемы заключается в сортировке ваших данных по коэффициенту заполнения в обратном порядке, в котором вы хотите, чтобы он отображался в легенде: нижний элемент поверх фрейма данных и верхний элемент внизу:
ggplot(ts[order(ts$y, decreasing = T),],
aes(z, x, fill=factor(y, levels=c("blue","white" )))) +
geom_bar(stat = "identity")
![введите описание изображения здесь]()
Изменить: дополнительная иллюстрация
Используя образцы данных, я создал три графика с разными порядками данных, я думал, что больше заполняющих переменных сделает вещи немного яснее.
set.seed(123)
library(gridExtra)
df <- data.frame(x=rep(c(1,2),each=5),
fill_var=rep(LETTERS[1:5], 2),
y=1)
#original order
p1 <- ggplot(df, aes(x=x,y=y,fill=fill_var))+
geom_bar(stat="identity") + labs(title="Original dataframe")
#random order
p2 <- ggplot(df[sample(1:10),],aes(x=x,y=y,fill=fill_var))+
geom_bar(stat="identity") + labs(title="Random order")
#legend checks out, sequence wird
#reverse order
p3 <- ggplot(df[order(df$fill_var,decreasing=T),],
aes(x=x,y=y,fill=fill_var))+
geom_bar(stat="identity") + labs(title="Reverse sort by fill")
plots <- list(p1,p2,p3)
do.call(grid.arrange,plots)
![введите описание изображения здесь]()
Ответ 2
Для чего это стоит, в версии ggplot2 2.2.1 порядок стека больше не определяется порядком строк в data.frame. Вместо этого он соответствует порядку легенды, определяемому порядком уровней в коэффициенте.
d <- data.frame(
y=c(0.1, 0.2, 0.7),
cat = factor(c('No', 'Yes', 'NA'), levels = c('NA', 'Yes', 'No')))
# Original order
p1 <- ggplot(d, aes(x=1, y=y, fill=cat)) +
geom_bar(stat='identity')
# Change order of rows
p2 <- ggplot(d[c(2, 3, 1), ], aes(x=1, y=y, fill=cat)) +
geom_bar(stat='identity')
# Change order of levels
d$cat2 <- relevel(d$cat, 'Yes')
p3 <- ggplot(d, aes(x=1, y=y, fill=cat2)) +
geom_bar(stat='identity')
grid.arrange(p1, p2, p3, ncol=3)
В результате получается следующий график:
![введите описание изображения здесь]()
Ответ 3
Используйте group
атетический вызов ggplot()
. Это гарантирует, что все слои будут уложены одинаково.
series <- data.frame(
time = c(rep(1, 4),rep(2, 4), rep(3, 4), rep(4, 4)),
type = rep(c('a', 'b', 'c', 'd'), 4),
value = rpois(16, 10)
)
ggplot(series, aes(time, value, group = type)) +
geom_col(aes(fill = type)) +
geom_text(aes(label = type), position = "stack")
Ответ 4
У меня точно такая же проблема сегодня. Вы можете получить blue
сверху, используя order=-as.numeric()
:
ggplot(ts,
aes(z, x, fill=factor(y, levels=c("blue","white")), order=-as.numeric(y))) +
geom_bar(stat = "identity")
Ответ 5
У меня была похожая проблема, и я обошел ее, изменив уровень фактора. думал, что поделюсь кодом:
library(reshape2)
library(ggplot2)
group <- c(
"1",
"2-4",
"5-9",
"10-14",
"15-19",
"20-24",
"25-29",
"30-34",
"35-39",
"40-44",
"45-49"
)
xx <- factor(group, levels(factor(group))[c(1, 4, 11, 2, 3, 5:10)])
method.1 <- c(36, 14, 8, 8, 18, 1, 46, 30, 62, 34, 34)
method.2 <- c(21, 37, 45, 42, 68, 41, 16, 81, 51, 62, 14)
method.3 <- c(37, 46, 18, 9, 16, 79, 46, 45, 70, 42, 28)
elisa.neg <- c(12, 17, 18, 6, 19, 14, 13, 13, 7, 4, 1)
elisa.eq <- c(3, 6, 3, 14, 1, 4, 11, 13, 5, 3, 2)
test <- data.frame(person = xx,
"Mixture Model" = method.1,
"Censoring" = method.3,
"ELISA neg" = elisa.neg,
"ELISA eqiv" = elisa.eq)
melted <- melt(test, "person")
melted$cat <- ifelse(melted$variable == "Mixture.Model", "1",
ifelse(melted$variable == "Censoring", "2", "3"))
melted$variable = factor(melted$variable, levels = levels(melted$variable)[c(1, 2, 4,3 )]) ## This did the trick of changing the order
ggplot(melted, aes(x = cat, y = value, fill = variable)) +
geom_bar(stat = 'identity') + facet_wrap(~ person) +
theme(axis.ticks.x=element_blank(),
axis.text.x=element_blank()) +
labs(title = "My Title",
y = "Per cent", x = "Age Group", fill = "")
(Извините, это мои данные, я не воспроизводил с использованием данных из исходного поста, надеюсь, все в порядке!)
Ответ 6
Смешивать ваши данные для того, чтобы граф выглядел хорошо, кажется плохой идеей. Вот альтернатива, которая работает для меня при использовании position_fill()
:
ggplot(data, aes(x, fill = fill)) + geom_bar(position = position_fill(reverse = TRUE))
Аргумент reverse = TRUE
отражает порядок расположения столбцов. Это работает и в position_stack
.