2014-11-11 3 views
1

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

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

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

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

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

Edit: согласно запросам, это, по существу данные:

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") 
+1

Можете ли вы представить представительный пример вашего 'df', чтобы мы могли воспроизвести вашу проблему? – cdeterman

+1

Вы пробовали что-то вроде '+ scale_fill_discrete (breaks = c (" Top "," Middle "," Bottom "))'? – Jota

+0

Предоставленные данные. Что касается scale_fill_discrete, это не решило проблему. Любые другие вопросы, просто дайте мне знать. – sogrady

ответ

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.

+0

Это проще, потому что одновременно решает проблему цвета. Благодаря! – sogrady

2

С данными вы предоставили следующие работы для меня в основном применяя предложение от Frank:

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) 

enter image description here

Что касается вашего последующего вопроса, если у вас есть конкретные цвета, вы можете назначить их в вызове 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")) 

enter image description here

+0

Ах, сказочно, спасибо! Приношу свои извинения Фрэнку за то, что он не понял его оригинального комментария. Есть ли способ указать цвета scale_fill_discrete? У меня есть набор из 10 цветов, которые я хотел бы применить, если это возможно. Еще раз спасибо! – sogrady

+1

@sogrady, см. Править. – cdeterman

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