Ggplot2 в R дает неправильную окраску при создании перекрывающихся демографических пирамид
Я создаю перекрывающиеся демографические пирамиды в R с библиотекой ggplot2 для сравнения демографических данных из двух разных источников.
Однако я столкнулся с проблемами с ggplot2 и окраской при использовании альфа-параметра. Я пытался разобраться в структуре ggplot2 и geom_bar, но до сих пор это ни к чему не привело. Задача состоит в том, чтобы нарисовать четыре geom_bars, где два geom_bars перекрывают друг друга (мужчины и женщины, соответственно). У меня не было бы проблем, если бы мне не нужно было использовать альфу для демонстрации различий в моих данных.
Я был бы очень признателен за некоторые ответы, где я иду неправильно здесь. Как программист на R, я довольно близок к новичкам, поэтому терпите меня, если мой код выглядит странно.
Ниже мой код, который приводит к изображению, также показанному ниже. Я изменил свои демографические данные, чтобы они были случайными по этому вопросу.
library(ggplot2)
# Here I randomise my data for Stackru
poptest<-data.frame(matrix(NA, nrow = 101, ncol = 5))
poptest[,1]<- seq(0,100)
poptest[,2]<- rpois(n = 101, lambda = 100)
poptest[,3]<- rpois(n = 101, lambda = 100)
poptest[,4]<- rpois(n = 101, lambda = 100)
poptest[,5]<- rpois(n = 101, lambda = 100)
colnames(poptest) <- c("age","A_males", "A_females","B_males", "B_females")
myLimits<-c(-250,250)
myBreaks<-seq(-250,250,50)
# Plot demographic pyramid
poptestPlot <- ggplot(data = poptest) +
geom_bar(aes(age,A_females,fill="black"), stat = "identity", alpha=0.75, position = "identity")+
geom_bar(aes(age,-A_males, fill="black"), stat = "identity", alpha=0.75, position="identity")+
geom_bar(aes(age,B_females, fill="white"), stat = "identity", alpha=0.5, position="identity")+
geom_bar(aes(age,-B_males, fill="white"), stat = "identity", alpha=0.5, position="identity")+
coord_flip()+
#set the y-axis which (because of the flip) shows as the x-axis
scale_y_continuous(name = "",
limits = myLimits,
breaks = myBreaks,
#give the values on the y-axis a name, to remove the negatives
#give abs() command to remove negative values
labels = paste0(as.character(abs(myBreaks))))+
#set the x-axis which (because of the flip) shows as the y-axis
scale_x_continuous(name = "age",breaks=seq(0,100,5)) +
#remove the legend
theme(legend.position = 'none')+
# Annotate geom_bars
annotate("text", x = 100, y = -200, label = "males",size=6)+
annotate("text", x = 100, y = 200, label = "females",size=6)
# show results in a separate window
x11()
print(poptestPlot)
Это то, что я получаю в результате: (извините, как нуб Stackru я не могу вставлять свои фотографии)
Окрас действительно бессмысленный. Черный не черный, а белый не белый. Вместо этого он может использовать какую-то раскраску по умолчанию, потому что R или ggplot2 не могут интерпретировать мой код.
Я приветствую любые ответы. Спасибо.
1 ответ
Вы пытаетесь сопоставить "черный" с точками данных. Это означает, что вам нужно будет добавить ручную шкалу и сказать ggplot, чтобы каждый цвет был окрашен в черный цвет. Для этого есть ярлык scale_colour_identity. Однако, если это ваш единственный уровень, гораздо проще использовать заливку за пределами aes. Таким образом, весь geom заполняется черным или белым цветом соответственно:
poptestPlot <- ggplot(data = poptest) +
geom_bar(aes(age,A_females),fill="black", stat = "identity", alpha=0.75, position = "identity")+
geom_bar(aes(age,-A_males), fill="black", stat = "identity", alpha=0.75, position="identity")+
geom_bar(aes(age,B_females), fill="white", stat = "identity", alpha=0.5, position="identity")+
geom_bar(aes(age,-B_males), fill="white", stat = "identity", alpha=0.5, position="identity")+
coord_flip()+
#set the y-axis which (because of the flip) shows as the x-axis
scale_y_continuous(name = "",
limits = myLimits,
breaks = myBreaks,
#give the values on the y-axis a name, to remove the negatives
#give abs() command to remove negative values
labels = paste0(as.character(abs(myBreaks))))+
#set the x-axis which (because of the flip) shows as the y-axis
scale_x_continuous(name = "age",breaks=seq(0,100,5)) +
#remove the legend
theme(legend.position = 'none')+
# Annotate geom_bars
annotate("text", x = 100, y = -200, label = "males",size=6)+
annotate("text", x = 100, y = 200, label = "females",size=6)