一个图中绘制两个直方图(ggplot)

6

嗯,我一直在这个网站上寻找如何在一个图中制作两个直方图的方法。

ggplot()+geom_histogram(data=etapa1, aes(x=AverageTemperature),col="red")+
geom_histogram(data=etapa2, aes(x=AverageTemperature),col="blue")

我有两个不同颜色的直方图,但是我没有得到一个图例或标签来显示哪个颜色代表什么。我该如何制作它?


1
我们如何在没有数据的情况下生成您的图表? - Spacedman
在这个例子中,数据并不重要。您可以使用 etapa1$AverageTemperature = 1:10 和 etapa2$AverageTemperature = 7:12,其中 etapa1 和 etapa2 是两个数据框架,我使用的数据量很大。 - Skullgreymon
一般而言,您可以结合这两个data.frames并在两个数据集中添加一个额外的变量,例如etapa,并将每个值设置为所需值(例如分别为12)。 然后在aes()语句中使用fill = etapa - Timo Wagner
我尝试了1和2,直方图只有一种颜色。但是像你之前说的用一个字符串“ ”就可以正常工作。我不知道为什么,可能是我没有正确输入值。 - Skullgreymon
1
如果有人必须费心写两行 R 代码来复制您的问题,那么他们尝试解决您的问题的可能性就会降低73.2%。给他们两行代码,让他们能够轻松复制粘贴示例数据集,这样他们就更有可能尝试解决您的问题了。 - Spacedman
抱歉,我不想让任何人为我的示例编写代码。我想知道如何解决我的问题,即如何合并这两个数据集。我不知道这两行R代码是否很重要,或者它们是否浪费了太多时间和精力。无论如何,这是我在该网站上的第一个问题,希望以后还有更好的提问方式。感谢您的建议。 - Skullgreymon
2个回答

15
< p >正如< em > Spacedman 所说的那样,如果您能更详细地说明您的问题并提供一个示例数据集,那将会更好。 < p >因此,我创建了一个随机样本集,模拟温度。
etapa1 <- data.frame(AverageTemperature = rnorm(100000, 16.9, 2))
etapa2 <- data.frame(AverageTemperature = rnorm(100000, 17.4, 2))

#Now, combine your two dataframes into one.  First make a new column in each.
etapa1$e <- 'etapa1'
etapa2$e <- 'etapa2'

# combine the two data frames etapa1 and etapa2
combo <- rbind(etapa1, etapa2)

ggplot(combo, aes(AverageTemperature, fill = e)) + geom_density(alpha = 0.2)

对我来说,使用密度图似乎比直方图更明显,因为温度是实数。

希望这可以在某种程度上有所帮助......

如果您不想合并两个数据框,那就有点棘手了...... 您必须使用 scale_colour_manualscale_fill_manual。然后为 fill 语句定义一个变量。这可以在标签部分中链接。

ggplot() + 
  geom_density(data = etapa1, aes(x = AverageTemperature, fill = "r"), alpha = 0.3) +
  geom_density(data = etapa2, aes(x = AverageTemperature, fill = "b"), alpha = 0.3) +
  scale_colour_manual(name ="etapa", values = c("r" = "red", "b" = "blue"), labels=c("b" = "blue values", "r" = "red values")) +
  scale_fill_manual(name ="etapa", values = c("r" = "red", "b" = "blue"), labels=c("b" = "blue values", "r" = "red values"))

你可以分别使用geom_density()geom_histogram()来替换它。


是的,您说得对。事实上,我正在制作一个直方图和密度图。这是我的问题的完美解决方案,但是我不能在没有合并两个数据集的情况下完成它。虽然我在直方图中将alpha设置为0.3,但我仍然无法清楚地看到两个直方图。非常感谢! - Skullgreymon
你好 @Timo Wagner! 你知道如何将它改成百分比直方图吗? 我尝试将 aes(y = ..count../sum(..count..)) 添加到直方图中作为参数,但没有帮助。 我有两个数据集,行数差异很大,因此在频率图上显示它并不有用。 - AAAA

3

使用 @TimoWagner 的例子:

set.seed(1001)
etapa1 <- data.frame(AverageTemperature = rnorm(100000, 16.9, 2))
etapa2 <- data.frame(AverageTemperature = rnorm(100000, 17.4, 2))

以下是另一种将这两个数据集打包在一起的方式:

combdat <- dplyr::bind_rows(list(dat1=etapa1,dat2=etapa2),
                           .id="dataset")

两个叠加的直方图:

library(ggplot2)
ggplot(combdat,aes(AverageTemperature,fill=dataset))+
   scale_fill_manual(values=c("red","blue"))+
   geom_histogram(alpha=0.5,binwidth=0.1,position="identity")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接