如何使每月图表的功能颜色发生变化?

How to make colors change in a function for monthly plots?

我有迁徙物种的时空数据,我想制作一个 GIF,按月显示它们全年的移动情况。我正在使用此代码为每个月制作一张图片:

eb  <- #put the dput() data provided below here
cols_m <- setNames( c("blue1", "cyan2", "green3", "greenyellow", "yellow1", "orange1", "orangered", "red3", "mediumvioletred", "darkviolet", "mediumpurple4", "darkblue"), levels(eb$MONTH2))

#create the base map####
library(ggplot2)
library(rnaturalearth)
library(rnaturalearthdata)

world <- ne_countries(scale = "medium", returnclass = "sf")

gg  <- ggplot(data = world) +
  geom_sf(color = "white", fill = "gray45", lwd=0.2) + 
  coord_sf(xlim=c(60,170), ylim=c(-40, 55), expand = FALSE) +
  theme(panel.background = element_rect(fill="gray10"), 
        panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank(),
        axis.title.y=element_blank(), axis.text.y=element_blank(), axis.ticks.y=element_blank())

#function for pictures each month PER SPECIES####
spec_map_fu <- function(MONTH){
  gg + geom_point(data=eb[eb$MONTH==MONTH,], aes(x=LONGITUDE, y=LATITUDE, color=as.factor(MONTH)), size=0.5, alpha=0.5, show.legend = FALSE) +
    scale_color_manual(values=cols_m) +
    theme(strip.text.x = element_text(size=12, color="white", face="bold"), 
          strip.background = element_rect(fill="gray10"), plot.background = element_rect(fill = "gray10"), panel.background = element_rect(fill = "gray10")) +
    annotate("text", x = 60, y=-40, label = "ship", color="white") +
    facet_grid(. ~ COMMON.NAME)
  print(paste0("saving plot", MONTH))
  ggsave(filename = sprintf("%02d.png", MONTH), dpi=100)
}


#save a plot for each month
library(purrr)

seq(from=1, to=12, by=1) %>% 
  map_df(spec_map_fu)

我想让点的颜色根据 cols_m 中设置的绘制月份而改变,但是只有第一种颜色用于所有十二个绘图。我怎样才能做到最后每个月都有一张使用我设置的不同颜色的照片?

额外问题:如何将月份的相应名称添加到物种名称上方的图中?



使用 dput():

制作的示例数据
structure(list(OBSERVATION.DATE = structure(c(6262, 10252, 10484, 
9300, 6882, 10058, 8285, 10798, 7811, 7757, 3935, 3902, 10772, 
10713, 8610, 3312, 10688, 8474, 8233, 6859, 3940, 358, 10820, 
10853, 10953, 10928, 954, 8866, 7947, 9438, 10944, 5868, 10237, 
6736, 6883, 6339, 9631, 9432, 6259, 6198, 9796, 4025, 10544, 
6891, 7418, 8401, 3935, 9494, 6957, 6945, 16920, 17054, 17153, 
16872, 16864, 16965, 17117, 16964, 16932, 16955, 17141, 16849, 
16866, 16941, 17034, 16947, 16955, 16873, 16819, 16915, 16845, 
17160, 16860, 16838, 16884, 16802, 16930, 16927, 17085, 16863, 
17081, 17088, 16837, 17094, 16848, 16846, 16989, 16844, 16905, 
17085, 17019, 16845, 17107, 17085, 17147, 17027, 16940, 17147, 
16925, 17035, 16131, 16432, 16419, 16417, 16324, 16073, 16370, 
16107, 16360, 16072, 16071, 16081, 16363, 16383, 16074, 16398, 
16076, 16402, 16372, 16425, 16427, 16088, 16130, 16396, 16095, 
16123, 16366, 16413, 16404, 16426, 16400, 16417, 16112, 16425, 
16169, 16353, 16405, 16385, 16371, 16389, 16415, 16279, 16367, 
16428, 16396, 16409, 16370, 16083, 16360, 16398), class = "Date"), 
    COMMON.NAME = 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, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 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, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("Dollarbird", "Asian Koel", 
    "Pacific Koel"), class = "factor"), LATITUDE = c(14.4382942, 
    3.33714, -13.4336, 3.0960945, -28.0172, 35.514, -27.84, 27.57326, 
    12.174918, -27.2494, -13.08333, 22.2725429, -5.2080576, 16.1003246, 
    14.4385453, -28.30869, -4.25, 1.8610871, -5.6261643, -10.6938, 
    15.1443814, -26.64167, -6.41667, 24.937827, -16.8992644, 
    -26.9277329, 37.6159991, 24.9692525, -31.08333, -35.1655993, 
    -12.659014, -12.506973, -33.5661555, 24.928, -16.9118569, 
    25.2122382, 39.1379995, -31.4300769, 11.4232423, -33.6175927, 
    -35.27722, -20.91382, -34.07, 0.5944456, 0.5944456, 4.933333, 
    -26.09074, 10.2752706, -27.5198, -9.44261, 11.0587881, 19.2352947, 
    11.6762876, 19.3297939, 9.7904882, 20.2113159, 8.6405841, 
    12.7362145, 26.5199162, 13.1189651, 15.4226027, 11.0587881, 
    10.2152602, 13.1251482, 12.8805882, 11.9878325, 13.1189651, 
    12.1085027, 15.43169, 12.8536944, 11.6875401, 13.9818607, 
    12.31273, 18.2887021, 13.0689753, 9.6814038, 27.87943, 11.7453606, 
    10.3042383, 6.2932783, 15.2983633, 15.3988398, 8.165719, 
    12.959246, 9.903407, 26.1519993, 2.2266681, 12.8536944, 29.3880771, 
    9.640774, 5.2010485, 1.400603, 13.0375891, 10.3042383, 11.5076967, 
    10.7973073, 10.9953306, 10.0585898, 13.7313789, 11.9901151, 
    -23.3992842, -34.5972676, -34.9534931, -38.175, -16.2493413, 
    -32.4802254, -16.8613089, -24.85333, -24.7623623, -32.75, 
    -31.2619444, -32.8625742, -12.8470278, -16.2493413, -31.4447925, 
    -16.2493413, -24.85333, -35.3404744, -33.6932, -34.5620963, 
    -16.2493413, -19.45604, -33.8727352, -12.4250111, -27.2764784, 
    -27.5430528, -17.177295, -19.50085, -27.4535203, -30.3394444, 
    -32.8137904, -15.5586556, -32.4335206, -24.465538, -32.8918537, 
    -27.6758, -27.3158952, -31.429997, -27.0929816, -33.8434, 
    -21.052047, -6.0413889, -26.8403078, -36.3977778, -21.1406687, 
    -26.60616, -30.67551, -33.1253, -27.8983513, -37.5561965), 
    LONGITUDE = c(101.3721952, 101.2438202, 132.4168, 101.6582751, 
    153.1647, 126.597, 153.34972, 84.49705, 108.698558, 152.8755, 
    131.08333, 114.175884, 145.8102894, 99.1078377, 101.37218, 
    152.94382, 142.75, 103.8928771, 150.5884557, 142.53373, 120.5873379, 
    153.075, 146.75, 121.530921, 145.7476759, 152.7585411, 126.9629002, 
    112.9985046, 152.75, 149.162364, 143.3473778, 130.949564, 
    150.9257498, 113.017, 145.7544564, 121.6983715, 118.8351202, 
    152.8838931, 107.4278355, 150.4653168, 149.17544, 149.03417, 
    150.77078, 101.4464866, 101.4464866, 100.466667, 150.82348, 
    77.1605229, 152.9261, 147.37347, 76.9488433, 73.0760503, 
    78.1634384, 72.8137638, 76.3045665, 79.4070699, 77.642887, 
    77.5716734, 80.2325555, 80.2503882, 73.8916826, 76.9488433, 
    76.2530458, 80.2417676, 79.7130203, 77.1439254, 80.2503882, 
    78.1528252, 75.03567, 77.5094716, 78.1803417, 74.5694332, 
    76.62383, 74.7760435, 77.5780463, 76.5553361, 98.344495, 
    75.5512126, 79.8313083, 81.2749672, 74.0043783, 73.8649249, 
    98.294177, 74.86168, 78.072681, 91.66327, 102.1520142, 77.5094716, 
    79.5111144, 76.422109, 100.4255533, 103.817997, 79.9839449, 
    79.8313083, 92.7023792, 76.8178439, 76.7392384, 76.3870288, 
    100.5417091, 77.0560348, 150.4887995, 150.895586, 150.7628059, 
    144.325, 145.3168123, 152.3597717, 145.7523966, 152.33619, 
    152.412352, 152.25, 151.2033333, 151.6852283, 132.8171956, 
    145.3168123, 152.468133, 145.3168123, 152.33619, 149.1091812, 
    151.28675, 150.8729643, 145.3168123, 147.06543, 151.1764133, 
    132.9647424, 153.0380112, 152.8611366, 145.45824, 147.29715, 
    153.1010067, 150.46, 151.811211, 144.4457102, 152.5267982, 
    150.92601, 151.7181417, 153.04223, 153.062259, 152.609824, 
    153.163619, 151.07068, 149.1907874, 141.2125, 152.8790474, 
    150.0416667, 148.6324668, 153.01294, 150.52443, 150.2812, 
    153.1111991, 149.7560281), MONTH = c(2, 1, 9, 6, 11, 7, 9, 
    7, 5, 3, 10, 9, 6, 5, 7, 1, 4, 3, 7, 10, 10, 12, 8, 9, 12, 
    12, 8, 4, 10, 11, 12, 1, 1, 6, 11, 5, 5, 10, 2, 12, 10, 1, 
    11, 11, 4, 1, 10, 12, 1, 1, 4, 9, 12, 3, 3, 6, 11, 6, 5, 
    6, 12, 2, 3, 5, 8, 5, 6, 3, 1, 4, 2, 12, 2, 2, 3, 1, 5, 5, 
    10, 3, 10, 10, 2, 10, 2, 2, 7, 2, 4, 10, 8, 2, 11, 10, 12, 
    8, 5, 12, 5, 8, 3, 12, 12, 12, 9, 1, 10, 2, 10, 1, 1, 1, 
    10, 11, 1, 11, 1, 11, 10, 12, 12, 1, 3, 11, 1, 2, 10, 12, 
    11, 12, 11, 12, 2, 12, 4, 10, 12, 11, 10, 11, 12, 7, 10, 
    12, 11, 12, 10, 1, 10, 11), MONTH2 = c("February", "January", 
    "September", "June", "November", "July", "September", "July", 
    "May", "March", "October", "September", "June", "May", "July", 
    "January", "April", "March", "July", "October", "October", 
    "December", "August", "September", "December", "December", 
    "August", "April", "October", "November", "December", "January", 
    "January", "June", "November", "May", "May", "October", "February", 
    "December", "October", "January", "November", "November", 
    "April", "January", "October", "December", "January", "January", 
    "April", "September", "December", "March", "March", "June", 
    "November", "June", "May", "June", "December", "February", 
    "March", "May", "August", "May", "June", "March", "January", 
    "April", "February", "December", "February", "February", 
    "March", "January", "May", "May", "October", "March", "October", 
    "October", "February", "October", "February", "February", 
    "July", "February", "April", "October", "August", "February", 
    "November", "October", "December", "August", "May", "December", 
    "May", "August", "March", "December", "December", "December", 
    "September", "January", "October", "February", "October", 
    "January", "January", "January", "October", "November", "January", 
    "November", "January", "November", "October", "December", 
    "December", "January", "March", "November", "January", "February", 
    "October", "December", "November", "December", "November", 
    "December", "February", "December", "April", "October", "December", 
    "November", "October", "November", "December", "July", "October", 
    "December", "November", "December", "October", "January", 
    "October", "November")), row.names = c(1L, 2L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 
19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 
32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 
45L, 46L, 47L, 48L, 49L, 50L, 128126L, 128127L, 128128L, 128129L, 
128130L, 128131L, 128132L, 128133L, 128134L, 128135L, 128136L, 
128137L, 128138L, 128139L, 128140L, 128141L, 128142L, 128143L, 
128144L, 128145L, 128146L, 128147L, 128149L, 128150L, 128151L, 
128152L, 128153L, 128154L, 128155L, 128156L, 128157L, 128158L, 
128159L, 128160L, 128161L, 128162L, 128163L, 128164L, 128165L, 
128166L, 128167L, 128168L, 128169L, 128170L, 128171L, 128172L, 
128173L, 128174L, 128175L, 128176L, 353361L, 353362L, 353363L, 
353364L, 353365L, 353366L, 353367L, 353368L, 353369L, 353370L, 
353371L, 353372L, 353373L, 353374L, 353375L, 353376L, 353377L, 
353378L, 353379L, 353380L, 353381L, 353382L, 353383L, 353384L, 
353385L, 353386L, 353387L, 353388L, 353389L, 353390L, 353391L, 
353392L, 353393L, 353394L, 353395L, 353396L, 353397L, 353398L, 
353399L, 353400L, 353401L, 353402L, 353403L, 353404L, 353405L, 
353406L, 353407L, 353408L, 353409L, 353410L), class = "data.frame")

您需要更改您的 scale_color_manual 以从您的 cols_m 中为每个月选择合适的颜色:scale_color_manual(values=cols_m[MONTH])。您还可以使用 ggtitlemonth.abb 向量将月份名称添加到您的绘图中。因为你有深色背景,我也会更改 theme 中标题文本的颜色。

以下适合您的作品:

#function for pictures each month PER SPECIES####
spec_map_fu <- function(MONTH){

  gg + geom_point(data=eb[eb$MONTH==MONTH,], 
                        aes(x=LONGITUDE, y=LATITUDE, color=as.factor(MONTH)), 
                        size=0.5, alpha=0.5, show.legend = FALSE) +
    scale_color_manual(values=cols_m[MONTH]) +
    theme(strip.text.x = element_text(size=12, color="white", face="bold"), 
          strip.background = element_rect(fill="gray10"), 
          plot.background = element_rect(fill = "gray10"), 
          panel.background = element_rect(fill = "gray10"),
          plot.title = element_text(color="White", size=14, face="bold.italic")) +
    annotate("text", x = 60, y=-40, label = "ship", color="white") +
    facet_grid(. ~ COMMON.NAME) +
    ggtitle(month.abb[MONTH])

  print(paste0("saving plot", MONTH))
  ggsave(filename = sprintf("%02d.png", MONTH), dpi=100)

}

2 月的示例,标题和点在 cyan2 中(例如,请参见中间面板中的印度南部)。