我想使用 ggplot2 绘制一些不同的数据项,使用两种不同的色标(一个连续的,一个来自两个不同 df 的离散)。我可以单独绘制我想要的任何一个,但我不能让它们一起工作。似乎您不能在同一个情节中使用两种不同的色标?我在这里和这里看到了类似的问题,这让我相信我想要实现的目标在 ggplot2 中根本不可能,但以防万一我错了,我想说明我的问题,看看是否有变通方法。
我有一些 GIS 流数据,其中附加了一些分类属性,我可以绘制(p1
在下面的代码中)来获得:
我还有一组具有连续响应的位置,我也可以绘制(p2
在下面的代码中)来获得:
但是我不能将两者结合起来(p3
在下面的代码中)。我收到这个错误
比例错误[[prev_aes]]:尝试选择少于一个元素
注释掉该行scale_colour_hue("Strahler order") +
会将错误更改为
错误:提供给连续刻度的离散值
基本上,似乎 ggplot2 对geom_path
调用和geom_point
调用使用相同的比例类型(连续或离散)。因此,当我将离散变量 , 传递 factor(Strahler)
给scale_colour_gradientn
比例时,绘图失败。
有没有解决的办法?data
如果scales 函数有一个参数来告诉它应该从哪里映射或设置属性,那就太棒了。这甚至可能吗?
非常感谢和可重现的代码如下:
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)
干杯,
西蒙