установка фиксированной шкалы для отдельных графических серий на ggplot2 / ggmap - PullRequest
0 голосов
/ 09 апреля 2019

Я сделал серию карт для ежемесячной заболеваемости. Идея состоит в том, чтобы сделать подарок. Проблема в том, что каждый сюжет создавался независимо со своим масштабом. Я использую Viridis в этом случае. Есть ли способ сохранить одинаковый масштаб и диапазоны для всех графиков, даже если конкретный месяц (один график) не имеет данных по этим шкалам?

Вот что я сделал:

library(ggmap)
library(sp)

murder <- subset(crime, offense == "murder")

murder <- SpatialPointsDataFrame(murder[,c("lon", "lat")], data=murder,
                                 proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))

p <- ggmap(get_stamenmap(bbox=c(left=min(murder$lon), bottom=min(murder$lat),
                                right=max(murder$lon), top=max(murder$lat)), zoom=12))

d <- unique(murder$month)

murder <- murder[!(murder$month=="january" & murder$hour>0 & murder$hour<17),]
murder <- murder[!(murder$month=="february" & murder$hour>110 & murder$hour<24),]
murder <- murder[!(murder$month=="march" & murder$hour>12 & murder$hour<17),]


for (i in d){
  murder2 <- murder[murder$month==i,]
  mapa <- p +
    geom_point(data=murder2@data, 
               aes(x=murder2@coords[,1], y=murder2@coords[,2], color=as.numeric(hour)), 
               alpha=0.5,size=7) +
    scale_color_viridis_c(option="C",breaks=c(0,2,4,8,12,16,20,23),
                          labels=c("00:00","02:00", "04:00","08:00","12:00","16:00","20:00","23:00"),
                          name="Hour",
                          guide=guide_legend( keyheight = unit(3, units = "mm"), 
                                              keywidth=unit(6, units = "mm"),
                                              label.position = "bottom", title.position = 'top', nrow=1,
                                              label.theme=element_text(size = 6,face = "bold",color = "grey2",family = "Gotham"),
                                              title.theme=element_text(size = 6,face = "bold",color = "grey2",family = "Gotham", hjust=0.5)
                          ))
  ggsave(filename=paste0(i,".png"),plot=mapa, bg="transparent", 
         width =15, height = 15, units="cm", dpi=200)
}

Это мои результаты. Первый график (с марта) имеет 8 значений в своей шкале, а второй график (с февраля) имеет только 2:

Mar

Feb

Я хочу одинаковые 8 значений для каждой карты. даже если в этих значениях нет наблюдений.

1 Ответ

2 голосов
/ 10 апреля 2019

Попробуйте заменить код внутри цикла for следующим.Пояснения в комментариях:

# there's lat / lon info in the data file, no need to reference coords separately
murder2 <- murder[murder$month==i, ]@data 

# define hour as a factor here, with the same ranges & labels, for each loop
murder2$hour <- cut(murder2$hour, 
                    breaks = c(0, 2, 4, 8, 12, 16, 20, 23, 25), 
                    labels = c("00:00", "02:00", "04:00", "08:00", 
                               "12:00", "16:00", "20:00", "23:00"),
                    right = FALSE)

mapa <- p +
  geom_point(data = murder2,
             aes(x = lon, y = lat, color = hour)) +
  scale_color_viridis_d(option = "C", 
                        name = "Hour", 
                        drop = FALSE, # keeps unused levels in the legend
                        guide = guide_legend(keyheight = unit(3, units = "mm"), 
                                             keywidth = unit(6, units = "mm"),
                                             label.position = "bottom", 
                                             title.position = 'top', 
                                             nrow = 1,
                                             label.theme = element_text(size = 6, face = "bold",
                                                                        color = "grey2",
                                                                        family = "Gotham"),
                                             title.theme = element_text(size = 6, face = "bold",
                                                                        color = "grey2",
                                                                        family = "Gotham", 
                                                                        hjust=0.5)))
ggsave(filename = paste0(i,".png"), plot = mapa, bg = "transparent",
       width = 15, height = 15, units="cm", dpi = 200)

Отдельно, если конечной целью является создание анимированного GIF, вы можете вместо этого проверить пакет gganimate.Он автоматизирует большую часть работы по переходу между различными состояниями.

...