указание определенных разрывов в легенде с помощью ggplot2 - PullRequest
2 голосов
/ 11 июля 2019
library(raster)
library(dplyr)
library(ggplot2)

get.shapefile.df <- function(shp.in, df.in, 
 region.var){
 require(sf)
 require(sp)
 require(plyr)
 require(ggplot2)
 shp.in@data$id <- rownames(shp.in@data)
 shp.in@data   <- plyr::join(shp.in@data, df.in, 
 by=region.var)
 mapa.df     <- fortify(shp.in)
 mapa.df     <- plyr::join(mapa.df, shp.in@data, 
  by="id")
  return(mapa.df)
 }

mybound <- getData('GADM', country='FRA', level=1)
myShp <- getData('GADM', country='FRA', level=2)
temp <- data.frame(NAME_2 = myShp$NAME_2, 
                   value = sample(1:100, 96))

tempShp <- get.shapefile.df(myShp, temp, 'NAME_2')

ggplot() +
  geom_polygon(data = subset(tempShp, !is.na('value')), aes_string(x = 'long', y = 'lat', group = 'group', fill = 'value')) +
  geom_path(data = mybound, aes(long, lat, group = group)) + coord_equal() +
  scale_fill_viridis_c(limits = c(0, 100),option = 'D') +
  xlab(NULL) + ylab(NULL) +
  theme(plot.title = element_text(size = 8, face = "bold")) +
  theme(legend.title = element_blank(),
        legend.margin=margin(0,0,0,0), legend.box.margin=margin(-10,-10,-10,-10))

enter image description here Моя проблема в том, что меня больше интересует анализ мелкомасштабных схем распределения значений от 1 до 10.Как я могу указать разрывы в легенде, которые могут быть как:

 legendBrks <- c(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 30, 50, 100)

РЕДАКТИРОВАТЬ

Я закончил делать это

 temp$cuts <- cut(temp$value, 
                 breaks = c(-Inf, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 30, 50, Inf), 
                 labels = c('0-1','1-2','2-3','3-4','4-5','5-6','6-7','7-8','8-9','9-10','10-15','15-20','20-30','30-50','50-100'))

tempShp <- get.shapefile.df(myShp, temp, 'NAME_2')

ggplot() +
 geom_polygon(data = subset(tempShp), 
           aes_string(x = 'long', y = 'lat', group = 'group', fill = 'cuts')) +
 geom_path(data = mybound, aes(long, lat, group = group)) + coord_equal() +
 viridis::scale_fill_viridis(name="", discrete=TRUE) +
 xlab(NULL) + ylab(NULL) +
 theme(plot.title = element_text(size = 8, face = "bold")) +
 theme(legend.title = element_blank(),
    legend.margin = margin(0,0,0,0), legend.box.margin = 
  margin(-10,-10,-10,-10))

enter image description here

1 Ответ

0 голосов
/ 11 июля 2019

Вы можете просто назначить breaks = legendBrks внутри scale_fill_viridis_c(), но это затрудняет чтение вашей легенды и выглядит не очень красиво.

Что я делаю, когда хочу исследовать шаблоны неравномерно распределенных данных в большом диапазоне, я их преобразую в лог. Таким образом, небольшие различия в нижней части диапазона становятся более заметными. Но тогда легче всего положиться на trans_breaks() для получения хороших перерывов в вашей легенде.

ggplot() +
  geom_polygon(data = subset(tempShp, !is.na('value')), aes_string(x = 'long', y = 'lat', group = 'group', fill = 'value')) +
  geom_path(data = mybound, aes(long, lat, group = group)) + coord_equal() +
  scale_fill_viridis_c(option = 'D', trans = "log2",  breaks = trans_breaks("log2", function(x) 2^x)) +
  xlab(NULL) + ylab(NULL) +
  theme(plot.title = element_text(size = 8, face = "bold")) +
  theme(legend.title = element_blank(),
        legend.margin=margin(0,0,0,0), legend.box.margin=margin(-10, 10,-10,- 10))

enter image description here

Может быть, это также и для ваших куколок.

...