distance1 grey1 distance2 grey2
1 0.0000000 -300.364 0.0000000 -135.219
2 0.2174741 -296.963 0.2114969 -132.601
3 0.4349482 -292.887 0.4229937 -131.959
4 0.6520882 -290.310 0.6341657 -133.514
5 0.8695623 -285.777 0.8456625 -127.111
6 1.0870364 -279.921 1.0571594 -116.404
7 1.3045105 -274.418 1.2686562 -116.850
8 1.5216505 -272.005 1.4798282 -115.464
9 1.7391246 -273.666 1.6913251 -102.823
10 1.9565987 -270.381 1.9028219 -101.497
11 2.1740728 -270.273 2.1143188 -98.245
12 2.3912128 -270.705 2.3254907 -98.474
我的 x 軸是我標準化 0-100 的距離。我的 Y 軸是整個距離的強度值。我有 2 個樣本,每個 Y 值都與特定的 X 值匹配(注意樣本 2 的行數比樣本 1 的多)。我已經粘貼了我的資料的前幾行作為示例。如何在同一個圖上繪制兩個樣本的圖?之后如何創建 2 個樣本的平均圖?
uj5u.com熱心網友回復:
目前還不清楚你要做什么,所以我將提供幾個演示。在前面,我假設您在這里有兩個不同的資料集,第一個在第 1-2 列中,第二個在第 3-4 列中。這可以通過以下方式完成ggplot2
:
library(ggplot2)
ggplot(dat)
geom_line(aes(distance, grey1), color="red")
geom_line(aes(distance1, grey2), color="blue")
但是這種方法有點強制它,并且會使圖例、顏色控制等事情變得相當痛苦。我建議這個程序將受益于將資料重塑為長格式,只有 x 和 y 變數加一個來指示該行來自哪個組。例如,
library(data.table)
newdat <- data.table::melt(as.data.table(dat),
measure = patterns("^distance","^grey"),
value.name = c("distance", "grey"))
newdat
# variable distance grey
# <fctr> <num> <num>
# 1: 1 0.0000000 -300.364
# 2: 1 0.2174741 -296.963
# 3: 1 0.4349482 -292.887
# 4: 1 0.6520882 -290.310
# 5: 1 0.8695623 -285.777
# 6: 1 1.0870364 -279.921
# 7: 1 1.3045105 -274.418
# 8: 1 1.5216505 -272.005
# 9: 1 1.7391246 -273.666
# 10: 1 1.9565987 -270.381
# ---
# 15: 2 0.4229937 -131.959
# 16: 2 0.6341657 -133.514
# 17: 2 0.8456625 -127.111
# 18: 2 1.0571594 -116.404
# 19: 2 1.2686562 -116.850
# 20: 2 1.4798282 -115.464
# 21: 2 1.6913251 -102.823
# 22: 2 1.9028219 -101.497
# 23: 2 2.1143188 -98.245
# 24: 2 2.3254907 -98.474
新variable
列指示資料來自哪個列組。
在這里,ggplot 中的繪圖變得更加簡單:
ggplot(newdat, aes(distance, grey))
geom_line(aes(color = variable, group = variable))
請注意,我們現在有一個圖例,它自己處理顏色。這些可以被覆寫,但這是一個不同的主題(并在 SO 上的許多問題中得到解決)。
至于“兩個樣本的平均圖”,這將需要更多的資料背景關系,并且目前還不夠充分。我最大的擔心是每組資料都distance
沒有完全對齊。grey
也就是說,如果兩者distance
的值都恰好1.000
是,那么我認為我們可以安全地平均grey
這兩個觀察值的值。但是,通常情況并非如此(在此示例資料集中的任何地方都不是)。
如果您真的想找到一種平均形式,我建議您將兩條線插入到已知域中distance
并顯示平均值。我將演示我的意思。
首先,我將添加點,以便我們可以看到 x 方向的錯位:
ggplot(newdat, aes(distance, grey, color = variable))
geom_line()
geom_point()
現在,讓我們聚合“平均值”(來自插值distance
并將它們添加到原始長格式資料中。
newdist <- seq(0, min(max(dat$distance), max(dat$distance1)), by = 0.1)
newdat2 <- newdat[, setNames(approx(distance, grey, xout = newdist), c("distance", "grey")), by = variable
][, .(variable = "Avg", grey = mean(grey)), by = distance]
newdat2 <- rbindlist(list(newdat, newdat2), use.names = TRUE)
現在,我們可以使用相同的繪圖命令并獲得第三行:
ggplot(newdat2, aes(distance, grey, color = variable))
geom_line()
geom_point()
這種方法正在對資料進行一些推斷,這是我們在問題中沒有太多的東西。我認為這是一個安全的步驟,但在對您的資料盲目使用此技術之前,請確保它在統計上有意義。
資料(我在重命名列之前開始撰寫此代碼,因此可能需要調整后續代碼)。
dat <- structure(list(distance = c(0, 0.2174741, 0.4349482, 0.6520882, 0.8695623, 1.0870364, 1.3045105, 1.5216505, 1.7391246, 1.9565987, 2.1740728, 2.3912128), grey1 = c(-300.364, -296.963, -292.887, -290.31, -285.777, -279.921, -274.418, -272.005, -273.666, -270.381, -270.273, -270.705), distance1 = c(0, 0.2114969, 0.4229937, 0.6341657, 0.8456625, 1.0571594, 1.2686562, 1.4798282, 1.6913251, 1.9028219, 2.1143188, 2.3254907), grey2 = c(-135.219, -132.601, -131.959, -133.514, -127.111, -116.404, -116.85, -115.464, -102.823, -101.497, -98.245, -98.474)), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/485868.html