ggplot: Многопанельные/фасетные точечные диаграммы, разделенные несколькими переменными (А НЕ несколькими категориями внутри переменной) с использованием одной общей оси y

#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:
    enter image description here
  • 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:

  1. 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.
  2. 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  

введите описание изображения здесь

Вот как вы могли бы это сделать:

  1. выберите все соответствующие столбцы
  2. принесите в длинном формате
  3. добавьте столбец цвета в фрейм данных
  4. составьте список кадров данных с group_split
  5. используйте цикл for для перебора каждого из 5 кадров данных в списке
  6. в цикле добавьте stat_cor для Пирсона и спирмена из ggpubr пакета
  7. фасет и выполните некоторое форматирование
 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. _ @Аллан Вау, гораздо больше, чем я ожидал, большое спасибо. Я уверен, что это будет очень полезно для меня. Завтра я поближе ознакомлюсь с вашим постом. В любом случае, после более подробного рассмотрения моей задачи у меня возникли два дополнительных вопроса по вашему решению: см. Редактирование вопроса.