【问题标题】:Creating a legend for a histogram graph in ggplot2 that is colored according to the data subset the histogram data came from在 ggplot2 中为直方图创建图例,根据直方图数据来自的数据子集着色
【发布时间】:2018-02-01 16:36:16
【问题描述】:

我试图告诉 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 中的填充函数根据数据来自哪个数据集为分数着色?

【问题讨论】:

    标签: r ggplot2 histogram


    【解决方案1】:

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

    编辑以包括将两个数据集组合在一起:

    假设您想将 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 中的鸢尾花数量加上该 bin 中的 setosa 鸢尾花数量相加。

    希望有帮助!

    【讨论】:

    • 感谢您的评论。我将数据子集分为两种格式,因为我正在比较整个州的评估分数和州数据的较小子集(一个县)。目前还不清楚我将如何引用所有的州数据,然后只引用一个县的数据而不进行子集化。
    • 好的,我会用一个我经常这样做的例子来编辑我的答案
    • 太棒了!谢谢卡米尔。我不知道这个标记功能。我认为这会奏效。
    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多