使用ggplot2

时间:2017-08-27 19:34:40

标签: r plot ggplot2 overlay

我的问题类似于发布herehere的问题。

我正在ggplot创建一个图表,其中我有一个条形图,然后想要叠加多个折线图。出于这个问题的目的,我复制了两个条形图的代码(一个包括所有年份(2007-2015)和两个特定年份(2007年和2015年),但最终我将覆盖10年不同的数据。使用的数据可以找到here

library(dplyr)
library(tidyr)
library(gridExtra)
library(ggplot2)

overallpierc<-data[(data$item=="piercing"),]

overp<-overallpierc %>%
  group_by(age) %>% 
  count(sex) %>% 
  ungroup %>% 
  mutate(age = factor(age)) %>%
  complete(age, sex, fill = list(n = 0)) %>% 
  ggplot(aes(age, n)) + 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))

p07<-data[(data$yy=="2007") & (data$item=="piercing"),]
summary(p07)

subp07<-p07 %>%  
  group_by(age) %>% 
  count(sex) %>% 
  ungroup %>% 
  mutate(age = factor(age)) %>%
  complete(age, sex, fill = list(n = 0)) %>% 
  ggplot(aes(age, n)) + 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))

p15<-data[(data$yy=="2015") & (data$item=="piercing"),]

subp15<-p15 %>% 
  group_by(age) %>% 
  count(sex) %>% 
  ungroup %>% 
  mutate(age = factor(age)) %>%
  complete(age, sex, fill = list(n = 0)) %>% 
  ggplot(aes(age, n)) + 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))

grid.arrange(overp, subp07, subp15)

我发布的代码给出了下图。 enter image description here

我想要做的是绘制2007年和2015年女性的频率以及2007年和2015年的男性在总频率的条形图上的频率(这也反映在图例中)。有没有办法在R使用ggplot2

进行此操作

更新:我尝试使用geom_smoothgeom_line函数按照评论中的建议和用户的其他解决方案将行添加到ggplot问题,但我收到以下错误:

  

错误:提供给连续刻度的离散值

我为要绘制的子集创建了一个新数据框:

df<-data.frame(age=c(15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,40,50,60), val=c(0,5,13,77,70,106,62,51,46,27,46,16,22,16,14,48,21, 3,4))

然后将其添加到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))

Others遇到了类似的问题,并使用as.numeric来解决问题。但是,年龄需要被视为绘图目的的一个因素。

1 个答案:

答案 0 :(得分:3)

根据我们在评论中的讨论,让我们尝试堆叠的条形和方面。我认为它有效,但你可以自己决定。

堆叠条的优点是在同一条中显示比例和总数。为了比较年份,刻面网格在行中放置多年,因此眼睛可以向下扫描以比较不同年份的相同年龄。请注意,我在这里将年龄保持为连续变量,而不是因素。

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"))

enter image description here

不错 - 我可以直接看到,例如,随着时间的推移,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"))

enter image description here

还有一个例子没有按照总计数或条形图来解决你的问题 - 但我认为这可能是有意义的。此代码生成&#34;热图&#34;对于定量比较而言较差的情节风格,但有时可以给出有趣特征的快速视觉印象。例如,我认为这表明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")

enter image description here

修改

根据评论中的进一步讨论,这里有一种方法可以将年龄作为一个因素,使用性别条形图,用总线覆盖并按年份分开。

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 ~ .)

enter image description here