ggplot2: 叠加密度图 R

39
我希望在R中叠加几个密度图,知道有几种方法可以做到这一点,但由于某些原因它们对我不起作用('sm'库无法安装,而我是一个新手,不理解大部分代码)。我也尝试了plot和par,但我想使用qplot,因为它具有更多的配置选项。
我有以这种形式保存的数据:
library(ggplot2)
x <- read.csv("clipboard", sep="\t", header=FALSE)
x
     V1     V2    V3
1    34     23    24
2    32     12    32

我希望创建3个叠加的图表,使用灰色或点线填充值来表示V1,V2和V3的值,并配有图例。你们能帮忙吗?

谢谢!

3个回答

68

通常对于使用ggplot和多个变量,需要将数据从宽格式转换为长格式。我认为也可以不这样做,但这是该软件包的预期用法。

以下是解决方案,我生成了一些数据(3个正态分布,每个分布以不同的点为中心)。如果需要直方图和箱线图,我也已经制作好了。alpha参数控制填充的透明度程度,如果使用颜色而不是填充,则只会得到轮廓。

x <- data.frame(v1=rnorm(100),v2=rnorm(100,1,1),v3=rnorm(100,0,2))
library(ggplot2);library(reshape2)
data<- melt(x)
ggplot(data,aes(x=value, fill=variable)) + geom_density(alpha=0.25)
ggplot(data,aes(x=value, fill=variable)) + geom_histogram(alpha=0.25)
ggplot(data,aes(x=variable, y=value, fill=variable)) + geom_boxplot()

在这里输入图片描述


这个答案应该出现在 ggplot 书的下一版中。 - Pete
如果这三个变量长度不同且在不同的文件中,你还能做到吗?当尝试合并成一个数据框时,R会报错。 - cryptic0
如何在直方图中使用频率而不是计数? - Julien

11

为了完整起见,基于因子叠加绘图的最基本方法是:

ggplot(data, aes(x=value)) + geom_density(aes(group=factor))

但正如@user1617979所提到的,aes(color=factor)aes(fill=factor)在实践中可能更有用。三个密度图叠加,按因子区分


这对于跨时间序列的数据更有用。如果您想根据组添加颜色和图例,请确保分组变量是一个“因子”。 - Bob

2

有些人问是否可以在分布长度不同的情况下执行此操作。答案是肯定的,只需使用列表而不是数据框即可。

最初的回答:

Yes, just use a list instead of a data frame.

library(ggplot2)
library(reshape2)
x <- list(v1=rnorm(100),v2=rnorm(50,1,1),v3=rnorm(75,0,2))
data<- melt(x)
ggplot(data,aes(x=value, fill=L1)) + geom_density(alpha=0.25)
ggplot(data,aes(x=value, fill=L1)) + geom_histogram(alpha=0.25)
ggplot(data,aes(x=L1, y=value, fill=L1)) + geom_boxplot()

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