我想在一个类似于人口金字塔的图上绘制两个变量:

由于我将在下面列出的原因,这个情节几乎存在但不完全.
我使用以下代码制作了这个图:
DATA <- data.frame(
state = c("AK", "TX", "CA", "MT", "NM", "AZ", "NV", "CO", "OR", "WY", "MI", "MN", "UT", "ID", "KS", "NE", "SD", "WA", "ND", "OK"),
sales_staff = c(20,30,40,10,15,35,18,25,22,7,12,22,3,4,5,8,14,28,24,32)
)
set.seed(1)
DATA$sales <- DATA$sales_staff * 50 + (runif(nrow(DATA)) * 1000)
# Order the state factor by number of sales staff so that it is plotted in that order
DATA$state <- factor(DATA$state, levels = DATA[order(DATA$sales_staff),"state"])
Run Code Online (Sandbox Code Playgroud)
我想背靠背"粘合"两个图,所以我使用了多个()函数来自http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_%28ggplot2%29/
(为简洁起见,我不会在这里重现该功能的代码)
我的最终情节代码是:
library(ggplot2)
g1 <- ggplot(data = DATA, aes(x = …Run Code Online (Sandbox Code Playgroud) 我想创建如下的金字塔密度图:

我可以达到的点是基于以下示例示例的simlele金字塔图:
set.seed (123)
xvar <- round (rnorm (100, 54, 10), 0)
xyvar <- round (rnorm (100, 54, 10), 0)
myd <- data.frame (xvar, xyvar)
valut <- as.numeric (cut(c(myd$xvar,myd$xyvar), 12))
myd$xwt <- valut[1:100]
myd$xywt <- valut[101:200]
xy.pop <- data.frame (table (myd$xywt))
xx.pop <- data.frame (table (myd$xwt))
library(plotrix)
par(mar=pyramid.plot(xy.pop$Freq,xx.pop$Freq,
main="Population Pyramid",lxcol="blue",rxcol= "pink",
gap=0,show.values=F))
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?
我想在R 中创建人口金字塔。我知道 StackOverflow 上有很多例子,但我想创建一个还包括人口预测的例子,即每个年龄组的条形按性别和按性别和年龄组划分的线条用于预测。
你可以在这里看到一个例子:http : //geographyblog.eu/wp/the-worlds-population-pyramid-is-changed-shape/

如果有一些关于如何更好地说明这一点的建议(例如使用平滑线),也欢迎提出,但我想指出当前的情况和预测。示例数据可在联合国网站上找到:http : //esa.un.org/wpp/population-pyramids/population-pyramids_absolute.htm
任何帮助将不胜感激。
对于示例数据集,我按国家/地区创建金字塔图,显示人口中超重男性和女性的级别(%).
library(plotrix)
xy.males.overweight<-c(23.2,33.5,43.6,33.6,43.5,43.5,43.9,33.7,53.9,43.5,43.2,42.8,22.2,51.8,
41.5,31.3,60.7,50.4)
xx.females.overweight<-c(13.2,9.4,13.5,13.5,13.5,23.7,8,3.18,3.9,3.16,23.2,22.5,22,12.7,12.5,
12.3,10,0.8)
agelabels<-c("uk","scotland","france","ireland","germany","sweden","norway",
"iceland","portugal","austria","switzerland","australia","new zealand","dubai","south africa",
"finland","italy","morocco")
par(mar=pyramid.plot(xy.males.overweight,xx.females.overweight,labels=agelabels,
gap=9))
Run Code Online (Sandbox Code Playgroud)
我在这里使用'plotrix'找到了这种方法:https://stats.stackexchange.com/questions/2455/how-to-make-age-pyramid-like-plot-in-r
我希望创建一个稍微更详细的金字塔图,两边都添加一个堆积条形图,显示男性和女性的超重和百分比肥胖(最好是红色/蓝色的不同色调)."肥胖"的示例数据值如下:
xx.females.obese<-c(23.2,33.5,43.6,33.6,43.5,23.5,33.9,33.7,23.9,43.5,18.2,22.8,22.2,31.8,
25.5,25.3,31.7,28.4)
xy.males.obese<-c(13.2,9.4,13.5,13.5,13.5,23.7,8,3.18,3.9,3.16,23.2,22.5,22,12.7,12.5,
12.3,10,0.8)
Run Code Online (Sandbox Code Playgroud)
此外,如果图表上的"年龄"可以更改(到国家/地区),那将有所帮助.
非常感谢您的任何帮助/建议.我愿意在适当时使用plotrix或ggplot2.
如果R中的命令太长,是否可以将其余部分写到下一行?
例如
tmp = -0.00773 + 1.5657 -0.9391 + 0.4753 - 0.1019 -0.00495
tmp = -0.00773 + 1.5657 -0.9391
+ 0.4753 - 0.1019 -0.00495
Run Code Online (Sandbox Code Playgroud)
会给出不同的结果。
谢谢!
我试图从ggplot2中的后简化人口金字塔中重现简单的人口金字塔
使用ggplot2和dplyr(而不是plyr).
这是原始示例plyr和种子
set.seed(321)
test <- data.frame(v=sample(1:20,1000,replace=T), g=c('M','F'))
require(ggplot2)
require(plyr)
ggplot(data=test,aes(x=as.factor(v),fill=g)) +
geom_bar(subset=.(g=="F")) +
geom_bar(subset=.(g=="M"),aes(y=..count..*(-1))) +
scale_y_continuous(breaks=seq(-40,40,10),labels=abs(seq(-40,40,10))) +
coord_flip()
Run Code Online (Sandbox Code Playgroud)
工作良好.
但是我怎样才能生成相同的情节dplyr呢?该示例plyr在subset = .(g ==语句中使用.
我尝试过以下内容dplyr::filter但出现错误:
require(dplyr)
ggplot(data=test,aes(x=as.factor(v),fill=g)) +
geom_bar(dplyr::filter(test, g=="F")) +
geom_bar(dplyr::filter(test, g=="M"),aes(y=..count..*(-1))) +
scale_y_continuous(breaks=seq(-40,40,10),labels=abs(seq(-40,40,10))) +
coord_flip()
Error in get(x, envir = this, inherits = inh)(this, ...) :
Mapping should be a list of unevaluated mappings created by aes or aes_string
Run Code Online (Sandbox Code Playgroud) 请帮我在R金字塔图中添加平滑线条(图中所示的粗黑线),如附图所示.感谢您的帮助.该图显示了根据年龄和性别的人口分布.
xy.pop<-c(3.2,3.5,3.6,3.6,3.5,3.5,3.9,3.7,3.9,3.5,3.2,2.8,2.2,1.8,1.5,1.3,0.7,0.4)
xx.pop<-c(3.2,3.4,3.5,3.5,3.5,3.7,4,3.8,3.9,3.6,3.2,2.5,2,1.7,1.5,1.3,1,0.8)
agelabels<-c("0-4","5-9","10-14","15-19","20-24","25-29","30-34",
"35-39","40-44","45-49","50-54","55-59","60-64","65-69","70-74",
"75-79","80-44","85+")
mcol<-color.gradient(c(0,0,0.5,1),c(0,0,0.5,1),c(1,1,0.5,1),18)
fcol<-color.gradient(c(1,1,0.5,1),c(0.5,0.5,0.5,1),c(0.5,0.5,0.5,1),18)
par(mar=pyramid.plot(xy.pop,xx.pop,labels=agelabels,main="Australian population pyramid 2002",lxcol=mcol,rxcol=fcol,))
Run Code Online (Sandbox Code Playgroud) 有没有一种方法可以ggplot2用来创建不同的堆叠条形图,如下面图像右图所示?
library(ggplot2)
library(scales)
library(reshape)
dat <- read.table(text = " ONE TWO THREE
1 23 234 324
2 34 534 12
3 56 324 124
4 34 234 124
5 123 534 654",sep = "",header = TRUE)
# reshape data
datm <- melt(cbind(dat, ind = rownames(dat)), id.vars = c('ind'))
# plot
ggplot(datm,aes(x = variable, y = value,fill = ind)) +
geom_bar(position = "fill",stat = "identity") +
coord_flip()
Run Code Online (Sandbox Code Playgroud)