尝试在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()