Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用ggplot2将条形图与线图叠加_R_Plot_Ggplot2_Overlay - Fatal编程技术网

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
变量作为一个因子而不是数字时,我在尝试使用e
geom_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 ~ .)