Rでツイート時刻をヒートマップ表示
Twitter のツイートを R のライブラリ rtweet を使用して取得し、ツイート時刻のヒートマップを作成します。
目的
毎日 Twitter を使用していますが、特定の時間に使用していることが多いのでしょうか?
Githunのコントリビューション(アクティビティ)の草原のようなヒートマップで可視化します。
方法
Twitter からツイートの取得は、rtweet
ライブラリーを使用します。
ツイートした時刻は、得られたデータフレームのcreated_at
カラムに UTC で記録されています。ですので、時間帯を指定してローカルな時刻に変換します。
簡単なヒストグラム
1時間毎の粒度で知りたいので、lubridate
ライブラリを使って時間の部分を取り出し、count
で集約してツイート数を数えます。
geom_histogram()
でヒストグラムを作成するのであれば、ツイートを数える必要はありません。しかし、bin(バー)の数を制御できないので、棒グラフで表示します。
library(tidyverse)
library(lubridate)
library(rtweet)
tweets <- get_timeline("nosuz", n=1000)
tweets %>%
mutate(lt = as.POSIXlt(created_at, tz = "Asia/Tokyo")) %>%
mutate(tweet_at = hour(lt)) %>%
count(tweet_at) %>%
ggplot(aes(x=tweet_at, y=n)) +
geom_bar(stat = "identity") +
theme_light()
縦軸を全体に占める割合で示すときには、janitor
ライブラリーのtabyl
で集計します。
library(janitor)
library(knitr)
tweets %>%
mutate(lt = as.POSIXlt(created_at, tz = "Asia/Tokyo")) %>%
mutate(tweet_at = hour(lt)) %>%
tabyl(tweet_at) %>%
kable()
tweet_at | n | percent |
---|---|---|
5 | 1 | 0.001 |
6 | 33 | 0.033 |
… | … | … |
22 | 36 | 0.036 |
23 | 5 | 0.005 |
また、縦軸をパーセント表示にしたいので、縦軸のスケールをscale_y_continuous
で修正します。
library(janitor)
tweets %>%
mutate(lt = as.POSIXlt(created_at, tz = "Asia/Tokyo")) %>%
mutate(tweet_at = hour(lt)) %>%
tabyl(tweet_at) %>%
ggplot(aes(x=tweet_at, y=percent)) +
geom_bar(stat = "identity") +
scale_y_continuous(labels = scales::percent) +
theme_light()
ヒートマップ
ヒートマップは、曜日と時刻の2次元で表示します。
そこで、count
で集計します。
wday | hour | n |
---|---|---|
日 | 6 | 12 |
日 | 7 | 40 |
… | … | … |
月 | 22 | 7 |
月 | 23 | 2 |
ヒートマップは、geom_tile
で作成します。
この時wday
に月曜日開始にするオプションを与えます。また月 → 日の順番に factor の数字が大きくなるので、上から月 → 日となるように factor の順番をfct_rev
で逆順にします。
library(forcats)
tweets %>%
mutate(lt = as.POSIXlt(created_at, tz = "Asia/Tokyo")) %>%
mutate(wday=fct_rev(wday(lt, label = TRUE, week_start = 1)), hour = hour(lt)) %>%
count(wday, hour) %>%
ggplot(aes(x=hour, y=wday, fill=n)) +
geom_tile(color = "white", size = 0.5) +
scale_fill_gradient(low="lightgreen", high = "red") +
theme_light() +
theme(axis.ticks = element_blank(),
panel.grid = element_blank(),
axis.title.y = element_blank(),
legend.position = "none")
もっと Github っぽいヒートマップを作成
配色については、GitHub Contributions Graph の作り方(ロジック成分多め)が参考になります。
その配色をscale_fill_gradientn
に使うと、次の図のようになります1。
更にヒートマップを Github のような見た目にしたい場合はGitHub-style waffle plots in Rが参考になります2。
参考サイトと脚注
-
#eee
のような三桁での指定方法を知らなかったのですが、【CSS】#fff と#eee、#111 と#000 の間はどのくらいグラデーションになるかによると#eeeeee
と同じ意味らしいです。 ↩︎ -
Github のコントリビューションのような表は、草原ではなくワッフルですか。確かに四角く切られた枠はワッフルっぽいですね。 ↩︎