データ穴リストのブログ

すべては喰いっぱぐれないために

gghighlightがステキすぎることをポエむ。

こんにちは。先日、Tokyo.R#72に参加しました。

報告内容に「穴lytics」なるタイトルの方がいらして、
ヤバい、ライバル出現か!?などとひとり戦慄を覚えた訳ですが、
中身を拝見したら「(人としての、能力的な)欠損」の意味ではなく、
「データの特徴量をTDA(位相的データ分析)で見てみよう」という、
大変高度で私には全くもって手の届かない雲上の層にあらせられる方の報告で、
何をライバル出現などとおこがましいことを考えているんだ
この能力欠損野郎はと、改めて襟を正す思いでした。

普段Tシャツばっか着てるから襟無いんだけどな!
ダメ中年ざまぁ!!

gghighlightの話、あまり無い?

ところで本題なんですが、Tokyo.Rでも散々

  • gghighlightはすご過ぎる
  • gghighlightは神
  • gghighlightと結婚したい

という話が出たり出なかったりだと認識しているんですが、
肝心のgghighlightに関する記述はユタニさんの公式系資料とブログのみで、
なかなか他を見つけられないでいます。

こういうものって製作者に配慮して書かないものなのか?
とかよく分かっていないので、
とにかく愛しのgghighlightについてポエみたい、それが本記事です。

基本のキは本家へどうぞ

もちろんながら、
基本的な使い方についてはユタニさんのブログ等を見ていただくとして、

notchained.hatenablog.com

「こんなこと言ってたからこんな風にしてみたよ!」
ってなことを紹介していきたいと思います。

まぁとりあえず

見本を作ってみる

require(tidyverse)
require(lubridate)
require(gghighlight)

# データを作る(スマートじゃないね…)
dat <- data.frame(hiduke = today() %m-% days(0:364),
                  x1 = cumsum(c(sample(1:1000,1), sample(-100:100,364, replace = TRUE))),
                  x2 = cumsum(c(sample(1:1000,1), sample(-100:100,364, replace = TRUE))),
                  x3 = cumsum(c(sample(1:1000,1), sample(-100:100,364, replace = TRUE))),
                  x4 = cumsum(c(sample(1:1000,1), sample(-100:100,364, replace = TRUE))),
                  x5 = cumsum(c(sample(1:1000,1), sample(-100:100,364, replace = TRUE))),
                  x6 = cumsum(c(sample(1:1000,1), sample(-100:100,364, replace = TRUE)))
                  ) %>% gather(product, val, -hiduke)

p <- 
ggplot(dat, aes(hiduke, val, colour = product))+
  geom_line()

# 基本
p + gghighlight(max(val) > 1500)

特に素晴らしいのはラベル

はい、ラベルです。これがgghighlightをハイライトしたいところです。
なにがいいって、ラベルの自由度の高さだと思っています。

このラベル、複数の変数を重ねられるんですよね。
ggrepelからそうなのかもしれないけど、
正直ggrepelってテキストズラすだけで使いづらいなーと思ってたので、
こんな感じだと万々歳です*1

ということを利用すると、こんな事が出来るわけです。

# 見出しを選択(複数選択&文字列可)
p + gghighlight(max(val) > 1500, label_key = paste0(month(hiduke), "/", day(hiduke),
                                                    "現在\n", 
                                                    product,":", val, "pt"))

f:id:cun-wang:20180904125657p:plain

…分かりますか…?
「グラフの見て欲しい部分を丸で囲ったりして数値を上から書く」とか言う
チマチマした作業が入らなくなるの!!
何というお手軽!何という幸せ!

Excelでも何でも分析結果を人に伝える際には大体皆さん経験あると思いますが、
観測データの定期報告に今まではイチイチ作ったグラフに対して
「ココがこうだ。んだもんで良い/悪い」とかを言葉に変換する作業が必要で、
早い話がくそ面倒なわけです。

僕は、出来ないなりに以下のようなステップで少しずつ進化させて来たのだけれど、

  1. Excelグラフ作成。丸とか四角とかで囲う。んで吹き出しとかつけて説明…
  2. Rでグラフ作成。画像ファイル化してPPT等に貼付けてその後丸以下略
  3. Rmarkdownでダッシュボード自動作成。で、図をPPTに貼り付けて以下略
  4. Rmarkdownでグラフ&スライド一括作成。結果をコメントとして記載

「次はanotateとか使って気になるデータとか強調しようかなー
 でもハイライトしたいトコ選ぶとかだるいなー」とか思ってたので、
このタイミングで出会えたことはまさに僥倖!!!だったわけです。

はい、ほぼコレで言いたいことは大体終わった。 あとは色々試したのを載せ…ようかと思ったけど無駄に長くなるのでそちらはQiitaで。

あ、ちなみにここで「書かなくてよくなった」のは、あくまでも
「結果が(とりあえず観測できた事実として)どうだったか」までであって、
そのあとの洞察(解釈)は別物です。
そんなん流石に自動化できないしそれがあったら僕は用済みだ。

でもこのコメントさえあれば、あとはまぁグラフ見ながら考えられるしなんならその場で解釈してもごまかせる大丈夫!!!*2

あとよくわからないもの

  • use_group_by():コレはggplotの段階でグループ指定してあげなきゃなやつで使う?それともgrouped_dfとかに使う?
  • facetしようとするとしばしばものすごい時間かかってエラーになるかなんなら落ちたりする。やり方がまずいのか、ちょっとケースを整理しなきゃ。

以上ですよ!

*1:多分元々geom_text()でも出来てたから、それと同じと考えればフツーだけど、同じように出来るってことが素晴らしいわけで。

*2:前職の業界用語なのかなんなのか、この辺は「1次コメント」などと呼んでいた。報告書にとりあえず数字の読めるスタッフさんにひたすら書いてもらって、あとで解釈をいれていく、みたいな…。労働集約的だし、自分の身にもならなくてしんどかった。。。