Отображение дискретных и непрерывных шкал на одном ggplot

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

У меня есть некоторые потоковые данные ГИС, к которым прикреплены некоторые категориальные атрибуты, которые я могу построить (p1. в коде ниже ), чтобы получить: enter image description here

У меня также есть набор местоположений с непрерывным откликом, который я также могу построить (p2. в коде ниже ), чтобы получить: enter image description here Однако я не могу совместить два(p3в коде ниже ).Я получаю эту ошибку

Error in scales[[prev_aes]] : attempt to select less than one element

Комментирование строки scale_colour_hue("Strahler order") +меняет ошибку на

Error: Discrete value supplied to continuous scale

В основном кажется, что ggplot2 использует один и тот же тип шкалы (непрерывный или дискретный )для вызова geom_pathи вызовов geom_point. Поэтому, когда я передаю дискретную переменную factor(Strahler)в шкалу scale_colour_gradientn, график терпит неудачу.

Есть ли способ обойти это? Было бы замечательно, если бы у функции scales был аргумент data, чтобы сообщить ей, откуда она должна отображать или устанавливать атрибуты. Это вообще возможно?

Большое спасибо и воспроизводимый код ниже:

library(ggplot2)

### Download df's   ###
oldwd <- getwd(); tmp <- tempdir(); setwd(tmp)
url <- "http://dl.dropbox.com/u/44829974/Data.zip"
f <- paste(tmp,"\\tmp.zip",sep="")
download.file(url,f)
unzip(f)


### Read in data    ###
riv_df <- read.table("riv_df.csv", sep=",",h=T)
afr_df <- read.table("afr_df.csv", sep=",",h=T)
vil_df <- read.table("vil_df.csv", sep=",",h=T)


### Min and max for plot area   ###
xmin <- -18; xmax <- 3; ymin <- 4; ymax <- 15


### Plot river data ###
p1 <-   ggplot(riv_df, aes(long, lat)) + 
    geom_map( mapping = aes( long, lat, map_id = id ), fill = "white", data = afr_df, map = afr_df ) +
    geom_path( colour = "grey95", mapping = aes( long, lat, group = group, size = 1 ), data = afr_df ) +
    geom_path( aes( group = id, alpha = I(Strahler/6), colour = factor(Strahler), size = Strahler/6 ) ) +
    scale_alpha( guide = "none" ) +
    scale_colour_hue("Strahler order") +
    scale_x_continuous( limits = c( xmin, xmax ), expand = c( 0, 0 ) ) +
    scale_y_continuous( limits = c( ymin, ymax ), expand = c( 0, 0 ) ) +
    coord_map()
print(p1) # This may take a little while depending on computer speed...



### Plot response data  ###
p2 <- ggplot( NULL ) +
    geom_point( aes( X, Y, colour = Z), size = 2, shape = 19, data = vil_df ) +
    scale_colour_gradientn( colours = rev(heat.colors(25)), guide="colourbar" ) +
    coord_equal()
print(p2)



### Plot both together  ###
p3 <-   ggplot(riv_df, aes(long, lat)) + 
    geom_map( mapping = aes( long, lat, map_id = id ), fill = "white", data = afr_df, map = afr_df ) +
    geom_path( colour = "grey95", mapping = aes( long, lat, group = group, size = 1 ), data = afr_df ) +
    geom_path( aes( group = id, alpha = I(Strahler/6), colour = factor(Strahler), size = Strahler/6 ) ) +
    scale_colour_hue("Strahler order") +
    scale_alpha( guide = "none" ) +
    scale_x_continuous( limits = c( xmin, xmax ), expand = c( 0, 0 ) ) +
    scale_y_continuous( limits = c( ymin, ymax ), expand = c( 0, 0 ) ) +
    geom_point( aes( X, Y, colour = Z), size = 2, shape = 19, data = vil_df ) +
    scale_colour_gradientn( colours = rev(heat.colors(25)), guide="colourbar" ) +
    coord_map()
print(p3)
#Error in scales[[prev_aes]] : attempt to select less than one element

### Clear-up downloaded files   ###
unlink(tmp,recursive=T)
setwd(oldwd)

Привет,

Саймон

10
задан Community 23 May 2017 в 11:47
поделиться