Измените легенду для сопоставления с другой переменной в R ggplot 2 - PullRequest
0 голосов
/ 05 июля 2018

У меня есть пирамида, очень упрощенную версию которой можно нарисовать с помощью кода ниже.

#sample data
c <- c(1,2,3,1,2,3)
g <- c("Group A","Group A","Group A","Group B","Group B","Group B")
v <- c(22,34,56,12,44,21)
df <- data.frame(c,g,v)

# here is the plot
library(ggplot2)
ggplot()+
geom_bar(aes(fill=g,y=v,x=c), stat="identity", data=subset(df,g=="Group A"), 
width=0.8)+
geom_bar(aes(fill=g,y=-v,x=c), stat="identity", data=subset(df,g=="Group B"), 
width=0.8)+
scale_y_continuous(breaks=seq(-50,50,10),labels=abs(seq(-50,50,10)))+
coord_flip()

Это не традиционный пирамидальный график с долями населения в возрастных группах, но у меня есть веская причина для визуализации моих данных таким образом. Теперь вот проблема: две популяции, которые я сравниваю на левой и правой стороне графика, я планирую четко обозначить аннотациями на графике. Это один из серии подобных графиков, и одна популяция всегда будет справа, а другая слева (g в моем примере). Проблема с этим графиком заключается в том, что категории (в данном примере 'c') имеют длинные описательные имена и лучше всего пронумерованы легендой, в которой говорится, что они из себя представляют.

Итак, мне нужен сюжет, который выглядит следующим образом, но имеет легенду с указанием категорий и их дескрипторов (например, «1: Элементарно», «2: Промежуточное звено ',' 3: Дополнительно 'и т. Д.), Которые относятся к переменной' c ', а не к значениям по умолчанию, основанным на моих двух группах населения. Кстати, в моем реальном сюжете у меня есть тринадцать баров, представляющих тринадцать различных категорий, а не три, которые у меня есть здесь.

Я попытался использовать scale_color_manual и установить эстетический аргумент для переменной c, что казалось логичным (во всяком случае, мне!), Но это ничего не делает.

1 Ответ

0 голосов
/ 05 июля 2018

Если вы обновите свои категории, чтобы они стали символом или фактором, вы можете затем сопоставить эту переменную с новой эстетикой, такой как color

c=(c("1 - Elementary","2 - Intermediate","3 - Advanced","1 - Elementary","2 - Intermediate", "3 - Advanced"))
g=c("Group A","Group A","Group A","Group B","Group B","Group B")
v=as.numeric(c(22,34,56,12,44,21))
df<-data.frame(c,g,v)

# here is the plot

library(ggplot2)
ggplot(df)+
  geom_bar(aes(fill=g,y=v,x=c, color = c), stat="identity",data=subset(df,g=="Group A"), 
           width=0.8)+
  geom_bar(aes(fill=g,y=-v,x=c, color = c),stat="identity",data=subset(df,g=="Group B"), 
           width=0.8)+
  scale_y_continuous(breaks=seq(-50,50,10),labels=abs(seq(-50,50,10))) +
  coord_flip()

enter image description here

Вы также можете просто отказаться от дополнительной эстетики и просто позволить оси сообщить читателю, какая группа является какой:

ggplot(df)+
  geom_bar(aes(fill=g,y=v,x=c), stat="identity",data=subset(df,g=="Group A"), 
           width=0.8)+
  geom_bar(aes(fill=g,y=-v,x=c),stat="identity",data=subset(df,g=="Group B"), 
           width=0.8)+
  scale_y_continuous(breaks=seq(-50,50,10),labels=abs(seq(-50,50,10))) +
  coord_flip()

enter image description here

...