【问题标题】:Adding a legend to these two histograms in R在 R 中为这两个直方图添加图例
【发布时间】:2021-03-06 16:19:06
【问题描述】:

我发现 R 和 ggplot 非常不直观。因此,任何指导将不胜感激。我已经尝试将我想要制作直方图的两个向量放入一个数据框中,但我永远无法让每个直方图的 alpha 值不同。

所以现在我使用代码:

ggplot(mydata) + geom_histogram(aes(x=mydata$D2prediction75At,y = ..density..,color = "blue"),color="darkblue", fill="blue",bins=41, alpha=0.75) 
 + geom_histogram(aes(x=mydata$D2y,y = ..density..,color = "red"),color="darkblue", fill="red",bins=41, alpha=0.5) 

还有一些其他选项,希望不相关:

+ theme_pander() + ggtitle("Histograms") +xlab("Subjective Elicitations")+ylab("Density")+theme(  panel.border = element_blank(),  panel.grid.major = element_blank(),  panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")) + theme(plot.title = element_text(hjust = 0.5))  

生产:

我只想添加一个图例,显示红色直方图代表数据 A,蓝色代表数据 B。

这在 R 中似乎是一项非常困难的任务。

【问题讨论】:

  • 尝试从两个 geom 中删除 color="darkblue"。这应该会给你一个传奇。

标签: r ggplot2


【解决方案1】:

ggplot 设计用于处理长格式数据 - 在这种情况下,图例会自动生成。我建议将您的数据转换为 ggplot 喜欢的格式。您尚未共享任何数据,但根据您的 ggplot 调用,这是我的最佳猜测。如果您需要调试帮助,请分享您的数据的可重现样本。

mydata_long = pivot_longer(mydata, cols = c(D2prediction75At, D2y))

ggplot(mydata_long, aes(x = value, fill = name)) +
  geom_histogram(alpha = 0.65, bins = 41, color = "darkblue") +
  scale_fill_manual(values = c(D2prediction75At = "blue", D2y = "red") +
  ... # your other options

【讨论】:

  • 我试过这个和类似的方法,但我永远无法让两个直方图都有效地处于密度范围内。它们要么是计数,要么是密度,但在第一个数据系列的规模上。
  • 是的 - 如果您需要调试帮助,我们需要一些示例数据...
【解决方案2】:

我们也可以

 mydata_long <- melt(mydata,  measure = c("D2prediction75At", "D2y"))
ggplot(mydata_long, aes(x = value, fill = variable)) +
  geom_histogram(alpha = 0.65, bins = 41, color = "darkblue") +
   scale_fill_manual(values = c(D2prediction75At = "blue", D2y = "red") +
   ... # your other options

【讨论】:

    【解决方案3】:

    除了 @GregorThomas 的好建议之外,您还可以尝试下一种方法。首先是使用iris 数据集的示例,您需要在aes() 中传递fill 选项,然后使用scale_fill_manual()

    library(ggplot2)
    #Example
    ggplot(iris)+
      geom_histogram(aes(x=Sepal.Length,y = ..density..,color = "blue",fill='B'),
                     color="darkblue",bins=41, alpha=0.75)+
      geom_histogram(aes(x=Sepal.Width,y = ..density..,color = "red",fill='A'),
                     color="darkblue",bins=41, alpha=0.5)+
      scale_fill_manual(values=c("blue","red"),'Var')
    

    输出:

    对于您的代码,试试这个(未测试,因为没有共享数据):

    #Code OP
    ggplot(mydata) + 
      geom_histogram(aes(x=D2prediction75At,y = ..density..,
                         color = "blue",fill='B'),
                     color="darkblue",bins=41, alpha=0.75) +
      geom_histogram(aes(x=D2y,y = ..density..,color = "red",fill='A'),
                     color="darkblue",bins=41, alpha=0.5)+
      scale_fill_manual(values=c("blue","red"),'Data')+
      theme_pander() + 
      ggtitle("Histograms") +
      xlab("Subjective Elicitations")+
      ylab("Density")+
      theme(  panel.border = element_blank(),
              panel.grid.major = element_blank(),
              panel.grid.minor = element_blank(),
              axis.line = element_line(colour = "black")) +
      theme(plot.title = element_text(hjust = 0.5))  
    

    【讨论】:

    • 感谢这项工作!虽然不知道它在做什么......
    • @user434180 我会解释一下。您在 aes() 之外的填充值没有创建图例。您可以将fill 移动到aes() 内并指定一个名称,比如说A。这将创建图例。由于没有定义填充颜色,您需要使用 scale_fill_manual() 更改它以达到预期的颜色。希望这对你来说有点清楚!
    最近更新 更多