スパイラルチャートを手軽に作成できるパッケージの紹介です。よく使いそうなコマンドと気象庁からダウンロードできる札幌の気温データを使用した例を紹介します。
スパイラルチャートはアルキメデスの螺旋に沿ってプロットし表現する手法で、大規模なデータを視認するのに便利です。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)
出力例

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