ggplot:使用一个公共 y 轴由多个变量(而不是变量内的多个类别)分隔的多面板/面散点图

jay*_*igg 1 r panel facet ggplot2 yaxis

我的数据框Loopsubset_created包含 45 个变量的 30 个观察值。(您将在下面找到str(loopsubset_created)一个dput(loopsubset_created)示例)。

现在我想创建 -Variable 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"))
Run Code Online (Sandbox Code Playgroud)

我得出了这个基本结果

在此输入图像描述

这里是基本问题:
现在,我想根据上面描述的方式将 5 层分别排列成一行,有人给我一个想法吗?

加上有关问题的一些信息:
虽然以下方面不是我的问题的直接部分,但我想描述我对情节的最终想法(以避免您的建议可能与进一步的要求发生冲突):

每个面板应包括

  • Spearman corr 值和相应的 p 值(如上所示)和
  • 另外 Pearson 校正值和相应的 p 值
  • 线性回归与conf。区间(如上所示)或其他类型的回归线(未显示)
  • 点应由变量着色(BLUE=bLue,RED=红色;GREEN=绿色,SWIR1+2 由一些其他颜色,例如洋红色和紫色)
  • 稍后,点和回归线应PdKeyT使用可变基本颜色(蓝色、绿色等)的不同亮度值按范围(例如,低于 -10、-10 至 30 和高于 30)进行细分,类似于:
    在此输入图像描述
  • 所有面板均应在左侧使用一个公共 y 轴,如下所述
  • 我想通过相应变量的范围来调整 x 轴(例如,蓝色、绿色和红色的范围从 500 到 3000,SWIR 的范围从 0 到 1500)

编辑 2021 年 10 月 31 日参考您的答案:

  1. 您是否可以进一步使用各自的方法来单独限制 x 轴,如我的问题的“进一步要求”中所述(BGR 范围从 500 到 3000,SWIR 从 0 到 1500)使用coord_cartesian(xlim = c(min,max))
    我这么问是因为我读了一些有关根据“刻面方法”限制轴问题的讨论。但我想控制 x 轴,因为我会将许多这样的图堆叠在一起(我的样本仅镜像 300 个采样点中的一个采样点的数据)。如果让它们保持一致我会很高兴。
  2. 同时,我更喜欢仅通过灰度颜色(对于所有波段相同)来离散点和调整线,而不是通过离散地对面板进行着色theme(panel.background = element_rect(fill = "#xxxxxx")。您认为这有问题吗?

最后是我的一些信息和数据样本

    > 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 ...
Run Code Online (Sandbox Code Playgroud)

loopsubset_created <- 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")
Run Code Online (Sandbox Code Playgroud)

Tar*_*Jae 5

更新: 为了完成你的最后一个任务,我可以使用来自艾伦·卡梅伦的代码:添加另一列来设置剪切mutate(range = cut(PdKeyT, c(-Inf, -10, 30, Inf), c("Low", "Mid", "High"))) %>%(此代码由艾伦·卡梅伦提供)

library(tidyverse)
library(ggpubr)

df_long_list <- loopsubset_created %>%
  select(PdKeyT, BLUE, GREEN, RED, SWIR1, SWIR2) %>% 
  pivot_longer(
    cols = -PdKeyT
  ) %>% 
  mutate(color = case_when(name=="BLUE" ~ "blue",
                           name=="GREEN" ~ "green",
                           name=="RED" ~ "red",
                           name=="SWIR1" ~ "magenta",
                           name=="SWIR2" ~ "violet"))%>% 
  mutate(range = cut(PdKeyT, c(-Inf, -10, 30, Inf), c("Low", "Mid", "High"))) %>%
  group_split(name)
  
  p <- ggplot()
  for (i in 1:5) p <- 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您可以这样做:

  1. 选择所有相关列
  2. 引入长格式
  3. 将颜色列添加到数据框
  4. 制作数据框列表group_split
  5. 使用 for 循环迭代列表中的 5 个数据帧中的每一个
  6. 在循环中添加包stat_cor中的 pearson 和 Spearmanggpubr
  7. 刻面并进行一些格式化
library(tidyverse)
library(ggpubr)

df_long_list <- loopsubset_created %>%
  select(PdKeyT, BLUE, GREEN, RED, SWIR1, SWIR2) %>% 
  pivot_longer(
    cols = -PdKeyT
  ) %>% 
  mutate(color = case_when(name=="BLUE" ~ "blue",
                           name=="GREEN" ~ "green",
                           name=="RED" ~ "red",
                           name=="SWIR1" ~ "magenta",
                           name=="SWIR2" ~ "violet"))%>% 
  group_split(name)
  
  p <- ggplot()
  for (i in 1:5) p <- 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述