R 使用ggplot2将条形图与线图叠加
我的问题类似于那些贴出来的问题 我正在R 使用ggplot2将条形图与线图叠加,r,plot,ggplot2,overlay,R,Plot,Ggplot2,Overlay,我的问题类似于那些贴出来的问题 我正在ggplot中创建一个图形,其中我有一个条形图,然后希望覆盖多个线形图。出于这个问题的目的,我复制了两个条形图的代码(一个包括所有年份(2007-2015年)和两个特定年份(2007和2015年),但最终我将叠加10个不同年份的数据。可以找到使用的数据 然后将其添加到ggplot代码: overallpierc %>% filter(age != "15") %>% group_by(age) %>% count(sex)
ggplot
中创建一个图形,其中我有一个条形图,然后希望覆盖多个线形图。出于这个问题的目的,我复制了两个条形图的代码(一个包括所有年份(2007-2015年)和两个特定年份(2007和2015年),但最终我将叠加10个不同年份的数据。可以找到使用的数据
然后将其添加到ggplot
代码:
overallpierc %>%
filter(age != "15") %>%
group_by(age) %>%
count(sex) %>%
ungroup %>%
mutate(age = factor(age)) %>%
complete(age, sex, fill = list(n = 0)) %>%
ggplot(aes(age, n)) +
geom_line(data=df,aes(x=as.numeric(age),y=val),colour="blue") +
geom_col(aes(fill = sex), position = "dodge") +
theme_classic() +
scale_fill_manual(values=c("#000000", "#CCCCCC"), name = "Sex") +
labs(x = "Age", y = "Number of observations") +
theme(legend.position=c(0.4,0.8),
plot.title = element_text(size = 10),
legend.title=element_text(size=15),
axis.title=element_text(size=15),
legend.key.size = unit(1.13, "cm"),
legend.direction="vertical",
legend.text=element_text(size=15))
遇到了类似的问题,并使用
作为.numeric
来解决问题。但是,在绘图时需要将年龄视为一个因素。根据我们在评论中的讨论,让我们尝试堆叠条形图和镶嵌面。我认为这是可行的,但您可以自行决定
堆叠条形图的优点是在同一条形图中显示比例和总计数。为了比较年份,镶嵌面网格将年份排成一行,因此眼睛可以向下扫描以比较不同年份中的相同年龄。请注意,我在这里将年龄作为一个连续变量,而不是一个因子
library(dplyr)
library(ggplot2)
data30g %>%
count(yy, sex, age) %>%
ggplot(aes(age, n)) +
geom_col(aes(fill = sex)) +
facet_grid(yy ~ .) +
theme_bw() +
scale_fill_manual(values = c("#000000", "#cccccc"))
不错——比如说,我可以马上看到,随着时间的推移,30岁时的总人数和女性人数都有所增加,但可能有点小而拥挤
我们可以使用镶嵌面包裹而不是网格来使条形图更清晰,但这是以牺牲跨年份的快速视觉比较为代价的
data30g %>%
count(yy, sex, age) %>%
ggplot(aes(age, n)) +
geom_col(aes(fill = sex)) +
facet_wrap(~yy, ncol = 2) +
theme_bw() +
scale_fill_manual(values = c("#000000", "#cccccc"))
还有一个例子,它没有从总计数或条形图的角度解决您的问题,但我认为这可能是一个有趣的例子情节风格,不适合进行定量比较,但有时会给人一种有趣特征的快速视觉印象。例如,我认为这表明2014年20岁的女性拥有最高的总数量
data30g %>%
count(yy, sex, age) %>%
ggplot(aes(factor(age), yy)) +
geom_tile(aes(fill = n)) +
facet_grid(sex ~ .) +
scale_fill_gradient2() +
scale_y_reverse(breaks = 2006:2015) +
labs(x = "age", y = "Year")
编辑:
根据评论中的进一步讨论,这里有一种方法可以将年龄作为一个因素来绘制,使用条形图表示性别,用一条线覆盖总数,并按年份划分
overallpierc %>%
count(yy, sex, age) %>%
ggplot() +
geom_col(aes(factor(age), n, fill = sex), position = "dodge") +
stat_summary(aes(factor(age), n), fun.y = "sum", geom = "line", group = 1) +
facet_grid(yy ~ .)
你能简单地将geom_smooth添加到基于数据帧的ggplot中,每个年龄的值都是观测值吗?是的,但我希望学习如何编写更复杂的解决方案,而不是每次都必须创建单独的数据帧,因为我在论文中不断遇到这个问题。我有一个类似的问题在我的论文中,我定义了一个在数据帧上运行并生成所需结果数据帧的函数。在调用ggplot组件时,我将数据参数设置为我的数据帧的函数,即+geom_smooth(data=aggregatingFunction(df),aes…)你会考虑使用叠加条吗?这会给你频率在同一个酒吧中的性别和总频率。然后你只需一年一个方面。如果我认为这是有用的话,我会发布一个例子。@ BurutueGe态态考师可能会建议:<代码> GeoMePooT(数据=乐趣(数据),AES(x=年龄,y=NOBS,组=1),STAT=‘摘要’,乐趣。y=和)+STATRY摘要。(fun.y=sum,geom=“line”)这并不是我想要实现的目标,但是如果无法使用
ggplot2
将多个线图叠加到条形图上,这可能就足够了。感谢您的帮助!当我强制将age
变量作为一个因子而不是数字时,我在尝试使用egeom_smooth
和geom_line
函数。您可能知道这方面的解决方法吗?(我更新了上面的问题。)我想问题是您将geom_line()中的age
更改为数值,但不在ggplot()中
部分。是的,我想这一定是个问题。但是,我正试图将年龄
作为ggplot()
部分的一个因素,因为我不希望在30、40、50和60之间有大的空间。但是,似乎年龄
需要在几何行()
部分。有没有办法解决这个问题?例如,当年龄为数值时,30、40、50和60之间不会出现那些大的空格?在您的新代码示例中,M+F的总和由堆叠条的总高度给出。我不清楚为什么需要一行。但是:我用根据你最初的问题,一些代码使用stat\u summary
将线条覆盖在条形图上。就我个人而言,我认为条形图上方的线条不是一种好的可视化技术。
data30g %>%
count(yy, sex, age) %>%
ggplot(aes(factor(age), yy)) +
geom_tile(aes(fill = n)) +
facet_grid(sex ~ .) +
scale_fill_gradient2() +
scale_y_reverse(breaks = 2006:2015) +
labs(x = "age", y = "Year")
overallpierc %>%
count(yy, sex, age) %>%
ggplot() +
geom_col(aes(factor(age), n, fill = sex), position = "dodge") +
stat_summary(aes(factor(age), n), fun.y = "sum", geom = "line", group = 1) +
facet_grid(yy ~ .)