gpt4 book ai didi

r - 使用R和ggplot2绘制金字塔图

转载 作者:行者123 更新时间:2023-12-03 11:07:38 24 4
gpt4 key购买 nike

我需要绘制一个金字塔图,如所附的图。

我从here中找到了一个使用R(而不是ggplot)的示例,有人可以给我一些使用ggplot进行此操作的提示吗?谢谢!

最佳答案

本质上,这是一个背对背的barplot,类似于在优秀的学习者博客中使用ggplot2生成的那种:http://learnr.wordpress.com/2009/09/24/ggplot2-back-to-back-bar-charts/

您可以在其中一个图上使用coord_flip,但是我不确定如何像上面一样在两个图之间共享y轴标签。下面的代码应该使您足够接近原始代码:

首先创建一个数据样本数据框,将“年龄”列转换为具有所需断点的因子:

require(ggplot2)
df <- data.frame(Type = sample(c('Male', 'Female', 'Female'), 1000, replace=TRUE),
Age = sample(18:60, 1000, replace=TRUE))

AgesFactor <- ordered( cut(df$Age, breaks = c(18,seq(20,60,5)),
include.lowest = TRUE))

df$Age <- AgesFactor

现在开始构建图:使用数据的相应子集创建公图和母图,隐藏图例等。
gg <- ggplot(data = df, aes(x=Age))

gg.male <- gg +
geom_bar( subset = .(Type == 'Male'),
aes( y = ..count../sum(..count..), fill = Age)) +
scale_y_continuous('', formatter = 'percent') +
opts(legend.position = 'none') +
opts(axis.text.y = theme_blank(), axis.title.y = theme_blank()) +
opts(title = 'Male', plot.title = theme_text( size = 10) ) +
coord_flip()

对于女性图,使用 trans = "reverse"反转“百分比”轴...
gg.female <- gg + 
geom_bar( subset = .(Type == 'Female'),
aes( y = ..count../sum(..count..), fill = Age)) +
scale_y_continuous('', formatter = 'percent', trans = 'reverse') +
opts(legend.position = 'none') +
opts(axis.text.y = theme_blank(),
axis.title.y = theme_blank(),
title = 'Female') +
opts( plot.title = theme_text( size = 10) ) +
coord_flip()

现在创建一个图,只是为了使用 geom_text显示年龄段括号,还使用一个虚拟的 geom_bar来确保该图中“​​年龄”轴的比例与男性和女性图中的比例相同:
gg.ages <- gg + 
geom_bar( subset = .(Type == 'Male'), aes( y = 0, fill = alpha('white',0))) +
geom_text( aes( y = 0, label = as.character(Age)), size = 3) +
coord_flip() +
opts(title = 'Ages',
legend.position = 'none' ,
axis.text.y = theme_blank(),
axis.title.y = theme_blank(),
axis.text.x = theme_blank(),
axis.ticks = theme_blank(),
plot.title = theme_text( size = 10))

最后,使用Hadley Wickham的书中的方法将图布置在网格上:
grid.newpage()

pushViewport( viewport( layout = grid.layout(1,3, widths = c(.4,.2,.4))))

vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)

print(gg.female, vp = vplayout(1,1))
print(gg.ages, vp = vplayout(1,2))
print(gg.male, vp = vplayout(1,3))

关于r - 使用R和ggplot2绘制金字塔图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4559229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com