簡體   English   中英

如何在R / ggplot2中以多面的方式繪制兩條分布曲線?

[英]How to plot two distribution curves in a faceted way in R / ggplot2?

我需要比較兩條概率分布曲線,即伽馬曲線和標准正態分布:

library(ggplot2)

pgammaX <- function(x) pgamma(x, shape = 64.57849, scale = 0.08854802)

f <- ggplot(data.frame(x=c(-4, 9)), aes(x)) + stat_function(fun=pgammaX)
f + stat_function(fun = pnorm)

輸出是這樣的

兩條分布曲線

但是,我需要通過ggplot2提供的分面機制將兩條曲線分開,並共享Y軸,如下所示:

多面的

如果所描繪的圖形來自數據(例如,來自data.frame),我知道如何進行刻面處理,但是當圖形是通過函數在線生成時,我不知道在這種情況下該如何做。 您對此有什么想法嗎?

您可以提前生成類似於stat_function所做的數據,例如:

x <- seq(-4,9,0.1)
dat <- data.frame(p = c(pnorm(x), pgammaX(x)), g = rep(c(0,1), each = 131), x = rep(x, 2) )
ggplot(dat)+geom_line(aes(x,p, group = g)) + facet_grid(~g)

執行facet_wrap的問題是,將相同的stat_function設計為應用於沒有多面變量的每個面板。

相反,我會分別繪制它們並使用grid.arrange來組合它們。

f1 <- ggplot(data.frame(x=c(-4, 9)), aes(x)) + stat_function(fun = pgammaX) + ggtitle("Gamma") + theme(plot.title = element_text(hjust = 0.5))
f2 <- ggplot(data.frame(x=c(-4, 9)), aes(x)) + stat_function(fun = pnorm) + ggtitle("Norm") + theme(plot.title = element_text(hjust = 0.5))
library(gridExtra)
grid.arrange(f1, f2, ncol=2)

否則,使用pgammaX和pnorm的y值創建數據框,並將其歸類為構面變量。

終於我得到了答案。 首先,我需要有兩個數據集,並將每個函數附加到每個數據集,如下所示:

library(ggplot2)

pgammaX <- function(x) pgamma(x, shape = 64.57849, scale = 0.08854802)

a <- data.frame(x=c(3,9), category="Gamma")
b <- data.frame(x=c(-4,4), category="Normal")

f <- ggplot(a, aes(x)) + stat_function(fun=pgammaX) + stat_function(data = b, mapping = aes(x), fun = pnorm)

然后,使用facet_wrap(),根據分配給每個數據集的類別將其分成兩個圖形,並建立一個free_x比例尺。

f + facet_wrap("category", scales = "free_x")

結果如下所示:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM