#r #ggplot2 #panel #facet #yaxis
Вопрос:
Мой фрейм данных loopsubset_created содержит 30 наблюдений за 45 переменными. (Ниже вы найдете str(loopsubset_created)
и dput(loopsubset_created)
образец).
Теперь я хотел бы создать точечные диаграммы PdKeyT
переменной- (y) по сравнению с пятью переменными-значениями полосы ( BLUE
, GREEN
, RED
, SWIR1
, SWIR2
) (x) с помощью
- каждая переменная на ОДНОЙ панели
- все панели выровнены в ОДИН ряд
- используя
PdKeyT
переменную в качестве общей оси y.
В конце концов, это должно выглядеть примерно так:
(Я сделал это с помощью ggscatter, но по соображениям гибкости я бы предпочел в основном использовать ggplot)
Вот теперь моя проблема:
при попытке использовать ggplot я не нахожу правильного способа для приведенного выше расположения, так как не могу найти правильный код для разделения/группировки по переменным. Я нашел сотни руководств по фасетированию по нескольким категориальным значениям в переменной, но не по нескольким переменным.
Со следующим кодом
ggplot(loopsubset_created, aes(y = PdKeyT)) geom_point(aes(x = BLUE, col = "BLUE")) geom_point(aes(x = GREEN, col = "GREEN")) geom_point(aes(x = RED, col = "RED")) geom_point(aes(x = SWIR1, col = "SWIR1")) geom_point(aes(x = SWIR2, col = "SWIR2"))
Я пришел к этому основному результату
Здесь основной вопрос:
Теперь я хотел бы расположить 5 слоев отдельно в один ряд в соответствии с описанным выше способом. У кого-нибудь есть идея для меня?
Плюс некоторая информация по этому вопросу:
Хотя следующие аспекты не являются прямой частью моего вопроса, я хотел бы описать свою окончательную идею сюжета (чтобы избежать того, что ваши советы могут противоречить дальнейшим требованиям).:
Каждая панель должна включать
- Spearman corr value and according p-value (as shown above) and
- additionaly Pearson corr value and according p-value
- Linear regression with conf. interval (as shown above) or other type of regression line (not shown)
- Points should be couloured by variable (BLUE=bLue, RED= red; GREEN=green, SWIR1 2 by some other coulours, e.g. magenta and violet)
- later on points and regressionlines should be subdived by ranges of
PdKeyT
(e.g. below -10, -10-to 30, and above 30) with using differnt brightness values of variable basic colours (blue, green, …), analogouos to this:
- All panels should use ONE common y-axis at the left as explained
- And I would like to adpat the x-axes by the range of the respecitve variable (e.g. range for BLUE, GREEN and RED from 500 to 3000 and the SWIRs from 0 to 1500
edit 31.10.2021 referring to your answers:
- Would it furtheron be possible with your respective approaches to limit the x-axes individually as depicted in the ‘further requirements’ of my question (B-G-R ranging from 500 to 3000, SWIRs from 0 to 1500) with using
coord_cartesian(xlim = c(min,max))
?
I am asking because I read some discussions with issues on limiting axes depending on the ‘faceting approach’. But I’d like to control the x-axes, because I’ll have many of these plots stacked on top of each other (My sample mirrored the data of just one sampling point out of 300). And i would be glad if getting them aligned. - I’d meanwhile prefer to discrete points and reglines just by gray scale colors (for all bands the same) and rather discretely coloring the panels by
theme(panel.background = element_rect(fill = "#xxxxxx")
. Do you see an issue with that?
Finally some information and sample of my data
gt; str(loopsubset_created) 'data.frame': 30 obs. of 45 variables: $ Site_ID : chr "A" "A" "A" "A" ... $ Spot_Nr : chr "1" "1" "1" "1" ... $ Transkt_Nr : chr "2" "2" "2" "2" ... $ Point_Nr : chr "4" "4" "4" "4" ... $ n : int 30 30 30 30 30 30 30 30 30 30 ... $ rank : int 3 3 3 3 3 3 3 3 3 3 ... $ Tile : chr "1008" "1008" "1008" "1008" ... $ Date : int 20190208 20190213 20190215 20190218 20190223 20190228 20190302 20190305 20190315 20190320 ... $ id : chr "22" "22" "22" "22" ... $ Point_ID : chr "1022" "1022" "1022" "1022" ... $ Site_Nr : chr "1" "1" "1" "1" ... $ Point_x : num 356251 356251 356251 356251 356251 ... $ Point_y : num 5132881 5132881 5132881 5132881 5132881 ... $ Classification : num 7 7 7 7 7 7 7 7 7 7 ... $ Class_Derived : chr "WW" "WW" "WW" "WW" ... $ BLUE : num 1112 1095 944 1144 1141 ... $ GREEN : num 1158 1178 1009 1288 1265 ... $ RED : num 599 708 613 788 835 ... $ REDEDGE1 : num 359 520 433 576 665 761 618 598 881 619 ... $ REDEDGE2 : num 83 82 65 169 247 404 116 118 532 162 ... $ REDEDGE3 : num 73 116 81 142 233 391 56 171 538 131 ... $ BROADNIR : num 44 93 60 123 262 349 74 113 560 125 ... $ NIR : num 37 70 66 135 215 313 110 135 504 78 ... $ SWIR1 : num 187 282 184 225 356 251 240 216 507 197 ... $ SWIR2 : num 142 187 155 197 281 209 192 146 341 143 ... $ Quality.assurance.information: num 26664 10272 10272 10272 8224 ... $ Q00_VAL : num 0 0 0 0 0 0 0 0 0 0 ... $ Q01_CS1 : num 0 0 0 0 0 0 0 0 0 0 ... $ Q02_CSS : num 0 0 0 0 0 0 0 0 0 0 ... $ Q03_CSH : num 1 0 0 0 0 0 0 0 1 0 ... $ Q04_SNO : num 0 0 0 0 0 0 0 0 0 0 ... $ Q05_WAT : num 1 1 1 1 1 1 1 1 1 1 ... $ Q06_AR1 : num 0 0 0 0 0 0 0 0 0 0 ... $ Q07_AR2 : num 0 0 0 0 0 0 0 0 0 0 ... $ Q08_SBZ : num 0 0 0 0 0 0 0 0 0 0 ... $ Q09_SAT : num 0 0 0 0 0 0 0 0 0 0 ... $ Q10_ZEN : num 0 0 0 0 0 0 0 0 0 0 ... $ Q11_IL1 : num 1 1 1 1 0 0 0 0 0 0 ... $ Q12_IL2 : num 0 0 0 0 0 0 0 0 0 0 ... $ Q13_SLO : num 1 1 1 1 1 1 1 1 1 1 ... $ Q14_VAP : num 1 0 0 0 0 0 0 0 1 0 ... $ Q15_WDC : num 0 0 0 0 0 0 0 0 0 0 ... $ PdMax : int -7 -19 -20 -22 -24 -25 -26 -25 -21 -15 ... $ PdMin : int -13 -23 -24 -26 -28 -29 -29 -28 -24 -20 ... $ PdKeyT : int -10 -20 -22 -22 -27 -26 -26 -27 -22 -17 ...
loopsubset_created lt;- structure(list(Site_ID = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"), Spot_Nr = c("1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"), Transkt_Nr = c("2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"), Point_Nr = c("4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4"), n = c(30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L), rank = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), Tile = c("1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008", "1008"), Date = c(20190208L, 20190213L, 20190215L, 20190218L, 20190223L, 20190228L, 20190302L, 20190305L, 20190315L, 20190320L, 20190322L, 20190325L, 20190330L, 20190401L, 20190416L, 20190419L, 20190421L, 20190501L, 20190506L, 20190524L, 20190531L, 20190603L, 20190620L, 20190625L, 20190630L, 20190705L, 20190710L, 20190809L, 20190814L, 20190903L), id = c("22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22", "22"), Point_ID = c("1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022", "1022"), Site_Nr = c("1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"), Point_x = c(356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781, 356250.781), Point_y = c(5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701, 5132880.701), Classification = c(7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7), Class_Derived = c("WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW", "WW"), BLUE = c(1112, 1095, 944, 1144, 1141, 1010, 968, 1023, 1281, 1124, 1215, 1154, 1188, 1177, 1622, 1305, 1215, 2282, 2322, 2337, 2680, 2473, 1143, 1187, 1165, 1040, 1290, 1112, 1474, 1131), GREEN = c(1158, 1178, 1009, 1288, 1265, 1208, 1122, 1146, 1416, 1298, 1379, 1345, 1379, 1366, 1714, 1446, 1354, 2417, 2417, 2500, 2967, 2587, 1469, 1522, 1544, 1253, 1514, 1371, 1875, 1416), RED = c(599, 708, 613, 788, 835, 852, 726, 729, 1044, 816, 905, 908, 948, 970, 1206, 944, 935, 1648, 1741, 2004, 2109, 2032, 1241, 1290, 1419, 1206, 1424, 1339, 1969, 1321 ), REDEDGE1 = c(359, 520, 433, 576, 665, 761, 618, 598, 881, 619, 722, 771, 829, 823, 937, 725, 759, 1327, 1395, 1756, 1718, 1753, 1533, 1528, 1683, 1335, 1605, 1499, 2016, 1592), REDEDGE2 = c(83, 82, 65, 169, 247, 404, 116, 118, 532, 162, 183, 218, 285, 200, 514, 182, 230, 568, 531, 1170, 780, 1101, 1192, 1174, 1250, 949, 1121, 1127, 1382, 1159), REDEDGE3 = c(73, 116, 81, 142, 233, 391, 56, 171, 538, 131, 205, 137, 321, 253, 503, 193, 214, 564, 527, 1192, 698, 1177, 1203, 1259, 1341, 1049, 1146, 1216, 1416, 1188), BROADNIR = c(44, 93, 60, 123, 262, 349, 74, 113, 560, 125, 121, 211, 325, 221, 480, 184, 178, 461, 435, 1067, 570, 1023, 961, 966, 964, 844, 764, 993, 1197, 834), NIR = c(37, 70, 66, 135, 215, 313, 110, 135, 504, 78, 115, 216, 197, 163, 462, 113, 165, 392, 349, 1006, 574, 1092, 1153, 1143, 1128, 961, 1033, 1027, 1164, 1086), SWIR1 = c(187, 282, 184, 225, 356, 251, 240, 216, 507, 197, 306, 260, 298, 290, 400, 190, 300, 275, 204, 678, 528, 1087, 1091, 1049, 1310, 935, 1199, 1169, 984, 1139), SWIR2 = c(142, 187, 155, 197, 281, 209, 192, 146, 341, 143, 271, 220, 246, 232, 387, 168, 217, 193, 173, 540, 374, 764, 766, 799, 869, 724, 827, 794, 745, 848), Quality.assurance.information = c(26664, 10272, 10272, 10272, 8224, 8224, 8224, 8224, 24616, 8224, 8224, 8224, 32, 8224, 8288, 24616, 8224, 8240, 48, 8208, 8240, 8192, 8192, 24648, 8192, 8192, 8192, 8192, 0, 8224), Q00_VAL = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q01_CS1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q02_CSS = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q03_CSH = c(1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0), Q04_SNO = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q05_WAT = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1), Q06_AR1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0), Q07_AR2 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q08_SBZ = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q09_SAT = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q10_ZEN = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q11_IL1 = c(1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q12_IL2 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Q13_SLO = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1), Q14_VAP = c(1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0), Q15_WDC = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), PdMax = c(-7L, -19L, -20L, -22L, -24L, -25L, -26L, -25L, -21L, -15L, -19L, -17L, -23L, -22L, -4L, -7L, -8L, 55L, 57L, 47L, 67L, 44L, 21L, 18L, 13L, 16L, 16L, 9L, 12L, 11L), PdMin = c(-13L, -23L, -24L, -26L, -28L, -29L, -29L, -28L, -24L, -20L, -22L, -22L, -26L, -26L, -7L, -11L, -11L, 46L, 47L, 36L, 52L, 37L, 17L, 14L, 9L, 11L, 9L, 5L, 5L, 2L), PdKeyT = c(-10L, -20L, -22L, -22L, -27L, -26L, -26L, -27L, -22L, -17L, -19L, -19L, -23L, -23L, -5L, -9L, -9L, 54L, 53L, 40L, 60L, 43L, 20L, 15L, 13L, 15L, 13L, 7L, 9L, 6L)), row.names = 198:227, class = "data.frame")
Ответ №1:
Обновление: Для выполнения вашей последней задачи я мог бы использовать код, полученный от Аллана Камерона: добавление еще одного столбца для установки сокращений mutate(range = cut(PdKeyT, c(-Inf, -10, 30, Inf), c("Low", "Mid", "High"))) %gt;%
(этот код был предоставлен Алланом Камероном)
library(tidyverse) library(ggpubr) df_long_list lt;- loopsubset_created %gt;% select(PdKeyT, BLUE, GREEN, RED, SWIR1, SWIR2) %gt;% pivot_longer( cols = -PdKeyT ) %gt;% mutate(color = case_when(name=="BLUE" ~ "blue", name=="GREEN" ~ "green", name=="RED" ~ "red", name=="SWIR1" ~ "magenta", name=="SWIR2" ~ "violet"))%gt;% mutate(range = cut(PdKeyT, c(-Inf, -10, 30, Inf), c("Low", "Mid", "High"))) %gt;% group_split(name) p lt;- ggplot() for (i in 1:5) p lt;- p geom_point(data=df_long_list[[i]], aes(value, PdKeyT, color=color, alpha=range)) geom_smooth(data=df_long_list[[i]], aes(value, PdKeyT, group=range), method = lm, se=TRUE) theme(legend.position="none") stat_cor(data=df_long_list[[i]], aes(value, PdKeyT, label=paste("Spearman",..r.label.., ..p.label.., sep = "~`,`~")), method="spearman", # label.x.npc="left", label.y.npc="top", hjust=0) label.x = 3, label.y = 70) stat_cor(data=df_long_list[[i]], aes(value, PdKeyT, label=paste("Pearson",..r.label.., ..p.label.., sep = "~`,`~")), method="pearson", # label.x.npc="left", label.y.npc="top", hjust=0) label.x = 3, label.y = 65) facet_grid(.~name, scales = "free") theme_bw() theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), plot.margin = margin(120, 10, 120, 10), panel.border = element_rect(fill = NA, color = "black")) p
Вот как вы могли бы это сделать:
- выберите все соответствующие столбцы
- принесите в длинном формате
- добавьте столбец цвета в фрейм данных
- составьте список кадров данных с
group_split
- используйте цикл for для перебора каждого из 5 кадров данных в списке
- в цикле добавьте
stat_cor
для Пирсона и спирмена изggpubr
пакета - фасет и выполните некоторое форматирование
library(tidyverse) library(ggpubr) df_long_list lt;- loopsubset_created %gt;% select(PdKeyT, BLUE, GREEN, RED, SWIR1, SWIR2) %gt;% pivot_longer( cols = -PdKeyT ) %gt;% mutate(color = case_when(name=="BLUE" ~ "blue", name=="GREEN" ~ "green", name=="RED" ~ "red", name=="SWIR1" ~ "magenta", name=="SWIR2" ~ "violet"))%gt;% group_split(name) p lt;- ggplot() for (i in 1:5) p lt;- p geom_point(data=df_long_list[[i]], aes(value, PdKeyT, color=color)) geom_smooth(data=df_long_list[[i]], aes(value, PdKeyT), method = lm, se=TRUE) theme(legend.position="none") stat_cor(data=df_long_list[[i]], aes(value, PdKeyT, label=paste("Spearman",..r.label.., ..p.label.., sep = "~`,`~")), method="spearman", # label.x.npc="left", label.y.npc="top", hjust=0) label.x = 3, label.y = 70) stat_cor(data=df_long_list[[i]], aes(value, PdKeyT, label=paste("Pearson",..r.label.., ..p.label.., sep = "~`,`~")), method="pearson", # label.x.npc="left", label.y.npc="top", hjust=0) label.x = 3, label.y = 65) facet_grid(.~name, scales = "free_y") theme_bw() theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), plot.margin = margin(120, 10, 120, 10), panel.border = element_rect(fill = NA, color = "black")) p
Комментарии:
1. Приятно — просто хочу подчеркнуть использование функции
stat_cor
изggpubr
библиотеки для операции.2. _ @TarJae Что я должен сказать? Еще раз спасибо остальным: Как указано в других комментариях: После более подробного отражения моей задачи у меня возникли два дополнительных вопроса по вашему решению: см. Редактирование вопроса.
Ответ №2:
Для панельных участков используйте facet_wrap
или facet_grid
. Кроме того, как правило, ggplot2 работает лучше, когда ваши данные находятся в длинном формате. Это позволяет вам назначить переменную для эстетики, а не делать это вручную, как у вас есть.
library(ggplot2) library(tidyr) library(purrr) library(dplyr) library(tibble) # lengthen your data so variable names are in a column df lt;- loopsubset_created %gt;% pivot_longer(cols = c(BLUE:RED, starts_with("SWIR"))) # get correlation coef and pvalue r lt;- map(split(df, ~ name), ~ with(.x, c(cor(PdKeyT, value, method = "spearman"), cor.test(PdKeyT, value, method = "spearman")$p.value))) %gt;% bind_rows() %gt;% rownames_to_column("i") %gt;% # first row is coef, second row is p value pivot_longer(-i) %gt;% mutate(lab = ifelse(i == 1, # formatted so will be parsed by geom_text sprintf("italic(R) == %0.5f", value), sprintf("italic(p) == %0.5f", value)), x = -Inf, # left of panel y = Inf, # top of panel, vjust = ifelse(i == 1, 0.75, 2)) # put p-value below df %gt;% ggplot(aes(x = value, y = PdKeyT, color = name)) geom_point() geom_text(data = r, aes(x = x, y = y, label = lab, vjust = vjust), size = 3, parse = T, inherit.aes = F) geom_smooth(method = "lm", se = T, formula = y ~ x, show.legend = F) facet_grid(~ name, scales = "free_x") labs(color = element_blank(), x = "XLAB")
Комментарии:
1. Это вариант, при котором вы не сглаживаете группы внутри панели. Я согласен с Алланом Камероном в том, что попытка установить корреляцию и значение p в каждой из трех отдельных групп на панель приведет к путанице. Если вы пытаетесь сгладить каждую панель один раз, то это был бы один из способов сделать это.
2. Это тоже очень хорошее решение!
3. _ @LMc То же самое и вам, я потрясен, вы сумасшедшие, ребята! Спасибо! Как я уже сказал Аллану: После более подробного рассмотрения моей задачи у меня возникли два дополнительных вопроса по вашему решению: см. Редактирование вопроса.
Ответ №3:
Я думаю, что это соответствует большинству ваших требований, кроме аннотаций корреляции. Если, как вы упомянули в своем вопросе, вы хотите иметь 3 регрессии на панель (по одной для каждого из трех диапазонов PdkeyT
), вам также понадобятся 3 коэффициента корреляции и значения p на панель, что будет беспорядочно.
Причина, по которой вы не видели учебных пособий по использованию разных аспектов для каждой переменной, заключается в том, что это не то, что такое аспекты. Фасеты-это способ отображения данных, которые имеют одинаковые оси x и y, но отличаются какой-либо другой категориальной переменной. Они не предназначены для построения различных переменных x против одной и той же переменной y. То, что вы описываете,-это 5 отдельных участков бок о бок, а не грани.
Сказав это, все еще можно создать сюжет, который вы ищете, с творческим использованием граней. Сначала вам нужно преобразовать данные в длинный формат , чтобы значения разных столбцов оси x были сложены в один столбец value
, называемый, и name
был создан новый столбец, который будет помечать каждое значение в соответствии с тем, из какого столбца оно первоначально было получено.
Затем мы можем использовать новый value
столбец в качестве переменной по оси x и огранить его в соответствии с этим name
столбцом.
Чтобы это выглядело более аутентично, мы вносим некоторые theme
коррективы, чтобы полоски фасеток напоминали метки осей:
library(dplyr) library(tidyr) library(ggplot2) loopsubset_created %gt;% select(PdKeyT, BLUE, GREEN, RED, SWIR1, SWIR2) %gt;% pivot_longer(-1) %gt;% mutate(range = cut(PdKeyT, c(-Inf, -10, 30, Inf), c("Low", "Mid", "High"))) %gt;% ggplot(aes(value, PdKeyT, color = name)) geom_point(aes(alpha = range)) geom_smooth(aes(group = range), size = 0.1, method = "lm", formula = y ~ x, color = "black") labs(x = "") facet_grid(.~name, switch = "x", scales = "free_x") scale_color_manual(values = c("blue", "green", "red", "magenta", "violet")) theme_bw() theme(strip.placement = "outside", strip.background = element_blank(), plot.margin = margin(120, 10, 120, 10), legend.position = "none")
Комментарии:
1. Я обновил свою версию с помощью вашей части кода
mutate(range = cut(PdKeyT, c(-Inf, -10, 30, Inf), c("Low", "Mid", "High")))
, Большое спасибо! Я надеюсь, что все в порядке.2. _ @Аллан Вау, гораздо больше, чем я ожидал, большое спасибо. Я уверен, что это будет очень полезно для меня. Завтра я поближе ознакомлюсь с вашим постом. В любом случае, после более подробного рассмотрения моей задачи у меня возникли два дополнительных вопроса по вашему решению: см. Редактирование вопроса.