2016-11-05 40 views
1

私はggplot2 "geom_raster"関数を使って2つのdata.frameを2つのレイヤーとしてプロットしようとしています。最上層にはNA値が含まれ、下の層を可視にするために「透明」に設定されています。 scale_fill_xxx機能を2回使用することができないように、私は(:ggplot2 - using two different color scales for overlayed plotsこの記事に基づく):次のコードを試してみた複数のレイヤーをggplot2でプロットする

library(ggplot2) 

df1 <- data.frame(x=rep(c(1,2,3),times=3), y=c(1,1,1,2,2,2,3,3,3), data= c(NA,4,9,NA,2,7,NA,NA,3)) 
df2 <- data.frame(x=rep(c(1,2,3),times=3), y=c(1,1,1,2,2,2,3,3,3), data= c(1,NA,NA,2,NA,NA,1,2,NA)) 

ggplot() + 
geom_raster(data=df1, aes(y= y, x= x, fill= data)) + 
scale_fill_gradientn(name="df1", colours=c("red", "blue"), na.value = "transparent") + 
geom_raster(data= df2, aes(y= y, x= x, colour= as.factor(data))) + 
scale_colour_manual(values = c("green", "black"), name= "df2", labels= c("Class 1", "Class 2"), na.value="transparent") 

ものは「色」/「scale_colour_manual」ソリューションは戻らないということです私が期待するもの(代わりに濃いグレーのプロットを返します)。私はdf1の "データ"列を赤色から青色のスケール(NAは透明でなければならない)で表現し、df2 "データ"列をクラス番号( "1" =緑、 "2" =黒)。

私の手技に何が間違っているのか理解できる人はいますか?ここで

+0

出力はどのように見えますか?現在 'sample()'を使って 'aes(fill =)'の "データ"を生成しています。これは 'set.seed()'で再現できません。 – Nate

+0

@NathanDayコメントありがとうございます。この例をより再現性のあるものに変更し、私の期待を明確にしました。 – rnd

+0

'geom_raster(color = ...)'は問題です。本当に 'fill'だけを尊重します – Nate

答えて

0

がソリューションです:

df3 = merge(df1, df2, by = c("x","y")) 
names(df3)[names(df3) == "data.x"] <- "data.1" 
names(df3)[names(df3) == "data.y"] <- "data.2" 
df3$data = df3$data.1 
df3$data[is.na(df3$data)] = df3$data.2[is.na(df3$data)] 

myGrad <- colorRampPalette(c('blue','red')) # color gradient 
min_value = min(df3$data[df3$data >2]) # minimum value except 1 and 2 
max_value = max(df3$data) # maximum value 
param = max_value - min_value + 1 # number of colors in the gradient 


ggplot(df3, aes(x, y, fill = data)) + geom_raster() + 
scale_fill_gradientn(colours=c("green","black", myGrad(param)), 
values = rescale(c(1, 2, seq(min_value, max_value, 1))), na.value = "transparent") 

3x3 picture

私はあなたがより高い値と範囲で、このプロットを使用すると思い、私は5x5の行列で試してみました:

set.seed(123) 
df4 = data.frame(x=rep(c(1,2,3,4,5),5), y=c(rep(1,5), rep(2,5), rep(3,5), rep(4,5), rep(5,5)), 
data = sample(c(1:20), 25, prob = c(0.2,0.2,rep(0.6/18,18)), replace = T)) 
min_value = min(df4$data[df4$data >2]) 
max_value = max(df4$data) 
param = max_value - min_value + 1 

ggplot(df4, aes(x, y, fill = data)) + geom_raster() + 
scale_fill_gradientn(colours=c("green","black", myGrad(param)), 
values = rescale(c(1, 2, seq(min_value, max_value, 1))), na.value = "transparent") 

enter image description here

関連する問題