微生物屋のノート

プログラミング・解析関連についてのノートです。

ggplot2 で追加のscale_color / scale_fillを指定する方法

とても便利なのに、日本語サイトで見ないのでメモを兼ねて書きます。

よく ggplot2 を使っていると、geom_point と geom_bar で、違うcolor_scale を指定したいことがあると思います。また、色の指定の際に、連続値(continuous scale) と離散値(discrete scale)の両方を使うとエラーが出てしまいます。

それを解決してくれるのが以下のパッケージです。

eliocamp.github.io

使い方はとても簡単で、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)にも対応していそうです。