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 я не могу вставлять свои фотографии)

Ggplot2 результат

Окрас действительно бессмысленный. Черный не черный, а белый не белый. Вместо этого он может использовать какую-то раскраску по умолчанию, потому что 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)

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