[英]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.