ggplot2を使用して2つの異なる色スケール(1つは連続し、もう1つは異なるdfから1つ)を使用していくつかの異なるデータ項目をプロットしたいと思います。私は個々にどのようにしたいかを正確にプロットすることができますが、一緒に働かせることはできません。同じプロットで2つの異なる色のスケールを操作することはできないようですね。私は同様の質問hereとhereを見てきました。これは私が達成したいことはggplot2では不可能だと信じていましたが、私が間違っている場合は、問題があるかどうかを回避策。同じggplotに離散と連続の縮尺をプロットする
私は私が取得する(下記のコードでp1
)をプロットすることができ、それに接続いくつかのカテゴリ属性を持っているいくつかのGISストリームデータを持っている:
私も連続応答を持っている位置のセットを持っています(p3
)を得ることができます: しかし、私は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)
乾杯、
サイモン
問題はそれほど複雑ではありませんあなたが考えるかもしれないように。一般的には、美的なものは一度しかマップできません。したがって、 'scale_colour_ * 'を2回呼び出すことは** ggplot2 **には意味がありません。それは一方を他方に強制しようとします。 – joran
@joran現在、データフレームからの1つの色の美学を連続的なスケールに、別の色の美学を別のデータフレームから離散的なスケールにマッピングする方法はありませんか?スケールにデータを指定することができれば、それは便利でしょうか? –
連続グラフでも離散グラフでも、同じグラフ内に複数の色スケールを持つことはできません。パッケージ作成者は、これを追加するつもりはないと言いました。実装するのがむしろ複雑で、非常に混乱しやすいグラフを作成するのが簡単すぎます。 (同様の理由で複数のy軸が決して実装されることはありません) – joran