Как изменить порядок легенды в ggplot2?

Учитывая два столбца данных с категориальным столбцом меток и количественным столбцом процентных данных, я могу надежно создать гистограмму в ggplot, которая сортирует столбцы по значению, а не по алфавиту, используя следующее:

ggplot(data=df, aes(x=reorder(Label, Percent), y=Percent, fill=Label)) + geom_bar()

Это говорит о необходимости сортировки гистограммы по процентному значению, а не по тексту, что упрощает просмотр изменений.

Однако я не могу заставить легенду соответствовать: вместо этого она продолжает сортироваться по исходным алфавитным значениям. Это приводит к легенде, которая не соответствует диаграмме, которая вводит в заблуждение.

Я посмотрел на Stackru и в других местах, и не нашел исправления, которое будет работать. Любой совет?

Редактировать: согласно запросам, это, по сути, данные:

Labels <- c("G", "G", "A", "C", "M", "B", "M", "G", "A","M")
Percent <- c("-0.241","-0.046", "-0.037", "-0.024", "-0.003","0.007","0.01","0.059","0.121", "0.152")

2 ответа

Решение

Я считаю, что самый простой способ - просто изменить порядок ваших данных перед построением графика. Указав reorder(() внутри aes()Вы, по сути, делаете заказанную копию для черчения деталей, но это сложно для ggplot передать это, например, функциям создания легенды.

Это должно работать просто отлично:

df$Label  <- with(df, reorder(Label, Percent))
ggplot(data=df, aes(x=Label, y=Percent, fill=Label)) + geom_bar()

Я полагаю, ваш Percent столбец числовой, а не коэффициент или символ. Это не ясно из вашего вопроса. В будущем, если вы разместите dput(df) классы будут однозначными, а также позволят людям копировать / вставлять ваши данные в R.

С данными, которые вы предоставили, мне подходит следующее, в основном применяя предложение Фрэнка:

Labels <- c("G", "G", "A", "C", "M", "B", "M", "G", "A","M")
Percent <- c("-0.241","-0.046", "-0.037", "-0.024", "-0.003","0.007","0.01","0.059","0.121", "0.152")
df <- data.frame(Labels, Percent)
df$Percent <- as.numeric(as.character(df$Percent))
legend_ord <- levels(with(df, reorder(Labels, Percent)))

library(ggplot2)
p <- ggplot(data=df, aes(x=reorder(Labels, Percent), y = Percent, fill=Labels)) 
p <- p + geom_bar(stat="identity")
p + scale_fill_discrete(breaks=legend_ord)

Что касается вашего дополнительного вопроса, если у вас есть определенные цвета, вы можете назначить их в пределах scale_fill_manual вызов.

p <- ggplot(data=df, aes(x=reorder(Labels, Percent), y = Percent, fill=Labels)) 
p <- p + geom_bar(stat="identity")
p + scale_fill_manual(breaks=legend_ord, 
    values=c("G"="#0000FF", "C"="#003FBF","B"="#007F7F","A"="#00BF3F","M"="#00FF00"))

Другие вопросы по тегам