ggplot2 で追加のscale_color / scale_fillを指定する方法
とても便利なのに、日本語サイトで見ないのでメモを兼ねて書きます。
よく ggplot2 を使っていると、geom_point と geom_bar で、違うcolor_scale を指定したいことがあると思います。また、色の指定の際に、連続値(continuous scale) と離散値(discrete scale)の両方を使うとエラーが出てしまいます。
それを解決してくれるのが以下のパッケージです。
使い方はとても簡単で、scale_color_,,, の後に、new_scale() を追加するだけです。
使用するパッケージを読みこみます
library(ggplot2) library(ggnewscale) ## 新しくscaleを追加するためのパッケージ library(tidyr)
テストデータを作成。
site=10 sp=5 # サンプル×種の表 mat = matrix(runif(site*sp), nrow=site, ncol=sp, dimnames=list(paste('S', formatC(1:site,width=2,flag="0"), sep='_'), paste('Sp', formatC(1:sp,width=2,flag="0"), sep='_'))) # 環境データ env = data.frame('Sample' = rownames(mat), 'Env1' = as.integer(runif(site, 0, 2)), 'Env2' = as.integer(runif(site, 0, 4)), row.names = rownames(mat)) # 2つの表を引っ付ける df <- cbind(env, mat) # ggplot2 を使うため、ロングフォーマットになおす。 lf <- gather(df, key, value, -c(1:ncol(env)))
バープロットの作成
bar_color <- c("firebrick", "skyblue3", "forestgreen", "darkorange", "aliceblue") bar1 = ggplot(lf, aes(x=Sample))+ geom_bar(aes(y=value, fill=key), stat='identity')+ geom_point(aes(y=Env1, fill=Env1), shape=21, # fill を使いためpoint の形を変更 stroke=0.3# 枠線の太さ )+ scale_fill_manual(values=bar_color)
ここで、geom_point を環境の値によって色を変えたいのですが、連続値(環境変数)と離散値(種名)を入れているため、以下のようなエラーが出ます。
Error: Continuous value supplied to discrete scale
次に、new_scale 関数を使用します。
bar_color <- c("firebrick", "skyblue3", "forestgreen", "darkorange", "aliceblue") bar1 = ggplot(lf, aes(x=Sample))+ geom_bar(aes(y=value, fill=key), stat='identity')+ scale_fill_manual(values=bar_color)+ ## <- ここでバープロット用のscale_fill を指定 ggnewscale::new_scale_fill()+ ## <- geom_pointの前にnew_scale_fill を挟む geom_point(aes(y=Env1, fill=Env1), shape=21, stroke=0.3 )+ scale_fill_gradient2() ## <- geom_pointの用のscale_fill を指定
以下の図が作成できます。
離散値と連続値の色を指定できるようになるのは、とても便利ですね。
また、色以外の scale (scale_size、scale_shape)にも対応していそうです。