R_ggiraph(複数グラフ連携)_20240925

Topic(Purpose / Outcome:目的・期待される成果)

Conductor
Conductor

マウスオーバーしながら情報確認しつつ、複数のグラフで観察できるのは面白い。

Visualization(How / Output:事実整理 / 最終ゴール)

Visualizer
Visualizer

①時系列で確認、②直近の年の分布を確認

Script Design / Summary(How:設計図・概要・論理構築)

Wrangler
Wrangler

全体像はこんな感じ

library(dplyr)
library(ggplot2)
library(patchwork)
install.packages("ggiraph")
library(ggiraph)

# Load the data
dat <- gapminder::gapminder %>%
  # gapminderとは、国ごとの人口、GDP、寿命などのデータを提供するパッケージ
  # year, continent, country, lifeExp, pop, gdpPercap
  # このデータは、1952年から2007年までの各国の人口、GDP、寿命などを提供している
  janitor::clean_names() %>% 
  # janitor::clean_names() は、データフレームの列名を小文字に変換する
  mutate(
    # ID that is shared for boxplots (this one uses factors, i.e. numbers, as ID instead of continents)
    id = as.numeric(continent),
    # continentを数値に変換してidに代入している
    continent = forcats::fct_reorder(continent, life_exp)
    # forcats::fct_reorder() は、ファクターのレベルを再配置する
    # ここでは、continentをlife_expの値に基づいて再配置している
    # つまり、life_expの値が大きい順にcontinentを並べ替えている
  )

color_palette <- thematic::okabe_ito(5)
# thematic::okabe_ito() は、カラーパレットを返す関数
# ここでは、5色のカラーパレットを取得している
names(color_palette) <- unique(dat$continent)
# names() は、ベクトルの要素に名前を付ける関数
# ここでは、color_paletteにcontinentの名前を付けている

base_size <- 24 # Base font size

mean_life_exps <- dat %>% 
  group_by(continent, year, id) %>% 
  summarise(mean_life_exp = mean(life_exp)) %>% 
  mutate(mean_text = glue::glue('In {year}, the mean life expectancy in\n{continent} was {scales::number(mean_life_exp, accuracy = 0.01)}'))
  # \n は改行を表す
  # {}には、変数を埋め込むことができる
  # scales::number() は、数値を指定した精度でフォーマットする関数
  # accuracy = 0.01 は、小数点以下2桁まで表示することを意味する

line_chart <- mean_life_exps %>% 
  ggplot(aes(x = year, y = mean_life_exp, col = continent, data_id = id)) +
  # data_id は、ggiraphで使用するためのデータID、つまり、ツールチップやクリックイベントを設定するためのID
  # ツールチップやクリックイベントとは、マウスをホバーしたときに表示される情報や、クリックしたときに表示される情報のこと
  geom_line_interactive(linewidth = 2.5) +
  # geom_line_interactive() は、ggiraphで対話的な線グラフを描画する関数
  geom_point_interactive(size = 6, aes(tooltip = mean_text)) +
  # tooltip は、ツールチップに表示する情報を指定する
  theme_minimal(base_size = base_size) +
  # base_size は、フォントサイズを指定する
  labs(
    x = element_blank(), # x軸のラベルを非表示にする
    y = 'Life expectancy (in years)', # y軸のラベルを設定する
    title = 'Life expectancy over time' # グラフのタイトルを設定する
  ) +
  theme(
    text = element_text(
      # テキストの色を設定する
      color = 'grey20'
    ),
    legend.position = 'none', # 凡例を非表示にする
    panel.grid.minor = element_blank(), # グリッド線を非表示にする
    plot.title.position = 'plot' # タイトルを中央に配置する
  ) +
  scale_color_manual(values = color_palette) # カラーパレットを設定する


selected_year <- 2007
box_stats <- dat %>% 
  filter(year == selected_year) %>% 
  group_by(continent) %>% 
  summarise(
    n = n(), # n() は、グループ内の行数を返す関数
    iqr = IQR(life_exp) %>% round(2), 
    # IQR() は、四分位範囲を計算する関数
    # round(2) は、小数点以下2桁まで表示する
    range = paste(range(life_exp) %>% round(2), collapse = ' - '),
    # range() は、最小値と最大値を返す関数
    # paste() は、文字列を連結する関数
    # collapse = ' - ' は、連結するときに区切り文字として' - 'を使用することを意味する
    mean = mean(life_exp) %>% round(2)
  )

box_plot <- dat %>% 
  filter(year == selected_year) %>% 
  full_join(box_stats) %>% 
  # full_join() は、2つのデータフレームを結合する関数
  ggplot(aes(x = life_exp, y = continent, fill = continent, data_id = id)) +
  geom_boxplot_interactive(
    # geom_boxplot_interactive() は、ggiraphで対話的な箱ひげ図を描画する関数
    aes(
      tooltip = glue::glue(
        '
        {levels(dat$continent)[continent]}\n
        {n} Countries\n
        Mean life expectancy: {mean}\n
        Range: {range}\n
        IQR: {iqr}
        '
      ),
      onclick = glue::glue('window.open("http://en.wikipedia.org/wiki/{levels(dat$continent)[continent]}")')
      # onclick は、クリックしたときに実行するJavaScriptコードを指定する
      # ここでは、クリックしたときに、Wikipediaのcontinentのページを開くようにしている
      # levels() は、ファクターのレベルを返す関数、これはcontinentのレベルを取得している
    ),
    position = position_nudge(y = 0.25), # 位置を微調整する
    width = 0.5 # 箱ひげ図の幅を設定する
  ) +
  geom_point_interactive(
    aes(col = continent),
    position = position_nudge(y = -0.2),
    size = 11,
    shape = '|', # ポイントの形を設定する
    alpha = 0.75
  ) +
  scale_fill_manual(values = color_palette) +
  scale_color_manual(values = color_palette) +
  labs(
    x = 'Life expectancy (in years)',
    y = element_blank(),
    title = glue::glue('Distribution of Life Expectancy in {selected_year}')
  ) +
  theme_minimal(base_size = base_size) +
  theme(
    text = element_text(
      color = 'grey20'
    ),
    legend.position = 'none',
    panel.grid.minor = element_blank(),
    plot.title.position = 'plot'
  ) 

ggiraph(
  ggobj = box_plot + plot_spacer() + line_chart + plot_layout(widths = c(0.45, 0.1, 0.45)),
  # ggobj は、ggiraphで対話的なグラフを描画するためのggplotオブジェクト
  # plot_spacer() は、プロットの間にスペースを挿入する関数
  # plot_layout() は、プロットのレイアウトを設定する関数
  options = list(
    # オプションを設定する
    opts_hover_inv(css = "opacity:0.1;"), # ホバー時の透明度を設定する
    opts_tooltip(offx = 0, offy = 0, css = 'font-size: larger;') # ツールチップのオフセットとCSSを設定する
  ),
  hover_css = "", # ホバー時のCSSを設定する
  height_svg = 9, # SVGの高さを設定する
  width_svg = 16 # SVGの幅を設定する
)

Raw data / Wrangling / Feature Engineering(抽出~整形)

Raw data(How:生データ抽出元)

  • Source: mpg

Raw data(How:生データ抽出方法)

  • SQL読込: –
  • CSV読込: –
  • API読込 : 〇
  • rmarkdown:render()読込:- (.rmdのファイルをtemplate保存しておく必要あり)

Raw data(How:生データの構造 / 種類)

Extractor
Extractor

元々のデータフレーム

Wrangling (How: Loading・生データ読込)

Wrangler
Wrangler

Loading

# Script on Rstudio
# Tips: 読み込み先のファイルは「記載するpath名の始まり」からWorking Directoryとして設定する必要性がある。


mpg

Wrangling (How: before output、Output前のデータ構造)

Wrangler
Wrangler

視える化に合わせて編集

2つのテーブルを結合(datにbox_statsをくっつける)

dat %>%
filter(year == selected_year) %>%
full_join(box_stats)

メモ

  • 情報ソースがWEBサイト(HTMLやCSS)の場合にはどこから抽出するか、が問われるので、HTMLやCSSの知識が必要(スクレイピングを実施するにせよ)。
  • レンダリング(rendering)とはコンピュータがデータを処理して画像や映像、テキストなどを表示させる技術。
  • .fn(単数)と.fns(複数)はfunctionの略で無名関数。~ (tilde:チルダ) も無名関数。

tblの種類

  • Wide format:クロス集計表(横持ちデータ)
  • Long format:縦持ちデータ

tblの中身

  • 行 (row) :レコード、Observation、観測値(サンプル数)
  • 列 (column):特徴量、変数、次元数、次元の削減(Dimensionality Reduction): 高次元データを少ない次元に圧縮し、モデルの効率を上げるための手法。.xは列を指定している。obs = number of observatins.
  • 値:data point、Feature

tblの操作

  • One Hot Encoding とは、カテゴリ変数をバイナリ(0または1)で表現する方法。例えば、車の駆動方式 (drv) に “4”, “f”, “r” という3つのカテゴリがあったとします。カテゴリ変数の各値ごとに新しいカラムを作成し、その値が該当する場合は1、該当しない場合は0を入れます。カテゴリごとにバイナリの数値を割り当て、新しいカラムを作成することで、元のカテゴリデータが数値データとして扱えるようになります。これにより、機械学習モデルがデータを扱いやすくなるのが主な目的です。バイナリカラムの作成。例えば、ある行(観測値/row)に対して、classという列が分解され、それぞれ、compact、suv、midsizeの3つの列が、同じ行数に対して追加される。結果、元々suvで該当している行は1、該当しない列はゼロとなる。そのために事前に元々のテーブルには、すべての行に対して1が入るように設定の上、pivotでwide formatに展開する事が簡単。

tblの現状把握

# 変数の中身のユニークな値を確認する ----
unique(mpg$drv)

# 出現頻度を確認する
table(mpg$drv)

head(mpg$drv)
summary(mpg$drv)

# 全体確認 ----
skim(dat)

# チラ見 ----
glimpse(dat)

環境設定 & 環境の現状把握

  • 初期設定の3点セット:R, Rstudio, Rtools
  • RのバージョンとRtoolsのバージョンは合わせる必要性がある。Rstudioは最新版でも問題なし。例えば、corrmorantのpackageは、①Rの4.0.0(Rtoolも同バージョンをインストール)、及び、②ggplot2の3.3.0で、問題なくワークする事が実証されている。この場合、最新版のggplotのバージョンではパッケージがワークするかは不明。
# 現状把握
version()

library(pkgbuild)
has_rtools(debug = TRUE)

sessionInfo()

データソースのダウンロード

  • HTML形式のファイルが「file:///C:/Users/XXXXX/・・・」で保存されている場合、ローカルで保存されている状態。HTMLファイルをウェブサーバー(WordPressサイト)にアップロードする必要があり。
  • Githubのcredentialが期限切れになっている場合:
install.packages("oskeyring") 
library(gitcreds) # gitcredsパッケージを読み込む
gitcreds_list() # 登録されている認証情報を確認

gitcreds_delete(url = "https://github.com") 
# 登録されている認証情報を削除

Sys.unsetenv("GITHUB_PAT") # GITHUB_PATを削除。空で帰る場合には問題解決。

# 公開リポジトリのインストールには認証は不要:
# corrmorantは公開リポジトリなので、認証なしでインストールできます。
# そのため、環境変数GITHUB_PATやシステムの資格情報ストアに認証情報が設定されていない状態が望ましいです。

# remotes::install_github("r-link/corrmorant", auth_token = NULL, force = TRUE)

# 特定のバージョンのggplot2をインストール
renv::install("ggplot2@3.3.6")

データ型

Rのデータ型

データ型説明
logical論理型。TRUEまたはFALSEの2つの値を取ります。TRUE, FALSE
integer整数型。正または負の整数値を保持します。1L, -10LLは整数の指定)
double数値型(実数型)。小数を含む任意の数値を表します。3.14, -100.5
complex複素数型。実部と虚部を持つ数値です。1 + 2i
character文字列型。文字列やテキストを保持します。"Hello", "R"
factorカテゴリ型。有限の異なるカテゴリ(レベル)を持つデータです。factor(c("Male", "Female"))
listリスト型。異なるデータ型を含む要素のコレクション。list(1, "a", TRUE)
data.frameデータフレーム型。異なる型を持つベクトルを列として保持する二次元表形式データ。data.frame(x = 1:3, y = c("a", "b", "c"))
matrix行列型。数値、文字列、論理値などを含む二次元配列です。matrix(1:9, nrow = 3)
array配列型。行列よりも多次元のデータを扱います。array(1:12, dim = c(2, 3, 2))
ts時系列データ型。等間隔で記録されたデータを表します。ts(c(1, 2, 3), start = c(2021, 1), frequency = 12)
Date日付型。日付データを表現します。as.Date("2024-09-25")
POSIXct, POSIXlt日時型。日付と時間のデータを保持し、異なるフォーマットで時刻を扱います。as.POSIXct("2024-09-25 10:30")
rawバイナリデータ型。バイト単位のデータを保持します。as.raw(c(0x01, 0x02))
NULLNULL型。未定義や無効な値を表します。NULL
NA欠損値。データが存在しないことを示します。NA

参考リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA