Rで解析:スパイラルチャートを手軽に作成!「spiralize」パッケージ

Rの解析に役に立つ記事

スパイラルチャートを手軽に作成できるパッケージの紹介です。よく使いそうなコマンドと気象庁からダウンロードできる札幌の気温データを使用した例を紹介します。

スパイラルチャートはアルキメデスの螺旋に沿ってプロットし表現する手法で、大規模なデータを視認するのに便利です。Spiral PlotやSpiral chartsで検索していただくと多くの情報を得ることが可能です。

パッケージバージョンは1.0.4。windows11のR version 4.1.2で確認しています。

スポンサーリンク
スポンサーリンク

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

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

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

実行コマンド

詳細はコメント、コマンドヘルプを確認してください。

###基本的な設定#####
#スパイラルチャートの設定:spiral_initializeコマンド
#チャートの開始点:startオプション
#チャートの終了点:endオプション
#start,endオプションは[360x + b]で直感的に設定できます
#反転の設定:flipオプション;"none","horizontal","vertical","both"
#データスケーリング設定:scale_byオプション
###"angle":極座標からの角度の差が等しくする
###"curve":スパイラルチャートにデータが収まるようにする
#データ軸の方向を設定:reverseオプション;TRUE,FALSE
#x軸範囲を指定:xlimオプション;c(min, max)
spiral_initialize(start = 360*1 + 0, end = 360*3 + 180,
                  flip = "none", scale_by = "angle",
                  reverse = FALSE, xlim = sRange)

#スパイラルチャートのトラック設定:spiral_trackコマンド
#トラックの幅を設定:heightオプション;0:1の範囲
#y軸範囲を指定:reverse_yオプション;c(min, max)
#データ軸の方向を設定:reverse_yオプション;TRUE,FALSE
#トラックの枠,塗色:background_gpオプション;gparコマンドで指定
spiral_track(height = 0.4, ylim = c(0, 1),
             background_gp = gpar(col = "green", fill = 2))
#トラックは重ねることができます
spiral_track(height = 0.4, ylim = c(0, 1),
             background_gp = gpar(col = "red", fill = "yellow"))

#x軸の設定:spiral_axisコマンド
#ラベルの位置:hオプション;"top","bottom"
#ラベルをカーブで曲げる:curved_labelsオプション;TRUE,FALSE
#フォントサイズを設定:labels_gpオプション;gparコマンドで指定
spiral_axis(h = "top", curved_labels = TRUE,
            labels_gp = gpar(fontsize = 7))

#y軸の設定:spiral_yaxisコマンド
#ラベルの位置:sideオプション;"both","start","end"
spiral_yaxis(side = "both")

###参考#####
#スパイラルチャートのトラック数を確認:n_tracksコマンド
n_tracks()
[1] 2

#アクティブなスパイラルチャートのトラックを変更:set_current_trackコマンド
#スパイラルトラックを指定:track_index
set_current_track(track_index = 2)

#現在のアクティブなスパイラルチャートのトラック確認:current_track_indexコマンド
current_track_index()
[1] 2
########

各種スパイラルチャート例

詳細はコメント、コマンドヘルプを確認してください。

###各種スパイラルチャート例#####
#各種スパイラルチャート例で使う基本プロットを作成
BasePlot <- function(){
  #スパイラルチャートの設定
  spiral_initialize(start = 360*1 + 0, end = 360*3 + 180,
                      flip = "none", scale_by = "angle",
                      reverse = FALSE, xlim = sRange)
  #スパイラルチャートのトラック設定
  spiral_track(height = 0.7, ylim = c(0, 1),
               background_gp = gpar(col = "#426617", fill = "#deb7a0"))
  #x軸の設定
  spiral_axis(h = "top", curved_labels = TRUE,
              labels_gp = gpar(fontsize = 7))
  #y軸の設定
  spiral_yaxis(side = "both")
    }

#確認
BasePlot()
#スパイラルチャートタイトル
grid.text("基本プロット", x = 0, y = 1, just = c("left", "top"))


#散布図の描写:spiral_pointsコマンド
BasePlot()
spiral_points(x = seq(max, min, length = 10), y = ValueRunif,
              pch = 16, gp = gpar(cex = 2, col = "#94bbe3"))
#スパイラルチャートタイトル
grid.text("spiral_pointsコマンド", x = 0, y = 1, just = c("left", "top"))

#折れ線グラフの描写:spiral_linesコマンド
#エリアを塗りつぶし:areaオプション;TRUE,FALSE
BasePlot()
spiral_lines(x = seq(max, min, length = 10), y = ValueRunif,
             area = TRUE, type = "l",
             gp = gpar(lwd = 3, fill = "#94bbe3",
                       col = "#bfe6d5", alpha = 1))
#スパイラルチャートタイトル
grid.text("spiral_linesコマンド", x = 0, y = 1, just = c("left", "top"))
#参考:軸に水平でプロット
#spiral_lines(x = seq(max, min, length = 10), y = runif(10),
#             type = "h", gp = gpar(lwd = 3, col = "red"))


#セグメントを描写:spiral_segmentsコマンド
#矢印にする:arrowオプション
BasePlot()
spiral_segments(x0 = ValueRunif,
                y0 = ValueRunif,
                x1 = ValueRunif + runif(10, min = -0.02, max = 0.02),
                y1 = 0.9 - ValueRunif, arrow = arrow(length = unit(2, "mm")),
                gp = gpar(col = circlize::rand_color(10, luminosity = "bright"),
                          lwd = 2))
#スパイラルチャートタイトル
grid.text("spiral_segmentsコマンド", x = 0, y = 1, just = c("left", "top"))

#棒グラフの描写:spiral_barsコマンド
#棒グラフの開始基準を指定:baselineオプション
BasePlot()
spiral_bars(pos = seq(0.3, 0.9, length = 10),
            value = ValueRunif, baseline = 0,
            gp = gpar(fill = ifelse(ValueRunif > 0.5, "#bfe6d5", "#94bbe3"), col = NA))
#スパイラルチャートタイトル
grid.text("spiral_barsコマンド", x = 0, y = 1, just = c("left", "top"))

#テキストの描写:spiral_textコマンド
#描写方法の指定:facingオプション;"downward","inside","outside",
#"clockwise","reverse_clockwise","curved_inside","curved_outside"
BasePlot()
spiral_text(x = seq(0.3, 0.9, length = 10), y = 0.5,
            "からだにいいもの", facing = "curved_inside",
            gp = gpar(col = "#426617", alpha = 1))
#スパイラルチャートタイトル
grid.text("spiral_textコマンド", x = 0, y = 1, just = c("left", "top"))

#軸ラベルの追加:spiral_axisコマンド
BasePlot()
spiral_axis(major_at = seq(0, 1, length = 13),
            labels = c("", month.name), minor_ticks = 6,
            labels_gp = gpar(fontsize = 10, col = "red"))
#スパイラルチャートタイトル
grid.text("spiral_axisコマンド", x = 0, y = 1, just = c("left", "top"))

#矢印の描写:spiral_arrowコマンド
#矢印末端の形状:tailオプション;"normal","point"
#矢印の開始方向:arrow_position;"end","start"
#矢印先頭の幅:arrow_head_widthオプション
#矢印先頭の長さ:arrow_head_lengthオプション
BasePlot()
spiral_arrow(0.68, 0.78, tail = "point", arrow_position = "start",
             arrow_head_width = 2, arrow_head_length = unit(4, "mm"),
             gp = gpar(fill = "#bfe6d5", col = NA))
#スパイラルチャートタイトル
grid.text("spiral_arrowコマンド", x = 0, y = 1, just = c("left", "top"))

#画像を描写:spiral_rasterコマンド
#プロット方法の指定:facingオプション;"downward","inside","outside",
#"curved_inside","curved_outside"
#画像の読み込み
image <- system.file("extdata", "Rlogo.png", package = "circlize")
BasePlot()
spiral_raster(x = 0.3, y = 0.4, image, width = 0.05, height = 1,
              facing = "curved_inside", nice_facing = TRUE)

#指定エリアを塗りつぶし:spiral_highlight_by_sectorコマンド
BasePlot()
spiral_highlight_by_sector(x1 = 0.1, x2 = 0.12, x3 = 0.45, x4 = 0.48,
                           gp = gpar(fill = "black"))
#スパイラルチャートタイトル
grid.text("spiral_highlight_by_sectorコマンド",
          x = 0, y = 1, just = c("left", "top"))

#日付軸のスパイラルチャートを作成:spiral_initialize_by_timeコマンド
#spiral_trackとspiral_axisコマンドと組み合わせて使用します。
#詳細はヘルプを確認してください
spiral_initialize_by_time(xlim = c("2014-01-01", "2021-06-17"))
spiral_track(height = 0.6)
spiral_axis()
#スパイラルチャートタイトル
grid.text("spiral_initialize_by_timeコマンド",
          x = 0, y = 1, just = c("left", "top"))

出力例

札幌の気温データを使用した例

気象庁HP:https://www.data.jma.go.jp/gmd/risk/obsdl/より札幌の気温データを取得・加工してプロットした例です。パソコンの性能によってはプロットに時間がかかります。

なお、ComplexHeatmapパッケージはBioconductorからインストールします。

使用したcsvデータは以下よりダウンロードできます。

#パッケージの読み込み
library("tcltk")
library("spiralize")
if(!require("tidyverse", quietly = TRUE)){
  install.packages("tidyverse");require("tidyverse")}
if(!require("lubridate", quietly = TRUE)){
  install.packages("lubridate");require("lubridate")}
if(!require("cowplot", quietly = TRUE)){
  install.packages("cowplot");require("cowplot")}
if(!require("BiocManager", quietly = TRUE)){
  install.packages("BiocManager");require("BiocManager")}
if(!require("ComplexHeatmap", quietly = TRUE)){
  BiocManager::install("ComplexHeatmap");require("ComplexHeatmap")}

###データの準備#####
#気象庁HP:https://www.data.jma.go.jp/gmd/risk/obsdl/より札幌の気温データを取得・加工
#気温データは26298*3のサイズ
#SapporoTemp.csvを選択
FilePath <- paste0(as.character(tkgetOpenFile(title = "ファイルを選択",
                                              filetypes = '{"ファイル" {".csv"}}',
                                              initialfile = c("*.*"))), collapse = " ")
#読み込み
ReadData <- read.csv(FilePath)

#欠損値を0に置き換え,年月日で抽出
AnaData <- ReadData %>%
  mutate_if(is.numeric, ~replace(., is.na(.), 0)) %>%
  mutate(Date = ymd(Date)) %>%
  filter(Date >= "1950-01-01" & Date <= "2000-12-31")
########

#cowplotパッケージでプロットするために空listを作成
PlotList <- list()

#cowplotパッケージでspiralizeパッケージのエラーを表示しない
spiral_opt$help = FALSE

#最高気温のスパイラルチャートを格納
PlotList[[1]] = grid.grabExpr({
  #スパイラルチャート基本部分
  spiral_initialize_by_time(xlim = range(AnaData[, 1]),
                            unit_on_axis = "days",
                            period = "years",
                            period_per_loop = 10,
                            polar_lines_by = 360/10) #,
                            #vp_param = list(x = unit(0, "npc"), just = "left"))
  #トラックの追加
  spiral_track(height = 0.8)
  #気温のスパイラルチャート
  lt = spiral_horizon(AnaData[, 1], AnaData[, 2], use_bar = TRUE,
                      pos_fill = "#D73027", neg_fill = "#313695")
  #凡例の設定
  #lgd = horizon_legend(lt, title = "MAX_Temperature")
  #凡例の描写
  #ComplexHeatmap::draw(lgd, x = unit(1, "npc") + unit(2, "mm"), just = "left")
  #x軸の追加
  spiral_axis(h = "top", curved_labels = TRUE, labels_gp = gpar(fontsize = 7))
  #スパイラルチャートタイトル
  grid.text("MAX_Temperature", x = 0, y = 1, just = c("left", "top"))
})

#最低気温のスパイラルチャートを格納
PlotList[[2]] = grid.grabExpr({
  #スパイラルチャート基本部分
  spiral_initialize_by_time(xlim = range(AnaData[, 1]),
                            unit_on_axis = "days",
                            period = "years",
                            period_per_loop = 10,
                            polar_lines_by = 360/10) #,
                            #vp_param = list(x = unit(0, "npc"), just = "left"))
  #トラックの追加
  spiral_track(height = 0.8)
  #気温のスパイラルチャート
  lt = spiral_horizon(AnaData[, 1], AnaData[, 3], use_bar = TRUE,
                      pos_fill = "#D73027", neg_fill = "#313695")
  #凡例の設定
  #lgd = horizon_legend(lt, title = "LOW_Temperature")
  #凡例の描写
  #ComplexHeatmap::draw(lgd, x = unit(1, "npc") + unit(2, "mm"), just = "left")
  #x軸の追加
  spiral_axis(h = "top", curved_labels = TRUE, labels_gp = gpar(fontsize = 7))
  #スパイラルチャートタイトル
  grid.text("LOW_Temperature", x = 0, y = 1, just = c("left", "top"))
})

#cowplotパッケージでプロット
plot_grid(plotlist = PlotList, ncol = 2, nrow = 1)

出力例


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

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