尝试在R中创建人口金字塔时出现错误结果

尝试在R中创建人口金字塔时出现错误结果,r,ggplot2,R,Ggplot2,我正在尝试创建一个人口树,我遵循了这个非常好的帖子: 然而,我似乎无法复制它: 样本数据: df <- structure(list( alter = c(18:23), Geschlecht = c("männlich", "weiblich", "männlich", "weiblich", "männlich", "weiblich" ) , n = c(1,2,4,6,8,2) ) ,

我正在尝试创建一个人口树,我遵循了这个非常好的帖子:

然而,我似乎无法复制它:

样本数据:

df <- structure(list( alter = c(18:23),
                Geschlecht =  c("männlich", "weiblich", "männlich", "weiblich", "männlich", "weiblich" )  ,
                n = c(1,2,4,6,8,2) ) ,
                row.names = 1:6,
                class = "data.frame"

                     )



ggplot(data = df, 
   mapping = aes(x = alter, fill = Geschlecht, 
                 y = ifelse(test = Geschlecht == "männlich", 
                            yes = -n, no = n))) +
geom_bar(stat = "identity") +
scale_y_continuous(labels = abs, limits = max(df$n) * c(-1,1)) +
labs(y = "Anzahl") +
coord_flip()

str(df$alter)
然而,最终的情节看起来一团糟 我怎样才能解决这个问题,使情节看起来更像原始帖子中的情节

提前谢谢

编辑:我的数据如下所示:

 > head(df)
# A tibble: 6 x 3
# Groups:   alter [3]
alter Geschlecht     n
<dbl> <chr>      <int>
  1     0 männlich      27
  2     0 weiblich      26
  3     1 männlich      43
  4     1 weiblich      61
  5     2 männlich      60
  6     2 weiblich      55
>头部(df)
#一个tibble:6x3
#分组:alter[3]
改变Geschlecht n
1万尼里奇27
20威布里奇26
3 1 männlich 43
4 1威布里奇61
52Männlich 60
6.2威布里奇55

我试图复制您的数据,并制作一个可能对您有用的金字塔图

首先,一些我认为与您类似的数据:

set.seed(1234)
alter <- rep(1:75, each=2)
Geschlecht <- rep(strrep(c("männlich", "weiblich"), 1), 75)
v <- sample(1:20, 150, replace=T) # these are the values to make the pyramid
df <- data.frame(alter = alter, Geschlecht = Geschlecht, v=v)
rm(alter, Geschlecht, v)     # remove the vectors to stop ggplot getting confused

也可以使用原始样式的代码(生成与上述相同的绘图,但行数较少):


设法找到了基础数据的错误。显然,
alter
的一些实例包含一个非绝对数,导致绘图中充满了“细线”

多亏了@meenaparam和其他人的帮助,剧情现在看起来很好——结果证明我很愚蠢


您能发布一个数据示例吗?像
dput(df)
,所以我们可以复制您的代码。@heck1我试图用其他数据复制您的代码。这对我来说很好,您使用的是最新的软件包版本/R版本吗?您好,这正是问题所在:如果您将年龄变量转换为因子,y轴将变得混乱。我试图避免将数值变量作为因子来防止出现这种情况,但这两种方法似乎都会产生可疑的结果。啊,现在我同意你的观点,对不起!我认为问题在于情节的细线,而不是计数的顺序。我会再试一次。好的,如果您只是删除第一个方法的aes`参数中
v附近的
as.factor
,这会给您想要的绘图吗?现在在我的机器上看起来是正确的,所以我会更新答案@heck1@heck1我改变了答案,这是你想要的吗?嘿,谢谢你处理这个问题这么好!好的,所以我仔细检查了代码-如果我使用as.factor版本,不会出现“非常细的线条”的问题,但排序问题仍然存在。我尝试了两种版本,但它们似乎都不起作用。从理论上讲,将y轴转换为数字应该是可行的,对于示例代码也是如此。我会更新我的第一篇文章,提供更多关于数据的信息。!
set.seed(1234)
alter <- rep(1:75, each=2)
Geschlecht <- rep(strrep(c("männlich", "weiblich"), 1), 75)
v <- sample(1:20, 150, replace=T) # these are the values to make the pyramid
df <- data.frame(alter = alter, Geschlecht = Geschlecht, v=v)
rm(alter, Geschlecht, v)     # remove the vectors to stop ggplot getting confused
library(ggplot2)
ggplot(data=df, aes(x=alter, fill=Geschlecht)) + 
  geom_bar(stat="identity", data=subset(df,Geschlecht=="weiblich"), aes(y=v)) + 
  geom_bar(stat="identity", data=subset(df,Geschlecht=="männlich"),aes(y=v*-1)) + 
  scale_y_continuous(breaks=seq(-40,40,10),labels=abs(seq(-40,40,10))) + 
  labs(y = "Anzahl", x = "Alter") +
  coord_flip()
ggplot(data = df, 
       mapping = aes(x = alter, fill = Geschlecht, 
                     y = ifelse(test = Geschlecht == "männlich", 
                                yes = -v, no = v))) +
  geom_bar(stat = "identity") +
  scale_y_continuous(labels = abs, limits = max(df$v) * c(-1,1)) +
  labs(y = "Anzahl", x = "Alter") +
  coord_flip()