在ggplot2中为直方图生成图例,该图例根据直方图数据来源的数据子集进行着色

时间:2018-02-01 16:36:17

标签: r ggplot2 histogram

我试图告诉ggplot引用两个数据子集来为我的直方图条纹着色。如何指示AES中的填充功能根据数据来自哪个数据集为分数着色?

SW_WP_data=subset(sw_og, OG_CTYPE=="WP" & DSGSTTXT=="Designated" & OG_CLASS=="Pine")
ASP_WP_data=subset(sw_og, OG_CTYPE=="WP" & DSGSTTXT=="Designated" & OG_CLASS=="Pine" & NEWSUBSC=="ASP")

SW_ASP_WP=ggplot(data=SW_WP_data, aes(x=OGSCORE), fill=?) + 
  geom_histogram(binwidth=.6, alpha=.6, col="black") +
  geom_histogram(data=ASP_WP_data, binwidth=.6, fill='red', col="black", alpha=.6)+
  geom_vline(xintercept=33, linetype="dashed", colour="red")+
  xlim(0,65)+
  ylim(0,15)+
  theme(plot.title = element_text(hjust=0.5))+
  labs(title = "Statewide vs. ASP", y= "Count", x="Scores", caption = "2012 data")+
  scale_fill_discrete(name="Data Extent", values=c("grey5", "red3"), labels=c("Statewide", "ASP"))

image link 显示了我正在尝试制作的内容,但有一个图例引用了来自两个不同数据框的分数。如何指示AES中的填充功能根据数据来自哪个数据集为分数着色?

1 个答案:

答案 0 :(得分:0)

通常ggplot需要长格式的数据,因此您不需要像上面那样对数据帧进行子集化;你应该只为填充美学指定一个变量,因此只需要调用geom_histogram一次。你没有包含数据,所以我用虹膜数据集做了一个模型。

修改以包含两个数据集:

假设您想将setosa虹膜与所有虹膜种类进行比较。我通常做的是制作我的子集,添加一个列来标记它,然后将它绑定回也有一个标志列的完整数据集。

setosa_only <- iris %>% 
    filter(Species == "setosa") %>% 
    mutate(flag = "setosa")
df <- iris %>% 
    mutate(flag = "all irises") %>%
    bind_rows(setosa_only)

这样的事情应该得到你想要的东西:

ggplot(df, aes(x = Sepal.Length, fill = flag)) +
  geom_histogram(position = "dodge") +
  geom_vline(xintercept = 5, linetype = "dashed", color = "red") +
  scale_fill_manual(values = c("grey5", "red3", "steelblue"))

加上任何铃声和放大器你想要的口哨。

有几点需要注意:

  • 由于我没有你的数据,我不知道x截距的重要性。我刚刚投入虚拟值。
  • 由于填充被映射到审美,因此需要进入aes
  • 如果您想手动指定颜色,则需要scale_fill_manual,而不是scale_fill_discretescale_*_manual函数是具有values参数的函数,您可以为其指定颜色,大小,形状等。
  • 在编辑后的版本中,我将position = "dodge"添加到直方图中。那是因为你比较整体显示了一个子集,所以你要清楚你不是要在一个bin中添加irises的数量加上那个中的setosa irises的数量箱中。

希望有所帮助!