在 R 中为这两个直方图添加图例

Posted

技术标签:

【中文标题】在 R 中为这两个直方图添加图例【英文标题】:Adding a legend to these two histograms in 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"。这应该会给你一个传奇。 【参考方案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() 更改它以达到预期的颜色。希望这对你来说有点清楚!

以上是关于在 R 中为这两个直方图添加图例的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2画横向直方图以及去掉图例

在R中为一个工作表制作多个类别的单独直方图

R语言plotly可视化:plotly可视化二维直方图等高线图使用子图的方式在二维直方图等高线图的顶部和右侧添加两个变量的边缘直方图(2D Histogram Contour Subplot)

r怎么把图例设置在绘图区外

python画柱状图 python画直方图

如何在直方图的 matplotlib 图例中制作线条而不是框/矩形