Rで解析:ggplot2などの出力をインタラクティブな3Dに変換!!「rayshader」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

「ggplot2」パッケージや関連パッケージの出力をインタラクティブな3Dに変換するコマンドなどが収録されているパッケージの紹介です。

本パッケージは「ggplot2」パッケージや関連パッケージだけでなく、高低データを含む地図データもインタラクティブな3Dに変換可能です。

また、紹介しませんが「Wavefront OBJファイル」を作成する「save_obj」コマンドや3Dプリンタで出力可能な「STLファイル」を作成する「save_3dprint」コマンドが収録されています。3Dプリンタを持っていれば、ぜひ試したいコマンドです。

本紹介では「ggplot2」パッケージや関連パッケージの出力をインタラクティブな3Dに変換するコマンドを主に紹介します。

パッケージバージョンは0.37.3。実行コマンドはwindows 11のR version 4.3.1で確認しています。

スポンサーリンク

紹介動画

パッケージのインストール

下記コマンドを実行してください。

# パッケージのインストール
install.packages("rayshader")

コマンドの紹介

詳細はコマンド、パッケージのヘルプを確認してください。

# パッケージの読み込み
library("rayshader")

### データ例の準備 #####
# tidyverseパッケージの読み込み
# tidyverseパッケージがなければインストール
if(!require("tidyverse", quietly = TRUE)){
  install.packages("tidyverse");require("tidyverse")
}

Tedt_Data <- tibble(Group = LETTERS[1:5],
                    Value = 1:5)

#####

# ggplot2のプロットを3Dでプロットする:plot_ggコマンド
# ggplotオブジェクトを設定:ggobjオプション
# ggplot2プロットを同時にプロット:flat_plot_renderオプション;初期値:FALSE/TRUE
# ggplot2プロットをプロットする距離:flat_distanceオプション;初期値:"auto"/数値
# ggplot2プロットをプロットする方向:flat_directionオプション;初期値:"-z"/"z","x","-x","y","-y"
# ggplot2プロットの背景を透明にするか:flat_transparent_bgオプション;初期値:FALSE/TRUE
# 高さのマッピングを反転:invertオプション;初期値:FALSE/TRUE
# 光源の有無:raytraceオプション;初期値:TRUE/FALSE
# 光源の位置を角度で指定:sunangleオプション;初期値:315
# 視点の初期位置:anglebreaksオプション;初期値:seq(30,40,0.1)
# パネル縁影の描写:shadowオプション;初期値:TRUE/FALSE
# パネル縁影の色を指定:shadowcolorオプション;初期値:"auto"
# パネル縁影の強度を指定:shadow_intensityオプション;初期値:0.5
# RGLデバイスの背景色を設定:backgroundオプション;初期値:"white"
# プロットプレビュー:previewオプション:初期値:FALSE/TRUE
plot_gg(ggobj, flat_plot_render = FALSE, flat_distance = "auto",
        flat_transparent_bg = FALSE, flat_direction = "-z", invert = FALSE,
        raytrace = TRUE, sunangle = 315, anglebreaks = seq(30, 40, 0.1),
        shadow = TRUE, shadowcolor = "auto", shadow_intensity = 0.5,
        background = "white", preview = FALSE)


# 出力をキャプチャー:render_snapshotコマンド
render_snapshot(clear = FALSE)
        
### 使用例_1 #####
# ggplotオブジェクトを作成
ggdiamonds <- ggplot(diamonds) +
  stat_density_2d(aes(x = x, y = depth, fill = stat(nlevel)), 
                  geom = "polygon", n = 200, bins = 50,contour = TRUE) +
  facet_wrap(clarity~.) +
  scale_fill_viridis_c(option = "A")

# プロット
plot_gg(ggdiamonds, width = 5, height = 5, multicore = TRUE, scale = 250, 
        raytrace = TRUE, shadow = TRUE, shadowcolor = "yellow",
        zoom = 0.7, theta = 10, phi = 30, windowsize = c(800, 800),
        preview = FALSE, background = "gray")

# キャプチャー
render_snapshot(clear = FALSE)
########

### 使用例_2 #####
# Rで解析:カレンダー形式のヒートマップを作成「ggTimeSeries」
# https://www.karada-good.net/analyticsr/r-405
# パッケージのインストール
install.packages("devtools")
devtools::install_github("Ather-Energy/ggTimeSeries")

# パッケージの読み込み
library("ggTimeSeries")
#install.packages("data.table")
library("data.table")
library("ggplot2")

# データ例の作成
# 開始日月年
StartDate <- "06/02/2023"
# 終了日月年
EndDate <- "31/12/2024"
# 配列の作成
DateVector <- seq(as.Date(StartDate, "%d/%m/%Y"),
                  as.Date(EndDate, "%d/%m/%Y"),
                  "days")
# 値付きのdata.frameに変換
TestData <- data.table(Date = DateVector,
                       data = runif(length(DateVector)))

# カレンダー形式のヒートマップを作成:ggplot_calendar_heatmapコマンド
ggcalender <- ggplot_calendar_heatmap(TestData, cDateColumnName = "Date",
                                      cValueColumnName = "data", vcGroupingColumnNames = "Year") +
  labs(xlab = NULL, ylab = NULL) + 
  scale_fill_continuous(low = "#4b61ba", high = "#a87963") + 
  facet_wrap(~Year, ncol = 1)

# プロット
plot_gg(ggcalender, width = 5, height = 5, multicore = TRUE, scale = 250, 
        raytrace = TRUE, shadow = TRUE, shadowcolor = "green",
        zoom = 0.7, theta = 10, phi = 30, windowsize = c(800, 800),
        preview = FALSE, background = "gray")

# キャプチャー
render_snapshot(clear = FALSE)
########

### 使用例_3 #####
# Rで解析:そうだ、ベン図を作成しよう!!「ggVennDiagram」パッケージ
# https://www.karada-good.net/analyticsr/r-761/
# パッケージのインストール
install.packages("ggVennDiagram")

# パッケージの読み込む
library("ggVennDiagram")

# データ例の作成
genes <- paste0("gene",1:1000)
set.seed(20210302)
gene_list <- list(A = sample(genes,100),
                  B = sample(genes,200),
                  C = sample(genes,300),
                  D = sample(genes,200))

# ベン図を作成:ggVennDiagramコマンド
ggVen <- ggVennDiagram(gene_list, 
                       category.names = c("a very long name",
                                          "short name", "name",
                                          "another name"))

# プロット
plot_gg(ggVen, width = 5, height = 5, multicore = TRUE, scale = 250, 
        raytrace = TRUE, shadow = TRUE, shadowcolor = "green",
        zoom = 0.7, theta = 10, phi = 30, windowsize = c(800, 800),
        preview = FALSE, background = "gray")

# キャプチャー
render_snapshot(clear = FALSE)
########


### その他パッケージ付属コマンドの使用例 #####
# https://github.com/tylermorganwall/rayshaderを参考にしてください
# リフォルニア州モントレー湾の地形と水深を合成した二次元matrixデータ:montereybay
montereybay %>%
  # 二次元matrixデータをサーフェス法線と半球UVマッピングを使用してHillshadeを作成:sphere_shadeコマンド
  sphere_shade(zscale = 10, texture = "imhof1") %>%
  # Hillshadeと標高データを使用してインタラクティブなプロット:plot_3dコマンド
  plot_3d(heightmap = montereybay, zscale = 50, fov = 70, theta = 270, phi = 30, 
          windowsize = c(1000, 800), zoom = 0.6,  
          water = TRUE, waterdepth = 0, wateralpha = 0.5, watercolor = "#233aa1",
          waterlinecolor = "white", waterlinealpha = 0.5)

# プロットにテキストを追加:render_labelコマンド
render_label(montereybay, x = 350, y = 160, z = 5000, zscale = 50,
             text = "からだにいいもの", textcolor = "darkred", textsize = 2, linewidth = 5)

# 高解像度でレンダリング:かなり時間がかかるので注意
# render_highquality(lightdirection = c(-45,45), lightaltitude  = 30, clamp_value = 10, 
#                    samples = 256, camera_lookat= c(0,-50,0),
#                    clear = TRUE)
########

出力例

・使用例_1

・使用例_2:カレンダー形式のヒートマップを作成「ggTimeSeries」

・使用例_3:そうだ、ベン図を作成しよう!!「ggVennDiagram」パッケージ

・その他パッケージ付属コマンドの使用例


少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました