Cowplot 包:在 R 中使用 plot_grid() 对齐图 space 左上角的文本标签

Cowplot Package: Aligning text labels in the top lefthand corner of plot space using plot_grid() in R

概览:

我使用下面的 R-code 制作了一系列地图(见下文),我使用了 plot_grid()在 Cowplot 包 中使用下面的两个数据框 "QuercusRobur 1""QuercusRobur2".[=57 来排列绘图=]

问题:

情节看起来真不错;但是,文本标签没有很好地对齐。一些标签覆盖在 y-axis 的顶部,名为 Latitude,其中两个文本标签名为“A:城市化指数”和“ B: Urbanization Index”并没有位于他们的地块上方,它们还覆盖了名为 "Observation Period 1" 和 "Observation Period 2" 的主标题。

有谁知道如何整齐地对齐地块标签,使它们位于每个地块的左上角,同时防止它们覆盖 y-axis 或部分地图(请参阅下面的所需输出) ?

如果有人能提供帮助,我将不胜感激

R-Code

##Import Packages
    library(ggplot2)
    library(maps)
    library(mapdata)
    library(tidyverse)

 ##Get a map of the UK from maps:
        UK <- map_data(map = "world", region = "UK")
        head(UK)
        dim(UK)

        ##Produce point data

        MapUK<-ggplot(data = UK, aes(x = long, y = lat, group = group)) + 
                   geom_polygon() +
                   coord_map()

        ##head
        head(QuercusRobur1)
        head(QuercusRobur2)

        ##Remove weird data points
        QuercusRobur1<-QuercusRobur1%>%filter(Longitude<=3)

        ##Observation 1

        p1 <- ggplot(QuercusRobur1,
                    aes(x = Longitude, y = Latitude)) +
          geom_polygon(data = UK,
                       aes(x = long, y = lat, group = group), 
                       inherit.aes = FALSE) +
          geom_point() +
          coord_map(xlim = c(-10, 5)) + #limits added as there are some points really far away
          theme_classic()

   Urban1<-p1 + 
          aes(color = Urbanisation_index) + 
          scale_color_discrete(name = "Urbanisation Index",
                               labels = c("Urban", "Suburban", "Village", "Rural"))

   Stand1<-p1 + 
          aes(color = Stand_density_index) + 
          scale_color_discrete(name = "Stand Density Index",
                               labels = c("Standing alone",
                                          "Within a few trees or close proximity to other trees", 
                                          "Within a stand of 10-30 trees",
                                          "Large or woodland"))

 Phenology1<-p1 + 
          aes(color = factor(Phenological_Index)) +
          scale_color_discrete(name = "Phenological Index",
                               labels = c("No indication of autumn timing", 
                                          "First autumn tinting", 
                                          "Partial autumn tinting (>25% of leaves)", 
                                          "Advanced autumn tinting (>75% of leaves)"))

 ##Observation 2

 p2 <- ggplot(QuercusRobur2,
             aes(x = Longitude, y = Latitude)) +
   geom_polygon(data = UK,
                aes(x = long, y = lat, group = group), 
                inherit.aes = FALSE) +
   geom_point() +
   coord_map(xlim = c(-10, 5)) + #limits added as there are some points really far away
   theme_classic()

 Urban2<-p2 + 
   aes(color = Urbanisation_index) + 
   scale_color_discrete(name = "Urbanisation Index",
                        labels = c("Urban", "Suburban", "Village", "Rural"))

 Stand2<-p2 + 
   aes(color = Stand_density_.index) + 
   scale_color_discrete(name = "Stand Density Index",
                        labels = c("Standing alone",
                                   "Within a few trees or close proximity to other trees", 
                                   "Within a stand of 10-30 trees",
                                   "Large or woodland"))

 Phenology2<-p2 + 
   aes(color = factor(Phenological_Index)) +
   scale_color_discrete(name = "Phenological Index",
                        labels = c("No indication of autumn timing", 
                                   "First autumn tinting", 
                                   "Partial autumn tinting (>25% of leaves)", 
                                   "Advanced autumn tinting (>75% of leaves)"))

##Arrange the individual plots into one main plot



plot_grid(Urban1 + ggtitle("Observational Period 1"), 
       Urban2 + ggtitle("Observational Period 2"), 
       Stand1,
       Stand2,
       Phenology1,
       Phenology2, 
       labels=c("A: Urbanisation Index", "B: Urbanisation Index",
                "C: Stand Density Index","D: Stand Density Index",
                "E: Phenological Index","F: Phenological Index"),
       align = "v", 

       label_fontface="bold",
       label_fontfamily="Times New Roman",
       label_size = 8,
       rel_widths = c(1, 1.3),
       ncol = 2,
       nrow = 3,
       hjust = 0, 
       label_x = 0.01)

根据R-code

制作的情节

期望输出

数据框 - QuercusRobur1

structure(list(Obs_.no = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 19L, 
20L, 21L, 22L, 23L, 24L, 25L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 
35L, 36L, 37L, 38L, 39L, 44L, 45L, 46L, 47L, 57L, 58L, 59L, 60L, 
61L, 62L, 63L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 72L, 74L, 
75L, 81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 93L, 
102L, 103L, 104L, 112L, 113L, 114L, 115L, 116L, 117L, 118L, 119L, 
120L, 121L, 122L, 123L, 124L, 125L, 126L, 127L, 128L, 129L, 130L, 
131L, 135L, 136L, 137L, 138L, 143L, 144L, 145L, 146L, 147L, 148L, 
149L, 150L, 151L, 152L, 153L, 154L, 155L, 158L, 159L, 160L, 161L, 
162L, 163L, 164L, 165L, 169L, 170L, 171L, 172L, 177L, 178L, 179L, 
180L, 181L, 182L, 183L, 184L, 185L, 186L, 187L, 188L, 189L, 190L, 
191L, 192L, 193L, 194L, 195L, 196L, 200L), Date_observed = structure(c(4L, 
15L, 6L, 6L, 6L, 6L, 2L, 2L, 8L, 8L, 8L, 8L, 8L, 8L, 6L, 6L, 
6L, 6L, 6L, 6L, 11L, 11L, 11L, 11L, 12L, 7L, 7L, 9L, 9L, 9L, 
9L, 5L, 5L, 5L, 5L, 14L, 14L, 14L, 14L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 6L, 6L, 5L, 5L, 9L, 9L, 9L, 9L, 3L, 3L, 3L, 3L, 4L, 4L, 
1L, 1L, 11L, 6L, 6L, 6L, 6L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 3L, 3L, 3L, 3L, 11L, 
11L, 11L, 4L, 4L, 4L, 4L, 8L, 8L, 10L, 10L, 10L, 10L, 9L, 9L, 
9L, 9L, 3L, 3L, 3L, 3L, 9L, 9L, 9L, 9L, 2L, 2L, 2L, 2L, 13L, 
13L, 13L, 13L, 8L, 8L, 8L, 8L, 10L, 10L, 10L, 10L, 3L, 3L, 3L, 
3L, 13L), .Label = c("10/1/18", "10/19/18", "10/20/18", "10/21/18", 
"10/22/18", "10/23/18", "10/24/18", "10/25/18", "10/26/18", "10/27/18", 
"10/28/18", "10/28/19", "10/29/18", "12/9/18", "8/20/18"), class = "factor"), 
    Latitude = c(51.4175, 52.12087, 52.0269, 52.0269, 52.0269, 
    52.0269, 52.947709, 52.947709, 51.491811, 51.491811, 52.59925, 
    52.59925, 52.59925, 52.59925, 51.60157, 51.60157, 52.6888, 
    52.6888, 52.6888, 52.6888, 50.697802, 50.697802, 50.697802, 
    50.697802, 53.62417, 50.446841, 50.446841, 53.959679, 53.959679, 
    53.959679, 53.959679, 51.78375, 51.78375, 51.78375, 51.78375, 
    51.456965, 51.456965, 51.456965, 51.456965, 51.3651, 51.3651, 
    51.3651, 51.3651, 52.01182, 52.01182, 52.01182, 52.01182, 
    50.114277, 50.114277, 51.43474, 51.43474, 51.10676, 51.10676, 
    51.10676, 51.10676, 50.435984, 50.435984, 50.435984, 50.435984, 
    51.78666, 51.78666, 52.441088, 52.441088, 52.552344, 49.259471, 
    49.259471, 49.259471, 49.259471, 50.461625, 50.461625, 50.461625, 
    50.461625, 51.746642, 51.746642, 51.746642, 51.746642, 52.2501, 
    52.2501, 52.2501, 52.2501, 52.423336, 52.423336, 52.423336, 
    52.423336, 53.615575, 53.615575, 53.615575, 53.615575, 51.08474, 
    51.08474, 51.08474, 53.19329, 53.19329, 53.19329, 53.19329, 
    55.96785, 55.96785, 56.52664, 56.52664, 56.52664, 56.52664, 
    51.8113, 51.8113, 51.8113, 51.8113, 52.580157, 52.580157, 
    52.580157, 52.580157, 50.52008, 50.52008, 50.52008, 50.52008, 
    51.48417, 51.48417, 51.48417, 51.48417, 54.58243, 54.58243, 
    54.58243, 54.58243, 52.58839, 52.58839, 52.58839, 52.58839, 
    52.717283, 52.717283, 52.717283, 52.717283, 50.740764, 50.740764, 
    50.740764, 50.740764, 52.57937), Longitude = c(-0.32118, 
    -0.29293, -0.7078, -0.7078, -0.7078, -0.7078, -1.435407, 
    -1.435407, -3.210324, -3.210324, 1.33011, 1.33011, 1.33011, 
    1.33011, -3.67111, -3.67111, -3.30909, -3.30909, -3.30909, 
    -3.30909, -2.11692, -2.11692, -2.11692, -2.11692, -2.43155, 
    -3.706923, -3.706923, -1.061008, -1.061008, -1.061008, -1.061008, 
    -0.65046, -0.65046, -0.65046, -0.65046, -2.624917, -2.624917, 
    -2.624917, -2.624917, 0.70706, 0.70706, 0.70706, 0.70706, 
    -0.70082, -0.70082, -0.70082, -0.70082, -5.541128, -5.541128, 
    0.45981, 0.45981, -2.32071, -2.32071, -2.32071, -2.32071, 
    -4.105617, -4.105617, -4.105617, -4.105617, -0.71433, -0.71433, 
    -0.176158, -0.176158, -1.337177, -123.107788, -123.107788, 
    -123.107788, -123.107788, 3.560973, 3.560973, 3.560973, 3.560973, 
    0.486416, 0.486416, 0.486416, 0.486416, -0.8825, -0.8825, 
    -0.8825, -0.8825, -1.787563, -1.787563, -1.787563, -1.787563, 
    -2.432959, -2.432959, -2.432959, -2.432959, -0.73645, -0.73645, 
    -0.73645, -0.63793, -0.63793, -0.63793, -0.63793, -3.18084, 
    -3.18084, -3.40313, -3.40313, -3.40313, -3.40313, -0.22894, 
    -0.22894, -0.22894, -0.22894, -1.948571, -1.948571, -1.948571, 
    -1.948571, -4.20756, -4.20756, -4.20756, -4.20756, -0.34854, 
    -0.34854, -0.34854, -0.34854, -5.93229, -5.93229, -5.93229, 
    -5.93229, -1.96843, -1.96843, -1.96843, -1.96843, -2.410575, 
    -2.410575, -2.410575, -2.410575, -2.361234, -2.361234, -2.361234, 
    -2.361234, -1.89325), Altitude = c(5L, 0L, 68L, 68L, 68L, 
    68L, 104L, 104L, 15L, 15L, 23L, 23L, 23L, 23L, 184L, 184L, 
    176L, 176L, 176L, 176L, 12L, 12L, 12L, 12L, 178L, 36L, 36L, 
    11L, 11L, 11L, 11L, 210L, 210L, 210L, 210L, 97L, 97L, 97L, 
    97L, 23L, 23L, 23L, 23L, 0L, 0L, 0L, 0L, 9L, 9L, 4L, 4L, 
    200L, 200L, 200L, 200L, 160L, 160L, 160L, 160L, 166L, 166L, 
    0L, 0L, 0L, 47L, 47L, 47L, 47L, 58L, 58L, 58L, 58L, 43L, 
    43L, 43L, 43L, 97L, 97L, 97L, 97L, 133L, 133L, 133L, 133L, 
    123L, 123L, 123L, 123L, 128L, 128L, 128L, 15L, 15L, 15L, 
    15L, 14L, 14L, 65L, 65L, 65L, 65L, 129L, 129L, 129L, 129L, 
    140L, 140L, 140L, 140L, 18L, 18L, 18L, 18L, 30L, 30L, 30L, 
    30L, 19L, 19L, 19L, 19L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    96L, 96L, 96L, 96L, 169L), Species = structure(c(1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Quercus robur", class = "factor"), 
    Tree_diameter = c(68.8, 10, 98.5, 97, 32.5, 45.1, 847, 817, 
    62, 71, 140, 111.4, 114.6, 167.1, 29, 40.1, 68, 45, 60, 54, 
    104, 122, 85, 71, 81, 39.8, 43.6, 20.1, 17.8, 15.6, 12.1, 
    81.8, 102.5, 75.5, 57.3, 0.3, 0.2, 0.3, 0.3, 70, 36, 53, 
    44, 31.5, 27.1, 23.3, 22, 69.4, 37.3, 19.9, 14.6, 196, 122, 
    118, 180, 58.6, 54.1, 58, 61.5, 58.4, 61, 134, 64, 52.2, 
    170, 114, 127, 158, 147.4, 135.3, 122.9, 104.1, 263, 237, 
    322, 302, 175, 182, 141, 155, 89, 41, 70, 83, 141, 86.5, 
    82, 114.5, 129, 127, 143, 125, 92, 68, 90, 24.5, 20.1, 63.7, 
    39.8, 66.2, 112.4, 124.5, 94.1, 68.6, 74.4, 23.6, 27.7, 22.9, 
    25.2, 24.2, 54.7, 43, 33.1, 306, 274, 56, 60, 72.5, 128.5, 
    22, 16, 143, 103, 53, 130, 48.4, 69.8, 6.4, 18.6, 129.2, 
    41.7, 57.6, 14, 41.7), Urbanisation_index = c(2L, 1L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 4L, 4L, 
    4L, 4L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
    4L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 
    4L, 4L, 1L, 1L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 2L), Stand_density_index = c(3L, 
    1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 4L, 1L, 1L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 2L, 2L, 4L, 4L, 3L, 3L, 3L, 3L, 4L, 3L, 
    4L, 4L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 
    2L, 2L, 2L, 2L, 2L, 3L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 1L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
    2L, 2L, 2L, 2L, 3L, 3L, 3L, 2L, 4L, 4L, 4L, 4L, 4L), Canopy_Index = c(85L, 
    85L, 85L, 75L, 45L, 25L, 75L, 65L, 75L, 75L, 95L, 95L, 95L, 
    95L, 95L, 65L, 85L, 65L, 95L, 85L, 85L, 85L, 75L, 75L, 65L, 
    85L, 85L, 75L, 75L, 85L, 65L, 95L, 85L, 95L, 95L, 75L, 75L, 
    85L, 85L, 85L, 85L, 85L, 75L, 85L, 85L, 85L, 85L, 75L, 75L, 
    85L, 85L, 65L, 75L, 85L, 75L, 95L, 95L, 95L, 95L, 75L, 65L, 
    95L, 95L, 55L, 75L, 65L, 75L, 65L, 85L, 95L, 95L, 75L, 95L, 
    75L, 95L, 65L, 75L, 75L, 85L, 85L, 65L, 95L, 65L, 65L, 65L, 
    65L, 65L, 65L, 85L, 85L, 75L, 95L, 85L, 85L, 75L, 45L, 55L, 
    35L, 35L, 25L, 25L, 95L, 85L, 75L, 85L, 85L, 75L, 75L, 65L, 
    75L, 85L, 65L, 45L, 95L, 95L, 95L, 95L, 65L, 75L, 45L, 35L, 
    75L, 95L, 95L, 85L, 75L, 65L, 85L, 95L, 75L, 85L, 85L, 95L, 
    65L), Phenological_Index = c(2L, 4L, 2L, 2L, 4L, 4L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 2L, 3L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 2L, 1L, 1L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 2L, 3L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 1L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 3L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
    3L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    4L, 1L, 1L, 1L, 1L, 3L, 2L, 3L, 3L, 3L, 3L, 4L, 3L, 2L, 3L, 
    2L, 2L, 2L, 1L, 3L, 1L, 4L)), class = "data.frame", row.names = c(NA, 
-134L))

数据框 - QuercusRobur2

   structure(list(X = c(1L, 2L, 3L, 4L, 13L, 14L, 15L, 18L, 19L, 
20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 35L, 36L, 
37L, 38L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 
59L, 63L, 64L, 68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 
78L, 80L, 89L, 90L, 91L, 95L, 96L, 97L, 98L, 99L, 100L, 101L, 
102L, 103L, 104L, 105L, 106L, 107L, 108L, 109L, 110L, 111L, 112L, 
113L, 114L, 118L, 119L, 120L, 121L, 126L, 127L, 128L, 129L, 130L, 
131L, 132L, 133L, 134L, 135L, 136L, 137L, 138L, 141L, 142L, 143L, 
144L, 148L, 149L, 150L, 151L, 156L, 157L, 158L, 159L, 160L, 161L, 
162L, 163L, 164L, 165L, 166L, 167L, 168L, 169L, 170L, 171L, 172L, 
173L, 174L, 175L, 179L, 180L, 181L, 182L, 183L, 185L, 187L, 189L, 
190L, 191L, 192L, 193L, 194L, 195L, 196L, 208L, 209L, 210L, 212L, 
214L, 225L, 226L, 227L, 228L, 229L, 230L, 231L, 242L, 243L, 244L, 
245L, 246L, 247L, 248L, 249L, 250L, 251L, 252L, 253L, 254L, 255L, 
256L, 257L, 258L, 259L, 260L, 261L), Obs_no = c(1L, 2L, 3L, 4L, 
13L, 14L, 15L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 
28L, 29L, 30L, 35L, 36L, 37L, 38L, 48L, 49L, 50L, 51L, 52L, 53L, 
54L, 55L, 56L, 57L, 58L, 59L, 63L, 64L, 68L, 69L, 70L, 71L, 72L, 
73L, 74L, 75L, 76L, 77L, 78L, 80L, 89L, 90L, 91L, 95L, 96L, 97L, 
98L, 99L, 100L, 101L, 102L, 103L, 104L, 105L, 106L, 107L, 108L, 
109L, 110L, 111L, 112L, 113L, 114L, 118L, 119L, 120L, 121L, 126L, 
127L, 128L, 129L, 130L, 131L, 132L, 133L, 134L, 135L, 136L, 137L, 
138L, 141L, 142L, 143L, 144L, 148L, 149L, 150L, 151L, 156L, 157L, 
158L, 159L, 160L, 161L, 162L, 163L, 164L, 165L, 166L, 167L, 168L, 
169L, 170L, 171L, 172L, 173L, 174L, 175L, 179L, 180L, 181L, 182L, 
183L, 185L, 187L, 189L, 190L, 191L, 192L, 193L, 194L, 195L, 196L, 
208L, 209L, 210L, 212L, 214L, 225L, 226L, 227L, 228L, 229L, 230L, 
231L, 242L, 243L, 244L, 245L, 246L, 247L, 248L, 249L, 250L, 251L, 
252L, 253L, 254L, 255L, 256L, 257L, 258L, 259L, 260L, 261L), 
    Date_observed = structure(c(9L, 14L, 3L, 3L, 12L, 12L, 10L, 
    10L, 8L, 8L, 8L, 8L, 11L, 11L, 11L, 11L, 5L, 5L, 9L, 9L, 
    13L, 13L, 13L, 13L, 8L, 8L, 8L, 8L, 13L, 13L, 13L, 13L, 7L, 
    7L, 7L, 7L, 6L, 6L, 11L, 11L, 11L, 11L, 11L, 11L, 4L, 4L, 
    4L, 4L, 12L, 12L, 12L, 12L, 5L, 1L, 1L, 1L, 1L, 5L, 5L, 5L, 
    5L, 12L, 12L, 12L, 12L, 11L, 11L, 11L, 11L, 2L, 2L, 2L, 2L, 
    3L, 3L, 3L, 3L, 13L, 13L, 13L, 8L, 8L, 8L, 8L, 13L, 13L, 
    12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 
    3L, 3L, 3L, 3L, 13L, 13L, 13L, 13L, 10L, 10L, 10L, 10L, 12L, 
    12L, 12L, 12L, 3L, 3L, 3L, 3L, 13L, 13L, 5L, 5L, 5L, 11L, 
    11L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 
    9L, 9L, 12L, 12L, 12L, 12L, 8L, 8L, 8L, 5L, 5L, 5L, 5L, 12L, 
    12L, 12L, 12L, 11L, 11L, 11L, 11L, 13L, 13L, 13L, 13L, 5L, 
    5L, 5L, 5L), .Label = c("10/23/18", "11/18/18", "11/30/18", 
    "12/1/18", "12/10/18", "12/12/18", "12/2/18", "12/3/18", 
    "12/4/18", "12/6/18", "12/7/18", "12/8/18", "12/9/18", "9/10/18"
    ), class = "factor"), Latitude = c(51.41752, 52.243806, 52.947709, 
    52.947709, 51.491811, 51.491811, 51.60157, 51.60157, 52.68959, 
    52.68959, 52.68959, 52.68959, 50.697802, 50.697802, 50.697802, 
    50.697802, 53.62417, 53.62417, 50.446841, 50.446841, 53.959679, 
    53.959679, 53.959679, 53.959679, 51.78375, 51.78375, 51.78375, 
    51.78375, 51.456965, 51.456965, 51.456965, 51.456965, 52.011812, 
    52.011812, 52.011812, 52.011812, 50.121978, 50.121978, 51.43474, 
    51.43474, 51.10708, 51.10708, 51.10708, 51.10708, 50.435984, 
    50.435984, 50.435984, 50.435984, 51.78666, 51.78666, 52.441088, 
    52.441088, 52.552344, 49.259471, 49.259471, 49.259471, 49.259471, 
    50.462, 50.462, 50.462, 50.462, 51.746642, 51.746642, 51.746642, 
    51.746642, 52.2501, 52.2501, 52.2501, 52.2501, 52.42646, 
    52.42646, 52.42646, 52.42646, 53.615575, 53.615575, 53.615575, 
    53.615575, 51.08478, 51.08478, 51.08478, 53.19329, 53.19329, 
    53.19329, 53.19329, 55.968437, 55.968437, 56.52664, 56.52664, 
    56.52664, 56.52664, 51.8113, 51.8113, 51.8113, 51.8113, 50.52008, 
    50.52008, 50.52008, 50.52008, 51.48417, 51.48417, 51.48417, 
    51.48417, 54.58243, 54.58243, 54.58243, 54.58243, 52.58839, 
    52.58839, 52.58839, 52.58839, 52.717283, 52.717283, 52.717283, 
    52.717283, 50.740764, 50.740764, 50.740764, 50.740764, 50.733412, 
    50.733412, 50.79926, 50.79926, 50.79926, 53.675788, 53.675788, 
    48.35079, 48.35079, 48.35079, 48.35079, 51.36445, 51.36445, 
    51.36445, 51.36445, 52.122402, 52.122402, 52.122402, 52.16104, 
    52.16104, 51.88468, 51.88468, 51.88468, 51.88468, 52.34015, 
    52.34015, 52.34015, 52.026042, 52.026042, 52.026042, 52.026042, 
    51.319032, 51.319032, 51.319032, 51.319032, 51.51365, 51.51365, 
    51.51365, 51.51365, 53.43202, 53.43202, 53.43202, 53.43202, 
    51.50797, 51.50797, 51.50797, 51.50797), Longitude = c(-0.32116, 
    1.30786, -1.435407, -1.435407, -3.210324, -3.210324, -3.67111, 
    -3.67111, -3.3081, -3.3081, -3.3081, -3.3081, -2.11692, -2.11692, 
    -2.11692, -2.11692, -2.43155, -2.43155, -3.706923, -3.706923, 
    -1.061008, -1.061008, -1.061008, -1.061008, -0.65046, -0.65046, 
    -0.65046, -0.65046, -2.624917, -2.624917, -2.624917, -2.624917, 
    -0.70082, -0.70082, -0.70082, -0.70082, -5.555169, -5.555169, 
    0.45981, 0.45981, -2.32027, -2.32027, -2.32027, -2.32027, 
    -4.105617, -4.105617, -4.105617, -4.105617, -0.71433, -0.71433, 
    -0.176158, -0.176158, -1.337177, -123.107788, -123.107788, 
    -123.107788, -123.107788, -3.5607, -3.5607, -3.5607, -3.5607, 
    0.486416, 0.486416, 0.486416, 0.486416, -0.8825, -0.8825, 
    -0.8825, -0.8825, -1.78771, -1.78771, -1.78771, -1.78771, 
    -2.432959, -2.432959, -2.432959, -2.432959, -0.73626, -0.73626, 
    -0.73626, -0.63793, -0.63793, -0.63793, -0.63793, -3.179732, 
    -3.179732, -3.40313, -3.40313, -3.40313, -3.40313, -0.22894, 
    -0.22894, -0.22894, -0.22894, -4.20756, -4.20756, -4.20756, 
    -4.20756, -0.34854, -0.34854, -0.34854, -0.34854, -5.93229, 
    -5.93229, -5.93229, -5.93229, -1.96843, -1.96843, -1.96843, 
    -1.96843, -2.410575, -2.410575, -2.410575, -2.410575, -2.361234, 
    -2.361234, -2.361234, -2.361234, -2.014029, -2.014029, -3.19446, 
    -3.19446, -3.19446, -1.272404, -1.272404, 10.91812, 10.91812, 
    10.91812, 10.91812, -0.23106, -0.23106, -0.23106, -0.23106, 
    -0.487443, -0.487443, -0.487443, 0.18702, 0.18702, -0.17853, 
    -0.17853, -0.17853, -0.17853, -1.27795, -1.27795, -1.27795, 
    -0.503113, -0.503113, -0.503113, -0.503113, -0.472994, -0.472994, 
    -0.472994, -0.472994, -3.18722, -3.18722, -3.18722, -3.18722, 
    -2.27968, -2.27968, -2.27968, -2.27968, -0.25931, -0.25931, 
    -0.25931, -0.25931), Altitude = c(0, 0, 103.9, 103.9, 15, 
    15, 184, 184, 176, 176, 176, 176, 12, 12, 12, 12, 178, 178, 
    36, 36, 11, 11, 11, 11, 210, 210, 210, 210, 97, 97, 97, 97, 
    0, 0, 0, 0, 68, 68, 4, 4, 200, 200, 200, 200, 160, 160, 160, 
    160, 165.8, 165.8, 0, 0, 0, 47, 47, 47, 47, 0, 0, 0, 0, 43, 
    43, 43, 43, 97, 97, 97, 97, 133, 133, 133, 133, 123, 123, 
    123, 123, 127, 127, 127, 15, 15, 15, 15, 14, 14, 65, 65, 
    65, 65, 129, 129, 129, 129, 18, 18, 18, 18, 30, 30, 30, 30, 
    19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 96, 96, 96, 96, 0, 
    0, 0, 0, 0, 49, 49, 0, 0, 0, 0, 48, 48, 48, 48, 43, 43, 43, 
    75, 75, 94, 94, 94, 94, 112, 112, 112, 103, 103, 103, 103, 
    0, 0, 0, 0, 37.5, 37.5, 37.5, 37.5, 29, 29, 29, 29, 63, 63, 
    63, 63), Species = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "Quercus robur", class = "factor"), 
    Tree_diameter = c(68.8, 300, 847, 817, 62, 71, 29, 40.1, 
    68, 45, 60, 54, 104, 122, 85, 71, 81, 118, 39.8, 43.6, 19.8, 
    16.6, 15.1, 11.9, 81.8, 102.5, 75.5, 57.3, 0.3, 0.2, 0.3, 
    0.3, 99, 85, 74, 68, 82, 51.8, 19.9, 14.6, 196, 122, 118, 
    180, 58.6, 54.1, 58, 61.5, 58.4, 61, 134, 64, 52.2, 170, 
    114, 127, 158, 147.4, 135.3, 122.9, 104.1, 263, 237, 322, 
    302, 173, 186, 144, 155, 89, 41, 68, 83, 141.6, 85.5, 82.8, 
    114.1, 129, 127, 143, 125, 92, 68, 90, 25, 20, 63.7, 39.8, 
    66.2, 112.4, 124.5, 94.1, 68.6, 74.4, 24.2, 54.7, 43, 33.1, 
    306, 274, 56, 60, 72.5, 128.5, 22, 16, 143, 103, 53, 130, 
    48.4, 69.8, 6.4, 18.6, 129.2, 41.7, 57.6, 14, 320, 352, 120.9, 
    108.3, 53.2, 274, 85, 52, 43, 38, 37, 219, 215, 216, 175, 
    85.9, 49.7, 97.1, 40.8, 62.4, 181.5, 149.7, 122, 143.6, 148, 
    145, 99, 27.5, 32, 54, 54.1, 169, 152, 160, 138, 90.8, 87.9, 
    77.4, 81.2, 91.7, 62.7, 50, 72.9, 24.8, 61, 88.6, 80.1), 
    Urbanisation_index = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 
    4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 
    2L, 2L, 2L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    4L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 
    4L, 4L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 
    4L, 4L, 4L, 1L, 1L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
    2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 3L, 4L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 1L, 1L, 1L, 
    1L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("1", "2", 
    "3", "4"), class = "factor"), Stand_density_.index = structure(c(3L, 
    4L, 2L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 
    4L, 4L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 
    2L, 3L, 3L, 3L, 3L, 3L, 2L, 3L, 3L, 2L, 2L, 4L, 4L, 3L, 3L, 
    3L, 3L, 4L, 3L, 4L, 4L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 3L, 4L, 4L, 4L, 4L, 2L, 
    2L, 2L, 2L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 
    2L, 2L, 2L, 2L, 3L, 3L, 3L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 
    2L, 2L, 2L, 4L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    4L, 4L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 3L, 3L, 
    3L, 3L, 4L, 4L, 4L, 2L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L), .Label = c("1", 
    "2", "3", "4"), class = "factor"), Canopy_Index = c(15L, 
    95L, 45L, 5L, 5L, 5L, 25L, 15L, 25L, 25L, 35L, 35L, 25L, 
    35L, 15L, 15L, 15L, 15L, 5L, 5L, 5L, 5L, 5L, 5L, 35L, 35L, 
    55L, 35L, 5L, 5L, 5L, 5L, 95L, 95L, 95L, 95L, 25L, 25L, 15L, 
    5L, 25L, 25L, 25L, 25L, 5L, 5L, 5L, 5L, 5L, 5L, 35L, 25L, 
    5L, 35L, 35L, 25L, 25L, 5L, 5L, 5L, 5L, 35L, 25L, 25L, 25L, 
    5L, 5L, 15L, 15L, 35L, 65L, 35L, 35L, 25L, 25L, 25L, 25L, 
    15L, 15L, 5L, 35L, 35L, 45L, 35L, 5L, 15L, 15L, 25L, 5L, 
    15L, 15L, 5L, 5L, 15L, 5L, 5L, 5L, 5L, 5L, 85L, 5L, 35L, 
    15L, 5L, 5L, 5L, 25L, 25L, 15L, 35L, 95L, 95L, 95L, 95L, 
    15L, 15L, 5L, 25L, 25L, 5L, 15L, 15L, 5L, 15L, 5L, 25L, 25L, 
    25L, 25L, 5L, 5L, 5L, 5L, 25L, 25L, 55L, 35L, 25L, 15L, 15L, 
    25L, 15L, 45L, 35L, 35L, 15L, 35L, 15L, 15L, 35L, 15L, 25L, 
    25L, 15L, 15L, 15L, 15L, 5L, 5L, 5L, 5L, 5L, 5L, 15L, 15L
    ), Phenological_Index = c(4L, 4L, 3L, 4L, 2L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 3L, 2L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L)), row.names = c(NA, -165L), class = "data.frame")  

如何使用 subtitle 来标记每个单独的地块?

## Observation 1
p1 <- ggplot(
  QuercusRobur1,
  aes(x = Longitude, y = Latitude)
) +
  geom_polygon(
    data = UK,
    aes(x = long, y = lat, group = group),
    inherit.aes = FALSE
  ) +
  coord_map(xlim = c(-10, 5)) + # limits added as there are some points really far away
  theme_classic()


Urban1 <- p1 +
  geom_point(aes(color = factor(Urbanisation_index))) +
  scale_color_discrete(
    name = "Urbanisation Index",
    labels = c("Urban", "Suburban", "Village", "Rural")
  ) +
  labs(subtitle = "A: Urbanisation Index") +
  theme(legend.justification = "left")

Stand1 <- p1 +
  geom_point(aes(color = factor(Stand_density_index))) +
  scale_color_discrete(
    name = "Stand Density Index",
    labels = c(
      "Standing alone",
      "Within a few trees or close proximity to other trees",
      "Within a stand of 10-30 trees",
      "Large or woodland"
    )
  ) +
  labs(subtitle = "C: Stand Density Index") +
  theme(legend.justification = "left")

## Observation 2
p2 <- ggplot(
  QuercusRobur2,
  aes(x = Longitude, y = Latitude)
) +
  geom_polygon(
    data = UK,
    aes(x = long, y = lat, group = group),
    inherit.aes = FALSE
  ) +
  coord_map(xlim = c(-10, 5)) + 
  theme_classic()

Urban2 <- p2 +
  geom_point(aes(color = factor(Urbanisation_index))) +
  scale_color_discrete(
    name = "Urbanisation Index",
    labels = c("Urban", "Suburban", "Village", "Rural")
  ) +
  labs(subtitle = "B: Urbanisation Index") +
  theme(legend.justification = "left")

Stand2 <- p2 +
  geom_point(aes(color = factor(Stand_density_.index))) +
  scale_color_discrete(
    name = "Stand Density Index",
    labels = c(
      "Standing alone",
      "Within a few trees or close proximity to other trees",
      "Within a stand of 10-30 trees",
      "Large or woodland"
    )
  ) +
  labs(subtitle = "D: Stand Density Index") +
  theme(legend.justification = "left")

## Arrange the individual plots into one main plot
plot_grid(
  Urban1 + ggtitle("Observational Period 1\n") + theme(plot.title = element_text(hjust = 1.0)),
  Urban2 + ggtitle("Observational Period 2\n") + theme(plot.title = element_text(hjust = 1.0)),
  Stand1,
  Stand2,
  align = "hv",
  axis = 'tblr',
  label_fontface = "bold",
  label_fontfamily = "Times New Roman",
  label_size = 8,
  rel_widths = c(1, 1.3),
  ncol = 2,
  nrow = 2,
  hjust = 0,
  label_x = 0.01
)

编辑:删除重复的轴标签和图例,然后使用egg::ggarrange组合子图。

## Observation 1
Urban1 <- p1 +
  geom_point(aes(color = factor(Urbanisation_index))) +
  scale_color_discrete(
    name = "Urbanisation Index",
    labels = c("Urban", "Suburban", "Village", "Rural")
  ) +
  labs(subtitle = "A: Urbanisation Index") +
  theme(legend.position = "none")

Stand1 <- p1 +
  geom_point(aes(color = factor(Stand_density_index))) +
  scale_color_discrete(
    name = "Stand Density Index",
    labels = c(
      "Standing alone",
      "Within a few trees or close proximity to other trees",
      "Within a stand of 10-30 trees",
      "Large or woodland"
    )
  ) +
  labs(subtitle = "C: Stand Density Index") +
  theme(legend.position = "none")

## Observation 2
p2 <- ggplot(
  QuercusRobur2,
  aes(x = Longitude, y = Latitude)
) +
  geom_polygon(
    data = UK,
    aes(x = long, y = lat, group = group),
    inherit.aes = FALSE
  ) +
  coord_map(xlim = c(-10, 5)) + 
  theme_classic() +
  ylab("")

Urban2 <- p2 +
  geom_point(aes(color = factor(Urbanisation_index))) +
  scale_color_discrete(
    name = "Urbanisation Index",
    labels = c("Urban", "Suburban", "Village", "Rural")
  ) +
  labs(subtitle = "B: Urbanisation Index") +
  theme(legend.justification = "left")

Stand2 <- p2 +
  geom_point(aes(color = factor(Stand_density_.index))) +
  scale_color_discrete(
    name = "Stand Density Index",
    labels = c(
      "Standing alone",
      "Within a few trees or close proximity to other trees",
      "Within a stand of 10-30 trees",
      "Large or woodland"
    )
  ) +
  labs(subtitle = "D: Stand Density Index") +
  theme(legend.justification = "left")

## Use the `egg` package
library(egg)
ggarrange(
  Urban1 + ggtitle("Observational Period 1\n") + theme(plot.title = element_text(hjust = 0.5)),
  Urban2 + ggtitle("Observational Period 2\n") + theme(plot.title = element_text(hjust = 0.5)),
  Stand1,
  Stand2,
  nrow = 2,
  ncol = 2
)