1

I have spatial-temporal data of migrating species and I want to make a GIF showing their movement throughout the year on a monthly basis. I'm using this code to produce a picture for each month:

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)

I'd like to have the color of the points change according to which month is plotted as set in cols_m, however only the first color is used for all twelve plots. How can I make it so that in the end I have a picture for each month using the different colors I set?

Bonus question: How can I add the respective name of the month to the plot above the species names?



Example data made with 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")
M--
  • 25,431
  • 8
  • 61
  • 93
Gotemn
  • 29
  • 9
  • 1
    You should provide a [***minimal*** reproducible example](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Do not dump all your data here. – M-- Mar 13 '20 at 17:23
  • I minimalized it as best as I could, this is not my whole script. I didn't include the `dput()` output in the code since that would make it much harder to read, but apart from that it's completely reproducible with a single copy&paste. I'm sorry if I'm not doing this perfectly, but I'm just starting to teach myself using R – Gotemn Mar 16 '20 at 15:16
  • 1
    Just to give you some hint about minimal example. You are dealing with changing colors for each month, so you can just post data for two month and any solution for that works for 12 month as well. Besides, you can decrease number of points in each month to even share a smaller dataset. Hope my answer helps. Cheers. – M-- Mar 21 '20 at 20:32

1 Answers1

1

You need to change your scale_color_manual to take the appropriate color from your cols_m for each month: scale_color_manual(values=cols_m[MONTH]). You can also use ggtitle along with month.abb vector to add month name to your plots. Bevause you have a dark background, I would change the color of title text in theme as well.

Following works for you:

#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)

}

An example for February with title and points in cyan2 (see the south of India in the middle panel for instance).

M--
  • 25,431
  • 8
  • 61
  • 93