ggplot2 (グラフ描画)

Rの標準のplotよりも,文法構造がわかりやすい。

参考リンク

準備

install.packages("tidyverse")
library(tidyverse)

基本

データはtidy dataにしておく。

p<-ggplot(data) +
	geom_line(mapping=aes(x=time,y=temperature))
  • ggplot()
    • グラフ描画のレイヤーを重ねることができる座標系を作るための宣言
    • 引数はグラフ描画に使うデータ。
  • geom_なんとか()
    • グラフのレイヤーを作る
    • geom_line(), geom_point(),他にもいろいろある
    • aes()を使って,各座標軸に対応する列名や,描画色等を指定

なにかの量の平均(mean)と標準偏差(sd)の列があれば,mean±SDの領域の描画もできる。

p<-ggplot(data) %>%
	geom_line(aes_string(x=time,y=mean))
q<-geom_ribbon(aes_string(x=mean, ymin=mean-sd, ymax=mean+sd), alpha=0.2)

print(p+q)

上記のようにグラフレイヤの重ね合わせは足し算でできる。

いろんなグラフを作るための関数一覧(cheatsheet)は ggplot2にある。

複数のグラフを並べて配置する

参考URL

複数のグラフを並べて配置する

multiplot()を使う

とりあえず何列かに整列させれば良いときはこれが便利。

install.packages("Rmisc")
library(Rmisc) 

ただし,Rmiscはtidyverseより先に読み込むこと。 Rmiscを後に読み込むと,tplyr::summariseがRmisc::summariseで上書きされてしまう。

multiplot(g1,g2,g3,g4,cols=2) # 2列に並べる
multiplot(g1,g2,g3,cols=2,layout=c(1,2,3,3)) # 上半分にg1とg2, 下半分にg3

cowplotライブラリを使う

cowplotはggplot2のアドオンパッケージ。 “The cowplot package is meant to provide a publication-ready theme for ggplot2"とのことで,綺麗なテーマ設定を使える。特に,グラフ配置機能も充実。

library(tidyverse)
library(cowplot)

facet_grid()を使う

ggplot2純正の方法。個々のグラフにラベルを張ったり,同じグラフをすべてのグラフに重ねたり等にはfacet_wrapper()が便利。

gridExtraライブラリを使う

ggpubrライブラリのfacetを使う

ggpubrは,ggplot2のwrapperで, 名称は”‘ggplot2’ Based Publication Ready Plots"の省略形。 ggplot2よりも簡単にグラフ作成ができる。 また,ggpubrfacet使うと,座標軸の位置やタイトル位置を揃えたりできる。

その他いろいろ

jupyter notebook/lab 上のグラフ描画領域設定

options(repr.plot.width=8, repr.plot.height=4)
ggplot(...)+...

これでjupyter上でのグラフの大きさや余白を調整できる。

列名を表す文字列を軸名にする

draw_graph<-function(data,xcol="xname",ycol="yname",group="city"){
	data %>% ggplot() +
		plot_line(aes_string(x=xcol,y=ycol,group=group,color=group))
}

aes_string()のかわりにaes_q()を使う方法もある。

aes_q(x=as.name(xcol),y=as.name(group))

ただし,group分けに使う列がnumericだと,gradient colormapしか使えなくい。 無理やり discrete colormap を与えようとすると”Error: Continuous value supplied to discrete scale”と怒られる。group情報のある列をcharacterに変換しておくのが,多分一番簡単。

q<- data %>% 
	mutate_at(vars(matches(group)),as.character)  %>%
	ggplot() %>%
	geom_line(mapping=aes_string(x=xcol,y=ycol,group=group,color=group))

aes() と aes_string()を両方使えるようにする

`+.uneval` <- function(a,b) {
    `class<-`(modifyList(a,b), "uneval")
}

ここにあった方法。 aes()+aes_string()とでようになる。

複数の列データを一つのグラフ上に表示する

データに,異なる線であることを判別できる列を作っておく。 気温変化データに(city,time,temerature)のデータ列があって, 都市(city) ごとに異なる線を描くには以下のようにする。

p<-data %>% arrange(city,time) %>%
	ggplot() %>%
	plot_line(aes_string(x=time,y=temperature,group=city,color=city))
print(p)

複数のtidyデータから作るグラフを同一グラフ上に表示

p<-ggplot(data1) +
	 geom_line(aes_string(x=time,y=temperature))
p2<-geom_line(data2, mapping=aes(x=time,y=humidity))
print(p1+p2)

アニメーションを作る

方法1: gganimateを使う。

方法2: plotlyの関数animation_opts()を使う。

参考URL

関連リンク