ggplot使用'facet_wrap'时添加正态分布`

ggplot使用'facet_wrap'时添加正态分布`,r,ggplot2,R,Ggplot2,我希望绘制以下直方图: 帕默彭斯图书馆 图书馆管理员 企鹅%>% ggplotaesx=账单长度mm,填充=种类+ geom_直方图+ 小面_~物种 对于每个直方图,我想在每个直方图中添加一个正态分布,其中包含每个物种的平均值和标准偏差 当然,我知道在开始使用ggplot命令之前,我可以计算组特定的平均值和SD,但我想知道是否有更聪明/更快的方法来实现这一点 我试过: 企鹅%>% ggplotaesx=账单长度mm,填充=种类+ geom_直方图+ 刻面_包裹~物种+ stat_function

我希望绘制以下直方图:

帕默彭斯图书馆 图书馆管理员 企鹅%>% ggplotaesx=账单长度mm,填充=种类+ geom_直方图+ 小面_~物种 对于每个直方图,我想在每个直方图中添加一个正态分布,其中包含每个物种的平均值和标准偏差

当然,我知道在开始使用ggplot命令之前,我可以计算组特定的平均值和SD,但我想知道是否有更聪明/更快的方法来实现这一点

我试过:

企鹅%>% ggplotaesx=账单长度mm,填充=种类+ geom_直方图+ 刻面_包裹~物种+ stat_functionfun=dnorm 但这只在底部给了我一条细线:

有什么想法吗? 谢谢

编辑 我想我要重新创建的是Stata的一个简单命令:

历史比尔长度毫米,按物种正常

这就给了我:

我知道这里有一些建议:


但是我特别想找一个不需要我创建单独函数的简短答案。

不久前,我用一个函数自动绘制了这个理论密度图,我把这个函数放在我写的ggh4x包中,你可能会觉得很方便。您只需确保直方图和理论密度处于相同的比例,例如每个x轴单位的计数

帕默彭斯图书馆 图书馆管理员 图书馆GGH4X 企鹅%>% ggplotaesx=账单长度mm,填充=种类+ geom_HistorogrambinWidth=1+ 统计密度=统计后+ 小面_~物种 >警告:已删除包含非有限值的2行stat_bin。 你可以改变直方图的仓位大小,但你也必须调整理论密度计数。通常情况下,您会乘以binwidth

企鹅%>% ggplotaesx=账单长度mm,填充=种类+ geom_HistorogrambinWidth=2+ 统计密度=统计计数*2之后+ 小面_~物种 >警告:已删除包含非有限值的2行stat_bin。 由v0.3.0于2021-01-27创建

如果这太麻烦,您可以始终将直方图转换为密度,而不是将密度转换为计数

penguins %>% 
  ggplot(aes(x=bill_length_mm, fill = species)) +
  geom_histogram(aes(y = after_stat(density))) + 
  stat_theodensity() +
  facet_wrap(~species)

不久前,我用一个函数自动绘制了这个理论密度图,我把这个函数放在了我写的ggh4x包中,你可能会觉得很方便。您只需确保直方图和理论密度处于相同的比例,例如每个x轴单位的计数

帕默彭斯图书馆 图书馆管理员 图书馆GGH4X 企鹅%>% ggplotaesx=账单长度mm,填充=种类+ geom_HistorogrambinWidth=1+ 统计密度=统计后+ 小面_~物种 >警告:已删除包含非有限值的2行stat_bin。 你可以改变直方图的仓位大小,但你也必须调整理论密度计数。通常情况下,您会乘以binwidth

企鹅%>% ggplotaesx=账单长度mm,填充=种类+ geom_HistorogrambinWidth=2+ 统计密度=统计计数*2之后+ 小面_~物种 >警告:已删除包含非有限值的2行stat_bin。 由v0.3.0于2021-01-27创建

如果这太麻烦,您可以始终将直方图转换为密度,而不是将密度转换为计数

penguins %>% 
  ggplot(aes(x=bill_length_mm, fill = species)) +
  geom_histogram(aes(y = after_stat(density))) + 
  stat_theodensity() +
  facet_wrap(~species)
虽然在这种情况下,ggh4x包是一种可行的方法,但更一般化的方法是使用tapply和面板变量,当应用刻面时,面板变量会添加到数据中

penguins %>% 
  ggplot(aes(x=bill_length_mm, fill = species)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30) + 
  facet_wrap(~species) + 
  geom_line(aes(y = dnorm(bill_length_mm,
                          mean = tapply(bill_length_mm, species, mean, na.rm = TRUE)[PANEL],
                          sd = tapply(bill_length_mm, species, sd, na.rm = TRUE)[PANEL])))
虽然在这种情况下,ggh4x包是一种可行的方法,但更一般化的方法是使用tapply和面板变量,当应用刻面时,面板变量会添加到数据中

penguins %>% 
  ggplot(aes(x=bill_length_mm, fill = species)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30) + 
  facet_wrap(~species) + 
  geom_line(aes(y = dnorm(bill_length_mm,
                          mean = tapply(bill_length_mm, species, mean, na.rm = TRUE)[PANEL],
                          sd = tapply(bill_length_mm, species, sd, na.rm = TRUE)[PANEL])))

你需要计算一下。尝试手动计算dnormpenguins$bill_length_mm-你会注意到小得可笑的数字,其幂为-300左右!。我想你得先把这些都扔掉才能理解dnorm的电话。舍入没有帮助,所以我不认为这仅仅是一个浮点问题,我会试试。我已经添加了促使我从Stata尝试此功能的数字。当然,数据会转换成密度,你需要计算这个。尝试手动计算dnormpenguins$bill_length_mm-你会注意到小得可笑的数字,其幂为-300左右!。我想你得先把这些都扔掉才能理解dnorm的电话。舍入没有帮助,所以我不认为这仅仅是一个浮点问题,我会试试。我已经添加了促使我从Stata尝试此功能的数字。当然,数据被转换成了密度。我有点希望你的ggh4x也有这样一个数据:整个软件包的主要动机是“让我感到沮丧的事情应该更容易”:事实上,这太棒了!期待在CRAN上看到这个!你太好了。我可能在某个时候应该这么做!绝对同意,非常有用的软件包我有点期待你的ggh4x有一个统计数据
太:整个计划的主要动力是“让我感到沮丧的事情应该更容易”:事实上,这太棒了!期待在CRAN上看到这个!你太好了。我可能在某个时候应该这么做!绝对同意,非常有用的软件包非常感谢您添加的非常有用的内容。我不知道面板变量,我需要仔细阅读!恐怕这个问题已经结束了,因为它与这个问题有些关联:也许也在那里分享你的解决方案吧!:非常感谢这一非常有用的补充。我不知道面板变量,我需要仔细阅读!恐怕这个问题已经结束了,因为它与这个问题有些关联:也许也在那里分享你的解决方案吧!: