2016-04-15 1 views
0

У меня есть dataframe с именем myKrige_new содержит несколько интерполяционных значений по широте-longutude. Вы можете скачать с HERE. Я изобразил эти значения на определенный участке карты страны с помощью ggplot2 пакета в R, и я получил этот участок enter image description hereКак создать легенду (непрерывную цветовую панель) на основе определенного диапазона значений в R/ggplot2?

Но я хочу легенду (colourbar) мой участок будет как следующая легенда.

enter image description here

В моем наборе данных здесь, диапазон данных (пред) составляет от 72 до 257. Но я хочу, чтобы моя легенда будет показывать значение от 0 до 200 из-за сравнения с другими причинами сюжетом, хотя там нет значения под 72 здесь.

Итак, я хочу использовать 20 разных цветов, как указано выше, что означает, что последний поле легенды будет содержать цвет, имеющий значение больше 200. Я использовал функцию scale_fill_gradientn, но это не сработало. Я провел несколько дней, чтобы найти какой-то вариант сделать это в R, не получил успеха. Любая помощь будет очень заметной.

R Код:

library(scales) 
library(ggplot2) 

myKrige_new <- read.csv ("myKrige_new.csv") 

range(myKrige_new$LON) 
range(myKrige_new$LAT) 

#Original skorea data transformed the same was as myKrige_new 
skorea1 <- getData("GADM", country= "KOR", level=1) 
skorea1 <- fortify(skorea1) 
myKorea1 <- data.frame(skorea1) 

############### 
ggplot()+ 
    theme_minimal() + 
    #SOLUTION 1: 
    #geom_tile(data = myKrige_new, aes(x= LON, y= LAT, fill = pred)) + 

    #SOLUTION 2: Uncomment the line(s) below: 
    #geom_point(data = myKrige_new, aes(x= LON, y= LAT, fill = pred), 
    #shape=22, size=8, colour=NA)+ 

    #Solution 3 
    stat_summary_2d(data=myKrige_new, aes(x = LON, y = LAT, z = pred),bins = 30, 
        binwidth = c(0.05,0.05)) + 

    scale_fill_gradientn(colours=c("white","blue","green","yellow","red"), 
         values=rescale(c(0,50,100,150,200)), 
         guide="colorbar", name = "PM10 Conc")+ 
    geom_map(data= myKorea1, map= myKorea1, aes(x=long,y=lat,map_id=id,group=group), 
      fill=NA, colour="black") + 

    coord_cartesian(xlim= c(126.6, 127.2), ylim= c(37.2 ,37.7)) + 
    labs(title= "PM10 Concentration in Seoul Area at South Korea", 
     x="", y= "")+ 
    theme(legend.position = "bottom")+ 
    guides(fill = guide_colourbar(barwidth = 27, barheight = NULL, 
           title.position = "bottom", title.hjust = 0.5)) 
+0

Набор 'scale_fill_gradientn (..., руководство легенда =» ', ...) 'вместо' colorbar', хотя результат немного отличается от geom. – alistaire

+0

Извините, я не могу понять! На самом деле я хочу показать разный цвет для разных диапазонов значений, а легенда будет показывать диапазон цветов от 0 до 200. – Orpheus

ответ

3

Вот рабочий раствор:

library(scales) 
library(ggplot2) 
library(raster) # needed for the `getData` function 
library(dplyr) # needed for the `mutate` funtion 

myKrige_new <- read.csv("~/Downloads/myKrige_new.csv")[-1] 

range(myKrige_new$LON) 
range(myKrige_new$LAT) 

# Original skorea data transformed the same was as myKrige_new 
skorea1 <- getData("GADM", country= "KOR", level=1) 
skorea1 <- fortify(skorea1) 
myKorea1 <- data.frame(skorea1) 

# the range of pred goes above 200 (max = 257) 
summary(myKrige_new$pred) 

ggplot() + 
    theme_minimal() + 
    stat_summary_2d(data = mutate(myKrige_new, 
           pred = ifelse(pred > 200, 200, pred)), 
        aes(x = LON, y = LAT, z = pred), 
        bins = 30, 
        binwidth = c(0.05,0.05)) + 
    scale_fill_gradientn(colours=c("white","blue","green","yellow","red"), 
         values=rescale(c(0,50,100,150,200)), 
         name = expression(paste(PM[10], group("[",paste(mu,g/m^3), "]"))), 
         limits = c(0,200), 
         breaks = seq(0,200, 20), 
         guide = guide_colorbar(nbin = 20, 
               barwidth = 27, 
               title.position = "bottom", 
               title.hjust = 0.5, 
               raster = FALSE, 
               ticks = FALSE)) + 
    geom_map(data= myKorea1, 
      map= myKorea1, 
      aes(x=long,y=lat,map_id=id,group=group), 
      fill=NA, 
      colour="black") + 
    coord_equal(xlim= c(126.6, 127.2), 
       ylim= c(37.2 ,37.7)) + 
    scale_y_continuous(expand = c(0,0)) + 
    scale_x_continuous(expand = c(0,0)) + 
    labs(title = "PM10 Concentration in Seoul Area at South Korea", 
     x = "", 
     y = "") + 
    theme(legend.position = "bottom") 

Я добавил limits = c(0,200) и breaks = seq(0, 200, 20) к scale_fill_gradientn, а также nbin = 20 к guide_colorbar, это последнее изменение не является обязательным, так как по умолчанию nbin составляет 20, но в вашем случае вам действительно нужно 20. Кроме того, добавление limits означает, что значения вне диапазона отображаются в grey50, поэтому Мне пришлось преобразовать значения pred значений выше 200-200, чтобы избежать этого; интерпретация красного цвета теперь составляет 200+.

Еще одна вещь, опция raster в guide_colorbar изменяет цветную панель от растрового объекта до набора прямоугольников, достигая вида, который вы искали.

Наконец, я изменил систему координат от декартовой на равную, потому что вы рисуете карту.

Вот результат надеюсь, что это помогает:

korea

Update: добавлена ​​expand аргумент scale_y_continuous и scale_x_continuous по просьбе OP

+0

wow! Большое спасибо donlelek! если вы не возражаете, еще одна вещь, с которой я борюсь. Вы можете видеть, что часть карты простиралась за пределы моего участка справа и внизу. Есть ли способ удалить/отрезать эту расширенную часть? – Orpheus

+0

Привет @Orpheus, просто отредактировав ответ для решения этой проблемы, вы должны включить 'expand = c (0,0)' в ось, которую хотите обрезать. – donlelek

+0

Дорогой @donleke, Как я могу добавить текст на этом сюжете? Я хочу написать «PM10 [мкг/м3]: 2012/03/28/23 KST» на моем сюжете. (10 и 3 в PM10 и m3 будут индексом).Я пробовал вот так: 'annotate (" text ", label = expression (paste (PM [10], group (" [", paste (mu, g/m^3),"] ")): 2012/03/28/23 ~ KST), x = 311000, y = 4173500, size = 6, color = "white", fontface = c ("bold")) ', но это дало мне ошибку: invalid 'type' (expression) аргумента' – Orpheus

 Смежные вопросы

  • Нет связанных вопросов^_^