gpt4 book ai didi

r - 在 R 中使用 facet_wrap 规范化 ggplot2 密度

转载 作者:行者123 更新时间:2023-12-01 11:43:22 27 4
gpt4 key购买 nike

我正在使用 geom_density 制作一系列密度图从数据框中,并使用 facet_wrap 按条件显示它,如:

ggplot(iris) + geom_density(aes(x=Sepal.Width, colour=Species, y=..count../sum(..count..))) + facet_wrap(~Species)

当我这样做时,y 轴刻度似乎不代表每个 Species 的百分比。在面板中,而是所有物种的所有总数据点的百分比。

我的问题是:我怎样才能做到 ..count.. geom_density 中的变量指的是每个 Species 中的项目数设置每个面板,使面板为 virginica有一个 y 轴对应于“ virginica 数据点的分数”?

另外,有没有办法让 ggplot2 输出它用于 ..count.. 的值?和 sum(..count..)以便我可以验证它使用的是什么数字?

编辑 : 我误会了 geom_density它看起来像一个人 Species , ..count../sum(..count..)不是百分比:
ggplot(iris[iris$Species == 'virginica',]) + geom_density(aes(x=Sepal.Width, colour=Species, y=..count../sum(..count..))) + facet_wrap(~Species)

所以我修改后的问题:我怎样才能让密度图成为每个 bin 中数据的分数?我是否必须使用 stat_density为此或 geom_histogram ?我只希望 y 轴是数据点的百分比/分数

最佳答案

不幸的是,您要求 ggplot2 做的是为每个方面定义单独的 y,它在语法上无法做到 AFAIK。

因此,为了回应您在评论线程中提到的“从根本上只想要一个直方图”,我建议改为使用 geom_histogram或者,如果您偏爱线条而不是条形,geom_freqpoly :

ggplot(iris, aes(Sepal.Width, ..count..)) + 
geom_histogram(aes(colour=Species, fill=Species), binwidth=.2) +
geom_freqpoly(colour="black", binwidth=.2) +
facet_wrap(~Species)

enter image description here

**注意:在我上面的例子中,geom_freqpoly 代替 geom_histogram 也能很好地工作。为了效率,我只是在一个图中添加了两者。

希望这可以帮助。

编辑:好的,我设法找到了一种快速而肮脏的方式来获得你想要的东西。它需要您安装和加载 plyr .提前道歉;就 RAM 使用而言,这可能不是最有效的方法,但它确实有效。

首先,让我们公开 iris(我使用 RStudio,所以我习惯于在窗口中查看所有对象):
d <- iris

现在,我们可以使用 ddply计算属于每个将成为您的 x 轴的唯一测量值的个体数量(这里我使用了 Sepal.Length 而不是 Sepal.Width,给自己一个更大的范围,只是为了在绘制时看到组之间的更大差异)。
new <- ddply(d, c("Species", "Sepal.Length"), summarize, count=length(Sepal.Length))

请注意 ddply根据引用的变量自动对输出 data.frame 进行排序。

然后我们可以将 data.frame 分成每个独特的条件——在虹膜的情况下,三个物种中的每一个(我相信有一个更顺畅的方法来解决这个问题,如果你正在使用非常大量的数据,不建议继续创建相同 data.frame 的子集,因为您可能会最大化您的 RAM)...
set <- new[which(new$Species%in%"setosa"),]
ver <- new[which(new$Species%in%"versicolor"),]
vgn <- new[which(new$Species%in%"virginica"),]

...并使用 ddply再次计算属于每个测量值的个体比例,但分别针对每个物种。
prop <- rbind(ddply(set, c("Species"), summarize, prop=set$count/sum(set$count)),
ddply(ver, c("Species"), summarize, prop=ver$count/sum(ver$count)),
ddply(vgn, c("Species"), summarize, prop=vgn$count/sum(vgn$count)))

然后我们只需将我们需要的所有内容放入一个数据集中,并从我们的工作区中删除所有垃圾。
new$prop <- prop$prop
rm(list=ls()[which(!ls()%in%c("new", "d"))])

我们可以在 y 上使用特定于面的比例制作我们的图形。请注意,我现在使用的是 geom_lineddply已自动订购您的 data.frame。
ggplot(new, aes(Sepal.Length, prop)) + 
geom_line(aes(colour=new$Species)) +
facet_wrap(~Species)

facet_wrap with facet-specific proportions
# let's check our work. each should equal 50
sum(new$count[which(new$Species%in%"setosa")])
sum(new$count[which(new$Species%in%"versicolor")])
sum(new$count[which(new$Species%in%"versicolor")])

#... and each of these should equal 1
sum(new$prop[which(new$Species%in%"setosa")])
sum(new$prop[which(new$Species%in%"versicolor")])
sum(new$prop[which(new$Species%in%"versicolor")])

关于r - 在 R 中使用 facet_wrap 规范化 ggplot2 密度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17517119/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com