- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在维基百科上,有一个奇妙的人口金字塔,显示了性别过剩。我如何使用 ggplot2 和/或 plotly 在 R 中重新创建它?
它本质上是一个双层堆叠的条形图,已定向 90 度。
# Here is some population data
library(wpp2019)
# Male
data(popM)
# Female
data(popF)
最佳答案
在下面的代码中,大部分工作都在数据整形中,而 ggplot 代码相对简单。
library(wpp2019)
library(tidyverse)
data(popM)
data(popF)
list(Male=popM, Female=popF) %>%
imap(~.x %>%
filter(name=="World") %>%
select(age, !!.y:=`2020`)) %>%
reduce(full_join) %>%
mutate(age = factor(age, levels=unique(age)),
`Female surplus` = pmax(Female - Male, 0),
`Male surplus` = pmax(Male - Female, 0),
Male = Male - `Male surplus`,
Female = Female - `Female surplus`) %>%
pivot_longer(-age) %>%
mutate(value = case_when(grepl("Male", name) ~ -value,
TRUE ~ value),
name = factor(name, levels=c("Female surplus", "Female",
"Male surplus", "Male"))) %>%
ggplot(aes(value, age, fill=name)) +
geom_col() +
geom_vline(xintercept=0, colour="white") +
scale_x_continuous(label=function(x) ifelse(x < 0, -x, x),
breaks=scales::pretty_breaks(6)) +
labs(x=NULL, y=NULL, fill=NULL) +
scale_fill_discrete(type=RColorBrewer::brewer.pal(name="RdBu", n=4)[c(1,2,4,3)],
breaks=c("Male surplus", "Male", "Female","Female surplus")) +
theme_bw() +
theme(legend.position="bottom")
作为另一种选择,您可以将垂直轴标签放置在条形之间。这个版本也使用分面,所以我们可以很容易地按性别标记分面。然后在图例中,我们只需要标记条形的多余部分。
library(ggpol)
library(ggthemes)
list(Male=popM, Female=popF) %>%
imap(~.x %>%
filter(name=="World") %>%
select(age, !!.y:=`2020`)) %>%
reduce(full_join) %>%
mutate(age = factor(age, levels=unique(age)),
`Female surplus` = pmax(Female - Male, 0),
`Male surplus` = pmax(Male - Female, 0),
Male = Male - `Male surplus`,
Female = Female - `Female surplus`) %>%
pivot_longer(-age) %>%
mutate(facet = factor(ifelse(grepl("Female", name), "Female", "Male"),
c("Male","Female")),
value = case_when(grepl("Male", name) ~ -value,
TRUE ~ value),
name = factor(name, levels=c("Female surplus", "Female",
"Male surplus", "Male"))) %>%
ggplot(aes(value, age, fill=name)) +
geom_col() +
geom_vline(xintercept=0, colour="white") +
scale_x_continuous(label=function(x) ifelse(x < 0, -x, x),
breaks=scales::pretty_breaks(3),
expand=c(0,0)) +
labs(x=NULL, y=NULL, fill=NULL) +
facet_share(vars(facet), scales="free_x") +
scale_fill_discrete(type=RColorBrewer::brewer.pal(name="RdBu", n=4)[c(1,2,4,3)],
breaks=c("Male surplus", "Female surplus")) +
theme_clean() +
theme(legend.position="bottom",
legend.background=element_blank(),
legend.key.height=unit(4,"mm"),
legend.margin=margin(t=0),
plot.background=element_blank(),
strip.text=element_text(face="bold", size=rel(0.9)))
关于r - R 中性别过剩的人口金字塔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69287518/
我试图在固定的时间间隔后依次旋转一个红色三角形和一个绿色三角形。我尝试了以下代码,但时间间隔不是常数。我无法找出问题所在。 static void display(void) { now=g
我有一些基本代码可以使用 glut 收集按键事件。 如果我按住一个键,我会触发连续事件(向下/向上/向下/向上/向下/向上/......),而不是预期的向下(一次,在开始时)及以上(一次,最后) #i
当我尝试调整过剩窗口的大小时,屏幕变为空白。 这是 reshape 回调函数的代码: void Resize(int width, int height) { CurrentWidth =
我使用最新的 freeglut 成功编译了这段代码,但我不断得到一个空白窗口,其中填充了 glClearColor 函数中指定的颜色。这个简单的程序来 self 学院提供的交互式计算机图形学教科书。我
任何人都可以解释发生了什么或没有发生什么,以便我可以更正它。到目前为止,这是来自 .cpp 文件的代码。在 Visual Studio Community 2015 中运行。 #include #i
我正在学习一个 openGL 教程,其中包括这个名为“glutCreateWindow”的函数,我的编译器(XCode 5 gcc,OSX)说它已被弃用。 还有什么选项适合替换这些“过剩*”相关函数?
我使用 OpenGL 3.3。在我的应用程序中,我将鼠标光标设置在窗口的中心(我将窗口的大小传递给“Camera”类的构造函数),但是当我调整窗口大小时(如全屏)我将光标放在左边的部分。所以,我想通过
我在为我的 GLUT 小行星游戏显示和动画多个小行星时遇到问题。我可以生成 1 ok,但是当我尝试添加更多时,输出不正确,createasteroid 不断被调用,并且出于某种原因只是在屏幕的不同部分
我认为我遇到了一个棘手的问题。我是 C++ 和 OpenGL/glut 的新手,所以要温柔!我正在编写一个独立于平台的简单程序(仅 2D)并且需要一个基本的 UI,因此我有一个生成 Button 对象
我很笨 :) 那么有人可以帮忙编写分步手册,如何安装“cairo”、“glut”并在 Windows 7 上的 VS 2010 项目 (C++) 中使用它吗? PS:最有趣的事情是我在 Linux 中
在我的 GLUT/OpenGL 练习中,我必须加载 3 个不同的对象,我给它们一个 file.m。这是通过读取该文件、创建列表并最终调用 glCallList() 来完成的。选择一个对象后,我必须如何
我正在尝试制作 gluLookAt() 函数,以便当我按下向上和向下键时,相机围绕 X 轴移动 我正在尝试我在以下位置看到的方法:http://www.lighthouse3d.com/tutoria
我是一名优秀的程序员,十分优秀!