ggplot金字塔只是金字塔的一半

时间:2018-07-09 13:41:57

标签: r ggplot2 bar-chart

我编写了以下代码。我想要一座按性别划分的金字塔。相反,我得到了一半的金字塔,而另一半不可见。我的excel文件中有四列:年级,数字,年龄,性别

library(xlsx)
library(ggplot2)
library(plyr)

data1 <- read.xlsx("C:/Users/cameron.kashani/Documents/KPIs/R/Dummy KPI data.xlsx"
,sheetIndex=5,rowIndex=1:11,colIndex=1:4)

data1df<-data.frame(data1)

pyramid1 <- ggplot(data1df, aes(x = Grade, y = Number,fill=Age)) + 
  geom_bar(data=subset(data1df, data1df$Gender == "Female"), stat = "identity") + 
  geom_bar(data=subset(data1df, data1df$Gender == "Male"), stat = "identity") +
  scale_y_continuous(breaks = seq(-50, 50, 5),
                     labels=abs(seq(-50, 50, 5)))+
  coord_flip()+
  theme_bw()

pyramid1

2 个答案:

答案 0 :(得分:0)

我通过将其他geom_bar数据乘以-1解决了这一问题。事后看来很有意义。

pyramid1 <- ggplot(data1df, aes(x = Grade, y = Number, fill=Age)) + 
  geom_bar(data=subset(data1df, Gender == "Male"), stat = "identity") + 
  geom_bar(data=subset(data1df, Gender == "Female"),aes(y=Number*(-1)), stat = "identity") +
  scale_y_continuous(breaks = seq(-50, 50, 5),
                     labels=abs(seq(-50, 50, 5)))+
  coord_flip()+
  theme_bw()

答案 1 :(得分:0)

通常最好的做法是将变量映射到美学上,以最大程度地减少重复的几何图形-在这种情况下,您的geom_bar基本上都在做同样的事情。如果改为创建或更改变量以提前为一组设置负值,则无需将数据分为两组。通常对于年龄金字塔而言,这意味着一侧有女性专用杆,另一侧有男性专用杆,其位置在垂直轴上具有相同的位置,并且填充颜色映射到性别。

您没有包含数据,因此我做了一些建模工作,以对您的aes中的内容进行建模。

library(tidyverse)

set.seed(124)
df <- data_frame(age = rep(1:15, times = 2), 
             grade = rep(letters[1:15], times = 2),
             number = round(rnorm(30, mean = 100, sd = 20)), 
             gender = rep(c("a", "b"), each = 15))

df <- df %>%
  mutate(y = ifelse(gender == "a", number * -1, number))

ggplot(df, aes(x = grade, y = y, fill = age)) +
  geom_col(position = "stack") +
  scale_y_continuous(labels = abs) +
  coord_flip() +
  scale_fill_viridis_c()

reprex package(v0.2.0)于2018-07-09创建。