13

ggplot2 を使用して、2 つの異なるカラー スケール (2 つの異なる df からの連続と離散) を使用して、いくつかの異なるデータ項目をプロットしたいと思います。個別に希望どおりにプロットすることはできますが、それらを一緒に機能させることはできません。同じプロットで 2 つの異なるカラー スケールを操作することはできないようですか? 私はここここで同様の質問を見てきました。これにより、私が達成したいことは単にggplot2では不可能であると信じるようになりましたが、間違っている場合に備えて、私の問題を説明して、回避策。

いくつかのカテゴリ属性が関連付けられた GIS ストリーム データがいくつかあります。これを (p1以下のコードで) プロットして取得できます。 ここに画像の説明を入力

また、連続応答を持つ一連の場所もあり、プロットして (p2以下のコードで) 取得することもできます: ここに画像の説明を入力 ただし、2 つを組み合わせることはできません (p3以下のコードで)。このエラーが発生します

scales[[prev_aes]] のエラー: 1 つ未満の要素を選択しようとしています

行をコメントアウトするとscale_colour_hue("Strahler order") +、エラーが次のように変わります

エラー: 連続スケールに離散値が指定されました

基本的に、ggplot2 はgeom_path呼び出しと呼び出しに同じスケール タイプ (連続または離散) を使用しているようgeom_pointです。したがって、離散変数 を factor(Strahler)スケールscale_colour_gradientnに渡すと、プロットは失敗します。

これを回避する方法はありますか?datascales 関数に、どこから属性をマッピングまたは設定するかを伝える引数があれば、驚くべきことです。これは可能ですか?

以下の多くの感謝と再現可能なコード:

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)

乾杯、

サイモン

4

3 に答える 3

5

問題は、あなたが思っているほど複雑ではありません。一般に、美学をマッピングできるのは 1 回だけです。したがってscale_colour_*、ggplot2 では 2 回呼び出しても意味がありません。一方を他方に押し込もうとします。

いずれかが連続か離散かに関係なく、同じグラフに複数のカラー スケールを含めることはできません。パッケージの作成者も、これを追加するつもりはないと言っています。実装するのはかなり複雑で、非常に紛らわしいグラフを簡単に作成してしまいます。(同様の理由で、複数の y 軸は実装されません。)

于 2012-10-19T13:03:45.063 に答える