画像を使った魅せるグラフの2つの例(ggplot2)

IrisScatterPlot.png
author: Mr.Unadon
動作環境:Mac OS Sierra 10.12.1; R version3.3.1; rstan 2.10.1
 

はじめに


Rを使えば、画像を使った様々なグラフを描くことができます。

グラフの目的は伝えること。

シンプルで、美しく、直感的に分かる、そんなグラフはとっても魅力的です。

このとき、画像をうまく使うことができれば、

グラフをより美しく、より直感的なものに仕上げられると考えられます。



日本における画像+グラフの課題


しかしながら本邦では、次のような誤解が蔓延しています(たぶん)。

「Rで画像って、”タカヤナギ=サン”を描画するやつでしょ?」

僕も、ついさっきまでそう思っていました(本当に)。

代表作がこちらです(引用元)。

takayanagi_san.png
Figure.1 タカヤナギ=サン


「あ、”タカヤナギ=サン”だ!」とわかる、とてもシンプルで、直感的なグラフです。


素敵ですね(初めて見た時爆笑しました)。

この作品ホント大好きなんですが、

今回はタカヤナギ=サンを使わない描画例をご紹介致します。

使用するパッケージはggplot2。

詳細な解説記事は、こちらをご参照ください。



アヤメの画像 + Iris Scatter Plot


さて、 まずは画像+散布図の例をご紹介します。

これまで散々plotされてきたIrisを、アヤメの画像とともに出力してみましょう。

簡単な説明をコメントとしてコードにふしております。

なお、途中でggThemeAssistというワードが出てきますが、使い方はこちらをご参照ください。

とっても簡単にggplotの調整ができるパッケージ(Addin)です。

invisible({rm(list=ls());gc();gc()})
#####################################################
# ggplot2 + image: sample graphics
# Author: Mr.Unadon
#####################################################

library(tidyverse) #データ成形系パッケージ群(ggplot2も入ってる)
library(png) #pngファイルの読み込みや書き出し

#グラフテーマの初期設定
ggplot()+theme_set(theme_light(base_size = 14,base_family = "Hiragino Mincho Pro W3"))


#
# Irisの散布図+image
#


#画像のダウンロード
download.file("mrunadon.github.io/images/ayame.png", destfile = "ayame.png")

#カラーパレットの用意
Colors=c("#CFC1F7", "#FFFFFF", "#C9F0CF")

#画像の読み込み
irisImage<-png::readPNG("ayame.png")

#ggplot
gg1<-ggplot(iris,aes(x=Sepal.Length,y=Petal.Length,colour=Species)) + #x軸y軸と色の塗り分け指定
    annotation_raster(irisImage, -Inf, Inf, -Inf, Inf)+#画像の表示、xy軸一杯に図を表示
    geom_vline(xintercept = c(5,6,7,8),linetype=1,size=0.3,colour="gray60")+ #図の上にgrid縦線
    geom_hline(yintercept = c(2,4,6),linetype=1,size=0.3,colour="gray60")+#図の上にgrid横線
    geom_vline(xintercept = c(4.5,5.5,6.5,7.5),linetype=2,size=0.2,colour="gray50")+ #図の上にgrid縦線(linetype=2:点線)
    geom_hline(yintercept = c(3,5),linetype=2,size=0.2,colour="gray50")+#図の上にgrid横線(linetype=2:点線)
    geom_point(size=3,alpha=0.7)+ #ここで散布図の点を
    geom_text(aes(x=5.5,y=6),label="Virginica",size=10,family='Hiragino Mincho Pro W3',colour="#C9F0CF")+ #アヤメ種の名前
    geom_text(aes(x=7.0,y=3.6),label="Versicolor",size=10,family='Hiragino Mincho Pro W3',colour="#FFFFFF")+#アヤメ種の名前
    geom_text(aes(x=6.5,y=1.5),label="Setosa",size=10,family='Hiragino Mincho Pro W3',colour="#CFC1F7")+#アヤメ種の名前
    scale_colour_manual(values = Colors)+

#ggThemeAssistantを使って以下は調整したもの
    theme(plot.subtitle = element_text(family = "serif", 
    vjust = 1), plot.caption = element_text(vjust = 1), 
    axis.title = element_text(family = "serif", 
        size = 16), axis.text = element_text(family = "serif", 
        size = 14), plot.title = element_text(family = "serif", 
        size = 22), legend.text = element_text(family = "serif", 
        colour = "gray95"), legend.title = element_text(family = "serif", 
        colour = "gray95"), legend.key = element_rect(fill = "gray40"), 
    legend.background = element_rect(fill = "gray40"), 
    legend.position = "bottom", legend.direction = "horizontal") +labs(title = "Iris Scatter plot: petal and sepal length", 
    subtitle = "Iris is a genus of about 260–300, species of flowering plants with showy flowers.
    It takes its name from the Greek word for a rainbow, 
    which is also the name for the Greek goddess of the rainbow, Iris. ")

plot(gg1)

IrisScatterPlot.png
Figure.2 アヤメの花弁とがく片の長さの散布図(種別)


まぁまぁ、いい感じですね。



ベリーの画像+折れ線グラフ


いま睡魔と戦っていますが、もういっちょ、行きます。

次は折れ線グラフと画像をつかったもの。

グラフ分割のfacet_wrap()や帯の描画geom_ribbon()を組み合わせました。

乱数データでミックスベリーの廃棄率的な、

なにかそういう適当なデータを作って、時系列グラフを出してみます。

#
#  Mix Berry Example (乱数でデータ生成)
#

#画像のダウンロード
download.file("mrunadon.github.io/images/fruit_rouge.png", destfile = "fruit_rouge.png")

#画像の読み込み
fruit_rouge<-png::readPNG("fruit_rouge.png")

#カラーパレットの準備
Colors2=c("#FF69B4", "#EE30A7", "#D02090", "#C71585", "#9A32CD", "#8A2BE2")

#データの生成(6種の何かのベリーの何かの廃棄率の時系列データみたいな何か)
df_line<-data.frame(WastedRate=c(rbeta(100,21,11),rbeta(100,16,16),rbeta(100,11,21)))%>% #乱数でデータ生成
        dplyr::mutate(mup=WastedRate+0.05,#帯の上限1
                  mlo=WastedRate-0.05, #帯の下限1
                  hup=WastedRate+0.1, #帯の上限2
                  hlo=WastedRate-0.1, #帯の下限2
                  TimePoint=(1:length(WastedRate)), #タイムポイントを整数であたえて時系列情報を付与
                  Group=as.factor(rep(c("BerryA","BerryB","BerryC","BerryD","BerryE","BerryF"),50)))#グループ変数

#ggplot
gg2<-ggplot(df_line,aes(x=TimePoint,y=WastedRate))+ #x軸とy軸指定
    annotation_raster(fruit_rouge, -Inf, Inf, -Inf, Inf)+ #画像を範囲一杯に描画
    geom_ribbon(aes(ymax=1,ymin=0.75),alpha=0.6,fill="gray40")+ #最上段1/4を塗りつぶし
    geom_ribbon(aes(ymax=0.75,ymin=0.5),alpha=0.6,fill="gray60")+#上段1/4を塗りつぶし
    geom_ribbon(aes(ymax=0.5,ymin=0.25),alpha=0.4,fill="gray80")+#下段1/4を塗りつぶし
    #塗りつぶしで4分割した範囲の説明テキスト
    geom_text(aes(x=250,y=0.875),label="High Score",size=3.5,colour="gray20",family='Hiragino Mincho Pro W3')+ 
    geom_text(aes(x=250,y=0.625),label="Moderate High",size=3.5,colour="gray20",family='Hiragino Mincho Pro W3')+
    geom_text(aes(x=50,y=0.375),label="Moderate Low",size=3.5,colour="gray20",family='Hiragino Mincho Pro W3')+
    geom_text(aes(x=50,y=0.128),label="Low Score",size=3.5,colour="gray20",family='Hiragino Mincho Pro W3')+
    #時系列の帯を描画
    geom_ribbon(aes(ymax=hup,ymin=hlo,colour=Group,fill=Group),size=0.1,alpha=0.3)+
    geom_ribbon(aes(ymax=mup,ymin=mlo,colour=Group,fill=Group),size=0.1,alpha=0.15)+
    #時系列のメイン値をgeom_lineの折れ線グラフで
    geom_line(aes(colour=Group))+
    #Groupごとに分割して描画
    facet_wrap(~Group,ncol=2)+
    #色と塗りつぶし色をマニュアル指定
    scale_color_manual(values=Colors2)+
    scale_fill_manual(values=Colors2)+
    #グラフの描画範囲をツメツメに
    scale_x_continuous(expand=c(0,0))+
    scale_y_continuous(expand=c(0,0))+
    #以下はggThemeAssistantで調整したもの。GUIで調整後、コードが吐き出されるのでそれを使用。
    theme(plot.subtitle = element_text(family = "serif", 
        vjust = 1), plot.caption = element_text(vjust = 1), 
        axis.title = element_text(family = "serif", 
        size = 14), axis.text = element_text(family = "serif", 
        size = 12), plot.title = element_text(family = "serif", 
        size = 20), legend.text = element_text(family = "serif", 
        colour = "gray20"), legend.title = element_text(family = "serif", 
        colour = "gray20"), legend.key = element_rect(fill = "gray90"), 
        legend.background = element_rect(fill = "gray90"), 
        legend.position = "bottom", legend.direction = "horizontal") +
    labs(title = "Mix Berry Line (Example): Wasted Rate", 
        subtitle = "In everyday language, a berry is a small, pulpy, and often edible fruit.
Berries are usually juicy, rounded, brightly colored, sweet or sour,
and do not have a stone or pit, although many pips or seeds may be present. ")
        
#描画
plot(gg2)

よいしょ。


MixBerryLine.png
Figure.3 ミックスベリーの廃棄率推移(種別)


むむむ。ベリーの鮮やかさが活かしきれていませんね。

あと、X軸が明瞭じゃないので、何を読み取ればよいかパッとつかめませんね。


最後に


MixBerryのほうは、もうちょっとキレイにいけたかな。

眠気で力尽きました。

みなさんも、

作図を見やすく分かりやすく、そして美しくなるよう、

(あとやっぱりタカヤナギ=サンを使って)

どんどん画像を使ったグラフの工夫してみてくださいね。

それでは、

Enjoy!!

 

Written on May 22, 2017