2012-07-16 71 views
10

ggplot2を使用して2つの異なる色スケール(1つは連続し、もう1つは異なるdfから1つ)を使用していくつかの異なるデータ項目をプロットしたいと思います。私は個々にどのようにしたいかを正確にプロットすることができますが、一緒に働かせることはできません。同じプロットで2つの異なる色のスケールを操作することはできないようですね。私は同様の質問herehereを見てきました。これは私が達成したいことはggplot2では不可能だと信じていましたが、私が間違っている場合は、問題があるかどうかを回避策。同じggplotに離散と連続の縮尺をプロットする

私は私が取得する(下記のコードでp1)をプロットすることができ、それに接続いくつかのカテゴリ属性を持っているいくつかのGISストリームデータを持っている: enter image description here

私も連続応答を持っている位置のセットを持っています(p3)を得ることができます: enter image description here しかし、私は2つを組み合わせることはできません。私はラインscale_colour_hue("Strahler order") +をコメントアウト

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

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) 

乾杯、

サイモン

+1

問題はそれほど複雑ではありませんあなたが考えるかもしれないように。一般的には、美的なものは一度しかマップできません。したがって、 'scale_colour_ * 'を2回呼び出すことは** ggplot2 **には意味がありません。それは一方を他方に強制しようとします。 – joran

+0

@joran現在、データフレームからの1つの色の美学を連続的なスケールに、別の色の美学を別のデータフレームから離散的なスケールにマッピングする方法はありませんか?スケールにデータを指定することができれば、それは便利でしょうか? –

+1

連続グラフでも離散グラフでも、同じグラフ内に複数の色スケールを持つことはできません。パッケージ作成者は、これを追加するつもりはないと言いました。実装するのがむしろ複雑で、非常に混乱しやすいグラフを作成するのが簡単すぎます。 (同様の理由で複数のy軸が決して実装されることはありません) – joran

答えて

9

これは可能です。グリッドグラフィックスに1つのプロットを重ね合わせるように指示する必要があります。 にはがあり、余白や間隔などはとなります。ちょうどです。トップレイヤーの透明性について考える必要があります。要するに... それは価値がない。おそらくプロットを混乱させるだけでなく、

しかし、私はこれを達成する方法についての指針が好きかもしれないと思っていました。 N.B.

grid.newpage() 
pushViewport(viewport(layout = grid.layout(1 , 1 , widths = unit(1 , "npc")))) 
print(p1 + theme(legend.position="none") , vp = viewport(layout.pos.row = 1 , layout.pos.col = 1)) 
print(p2 + theme(legend.position="none") , vp = viewport(layout.pos.row = 1 , layout.pos.col = 1)) 

グリッドレイアウト上の別の位置に伝説を追加する方法のための私の答えhereを参照してください:私は、彼らが不透明以下の要素がないように透明な上部のプロット内の要素を作るためにcode from this gistを使用しました。

enter image description here

5

問題は、あなたが考えるほど複雑ではありません。一般的には、美的なものは一度しかマップできません。したがって、scale_colour_*を2回呼び出すと、ggplot2には意味がありません。それは一方を他方に強制しようとします。

連続グラフでも離散グラフでも、同じグラフ内に複数の色の目盛を設定することはできません。パッケージ作成者は、これを追加するつもりはないと言いました。実装するのがむしろ複雑で、非常に混乱しやすいグラフを作成するのが簡単すぎます。 (同様の理由で、複数のy軸が決して実装されることはありません)。

1

は、私は完全な作業例を提供するために、現時点ではありませんが、ここで言及されるに値するこれを行うための別の方法があります:基本的にFill and border colour in geom_point (scale_colour_manual) in ggplot

はでgeom_pointを使用して、 shape = 21, color = NAと組み合わせると、color審美的ではなく、fillを使用して一連の点の色を制御することができます。これは私のコードがどのように見えるかです。私はありませんデータがありませんことを理解し、うまくいけば、それは出発点を提供します:geom_pointへの各呼び出しは異なる美的を起動する方法

biloxi + 
    geom_point(data = filter(train, primary != 'na'), 
      aes(y = GEO_LATITUDE, x = GEO_LONGITUDE, fill = primary), 
      shape = 21, color = NA, size = 1) + 
    scale_fill_manual(values = c('dodgerblue', 'firebrick')) + 
    geom_point(data = test_map_frame, 
      aes(y = GEO_LATITUDE, x = GEO_LONGITUDE, color = var_score), 
      alpha = 1, size = 1) + 
    scale_color_gradient2(low = 'dodgerblue4', high = 'firebrick4', mid = 'white', 
        midpoint = mean(test_map_frame$var_score)) 

お知らせ(colorまたはfill

関連する問題