本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

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

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

スパイラルチャートはアルキメデスの螺旋に沿ってプロットし表現する手法で、大規模なデータを視認するのに便利です。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)

出力例

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

このコードの続きをAIに聞く

スポンサーリンク
Prices and shipping availability may change. Please refer to the product page at time of purchase.
Content displayed on this site is provided by Amazon and may be updated or removed.
Amazon Associate, karada-good earns income through qualifying sales.