研究メモブログの目次

【R】R 描画&複数項目グラフ描画自動化の備忘録

こんにちは~、ガイです。今回はR グラフ描画の備忘録です。ChatGPT と相談しながらfor 文を使ってなるべくデータごとに詳細を変更しないで済むようにするスクリプトを書きました。

たとえば、以下の共通の操作の項目のところにインプットデータ例を示していますが、Open field test の場合だと描画すべき項目が「Distance moved」「Center freq」「Center dur」の三項目あり、これらすべてについて一個ずつコードを描くと、ほぼ同じコードを項目名だけ変えて三つ書かなくてはいけないわけです。時間もかかるし、アホらしいので、今回のはそれを回避するためのコードです。

一応この記事を書きながら動作確認していますが、もし動かなかったらごめんなさい。

改善点等お気づきの点がありましたらコメントもらえますとうれしいです。

はてなブログだと「」「」がリンク化してしまうので、防止のため変な空白を入れていますが、実行時には消したほうがいいかもしれません。

共通の操作

インプットファイルの作成:Excel で作成してCSV UTF-8(コンマ区切り)で保存

インプットファイルの項目名を区切るときは「-」ではなく「_」を使わないとめんどくさいことになるので注意したほうがいいです。個体ID(ID) と群名(group)行は作っておいて損はないかと思います。

R が得意な人はR 上でExcel を使うがごとく生データを操作するらしいのですが(そのほうがミスが少ないとのこと)、わたしはR 弱者なので必要な項目はExcel で先に作っておく派です。そのレベルの人間が書いている備忘録というのを頭の隅に置いておいてください。

以下のインプットデータ例で示しているのはわたしが適当に数字と群名をいじって作成したダミーです。生データではないのでご安心ください。

インプットファイルの例

Open field test のインプットファイル。時系列データの場合、時系列で分類する行を作る(今回なら「DAY」行)。

Elevated plus maze のインプットファイル

Morris water maze のインプットファイル

 

Session > Set Working Directory > Choose directory... で作業ディレクトリを選択し、以下のスクリプトを実行

# ライブラリの読み込み
library(ggplot2)
library(reshape2)
library(reshape)
library(ggrepel)
library(dplyr)
library(tidyverse)
library(readr)

# インプットファイルの読み込み
# input
data <- read_csv("path/to/input/input.csv")

# 中身の確認
head(data)

 

時系列プロットの作成

グループごと平均値の時系列プロット

日ごとの数値の変化の線グラフ

今回はOpen field test のインプットファイルを用いました。

# インプット(data)は上述の方法でcsv データを取り込む

# 変数名の整形と新しい変数の作成
data$group_name <- paste(data$group, "-day", data$DAY, "", sep = "")

# 平均値とSD の算出
# 4行目以降の列名(描画する数値の入った列たち)を取得して変数 columns に格納
columns <- colnames(data)[4:ncol(data)]
# columns リストから描画する値ではないgroup_name 列を削除
columns <- columns[columns != "group_name"]

# 各行の平均値と標準偏差(SD)を一気に算出
summary_data <- data %>%
  group_by(group_name) %>%
  summarize(across(all_of(columns), list(Average = mean, SD = sd)))

# 平均値とSD を格納したデータに描画のためのグループ分け列を追加
# summary_data にDAY 行を追加
 # summary_data データフレームに DAY 列を追加し、group_name の文字列から "-day" より後の部分を抽出して設定
 summary_data <- summary_data %>%
   mutate(DAY = sub(".+-day", "", group_name))
# summary_data にgroup 行を追加
 # summary_data データフレームに group 列を追加し、group_name の文字列から "day" より前の部分を抽出して設定
summary_data$group <- sub("-day.*", "", summary_data$group_name)
summary_data$group # うまくいっているかを確認

# 複数指標のグラフをfor 文で一度に描画する
# summary_data の列名を取得し、 列名から "_Average" と "_SD" を削除
new_colnames <- sub("_Average$|_SD$", "", colnames(summary_data))
# 重複する文字列を削除
new_colnames <- unique(new_colnames)
# 新しい列名を col_names に適用
col_names <- new_colnames
# NAを含む行を削除
col_names <- na.omit(col_names)
# col_names リストから描画する値を含まないgroup列を削除
col_names <- columns[columns != "group"]
col_names

# # Wild-type を先に並べたい
# そのままだとアルファベット順で描画されてしまうので順序を逆転させる
# summary_data の並び替え
# group列をファクターとして扱う
summary_data$group <- factor(summary_data$group)
# groupの順序を逆転させる
summary_data$group <- factor(summary_data$group, levels = rev(levels(summary_data$group)))
summary_data$group <- factor(summary_data$group)
view(summary_data)

# ggplotで線グラフを作成
# group ごとグラフを描く
# 2色のユニバーサルカラーを指定
# 色の設定
# オレンジ系のカラー
orange_color <- c("#FFA500")
# 青系のカラー
blue_color <- c("#5F9EA0")
# カラーカテゴリを結合してuniversal_colorsを作成
universal_colors <- c(blue_color, orange_color)

# group ごとの線グラフの作成 
for (col_name in col_names) {
  # グラフを作成
p <- ggplot(summary_data, aes(x = DAY, y = .data[ [ paste(col_name, "Average", sep = "_") ] ], color = group)) +
    geom_line(aes(group = group)) +  # groupをaes内で指定
  geom_point(data = summary_data, aes(x = DAY, y = .data[ [ paste(col_name, "Average", sep = "_") ] ], shape = group, color = group)) +
  geom_errorbar(aes(ymin = .data[ [ paste(col_name, "Average", sep = "_") ] ] - .data[ [ paste(col_name, "SD", sep = "_") ] ], ymax = .data[ [ paste(col_name, "Average", sep = "_") ] ] +
                      .data[ [ paste(col_name, "SD", sep = "_") ] ]), position = position_dodge(width = 0.05), width = 0.2) +
    labs(x = "DAY", y = col_name, title = paste(col_name)) +
    scale_color_manual(values = universal_colors) +
    scale_x_discrete() +  # x軸のスケールを設定
    theme_classic()
  # グラフを表示または保存(ここでは表示)
  print(p)
   # グラフを保存
  ggsave(file = paste0(col_name, ".pdf"), plot = p, width = 7, height = 5, dpi = 300)
}

一定期間だけ選択して時系列プロット

一定期間だけ選択して時系列プロット

ここではMorris water maze データを使い、TRIAL1~4 の期間だけに絞って時系列プロットを行います。

# インプットデータは上述の方法でdata に格納

# 変数名の整形と新しい変数(group_name)の作成
data$group_name <- paste(data$group, "-TRIAL", data$TRIAL, "", sep = "")
data$group_name # 確認

# データをグループ別にまとめ、各列の平均とSDを計算
# データを整形して折れ線グラフを作成

# 平均値とSD の算出
# 4行目以降の列名を取得して変数 columns に格納
columns <- colnames(data)[4:ncol(data)]
# columns リストから group_name 列を削除
columns <- columns[columns != "group_name"]
print(columns)

# 平均値と標準偏差(SD)の計算
summary_data <- data %>%
  group_by(group_name) %>%
  summarize(across(all_of(columns), list(Average = mean, SD = sd)))

# 欠損値のある指標があると「Caused by warning in `mean.default()`:
# !  引数は数値でも論理値でもありません。NA 値を返します」のようなエラーが出ます
# 生データを見直して、使う指標の場合は対策を講じる必要がありますが
# 今回は必要ないので無視して進みます

# 行名からTRIAL以降の数字を取り出し、新しい列(TrialNumber)を作成
summary_data$TrialNumber <- as.integer(sub(".*-TRIAL", "", summary_data$group_name))
# 行名から -TRIAL 以前の文字列を抽出して新しい列(group)を作成
summary_data$group <- sub("-TRIAL.*", "", summary_data$group_name)

# Wild-type を先に並べたい
# そのままだとアルファベット順で描画されてしまうので逆転させる
# group列をファクターとして扱う
summary_data$group <- factor(summary_data$group)
# groupの順序を逆転させる
summary_data$group <- factor(summary_data$group, levels = rev(levels(summary_data$group)))

# 今回はTRIAL1~4 だけをプロットしたいので、フィルタリング
# TrialNumberが5以下の行のみをフィルタリング
summary_data <- summary_data %>%
  filter(TrialNumber <= 5)

# 列名を取得  
# 列名から "_Average" と "_SD" を削除
new_colnames <- sub("_Average$|_SD$", "", colnames(summary_data))
# 重複する文字列を削除
new_colnames <- unique(new_colnames)
# 新しい列名を summary_data に適用
col_names <- new_colnames
# NAを含む行を削除
col_names <- na.omit(col_names)
# col_names リストから group列を削除
col_names <- columns[columns != "group"]
col_names

# 色の設定
# 青系のグラデーションカラー
blue_color <- c("#5F9EA0")
# オレンジ系のグラデーションカラー
orange_color <- c("#FFA500")
# カラーカテゴリを結合してuniversal_colorsを作成
universal_colors <- c(blue_color, orange_color)

# 各列名に対してグラフを生成
for (col_name in col_names) {
  # グラフを生成
p <- ggplot(summary_data, aes(x = TrialNumber, y = .data[ [ paste(col_name, "Average", sep = "_") ] ], group = group, color = group, linetype = group)) +
    geom_line(linewidth = 1, position = position_dodge(width = 0)) +
  geom_errorbar(aes(ymin = .data[ [ paste(col_name, "Average", sep = "_")] ] - .data[ [ paste(col_name, "SD", sep = "_") ] ], ymax = .data[ [ paste(col_name, "Average", sep = "_") ] ] +
                      .data[ [ paste(col_name, "SD", sep = "_") ] ]), position = position_dodge(width = 0.02), width = 0.2) +
    geom_point(aes(shape = group), size = 2, position = position_dodge(width = 0)) +
    labs(x = "Trial", y = col_name, title = paste(col_name, "DAY1", sep = " ")) +
    scale_linetype_manual(values = c("solid", "dashed")) +  # グループの線のスタイルを設定
    scale_color_manual(values = universal_colors) +
    theme_classic()
print(p)
ggsave(file = paste0(col_name, ".trial1-4.pdf"), plot = p, width = 5, height = 5, dpi = 300)
  }

個体データの時系列プロット

グループごとグラフと同じく、OFT 結果を用いました。

個体ごと時系列プロット
# インプット(data)は上述の方法でcsv データを取り込む

### 個体ごとプロットグラフを作成 ###
# オレンジ系のグラデーションカラー
orange_color <- c(
  "#FFD700", "#FFA500", "#FF8C00", "#FF6347",
  "#FF4500", "#FF0000")
# 青系のグラデーションカラー
blue_color <- c(
  "#0000FF", "#0000CD", "#4169E1", "#1E90FF",
  "#87CEEB", "#00BFFF", "#4682B4", "#5F9EA0",
  "#ADD8E6", "#B0E0E6", "#87CEFA", "#6495ED"
)
# カラーカテゴリを結合してuniversal_colorsを作成
universal_colors <- c(orange_color, blue_color)

# 列名のリスト
# 数値を含む4行目以降の列名を取得して変数 columns に格納
columns <- colnames(data)[4:ncol(data)]
# columnsから group_name 列を削除
columns <- columns[columns != "group_name"]
columns # ちゃんと格納できているかを確認

# Wild-typeを先に並べたいのでgroup 列の要素をアルファベットの逆順にする
# group列をファクターとして扱う
data$group <- factor(data$group)
# groupの順序を逆転させる
data$group <- factor(data$group, levels = rev(levels(data$group)))
data$group # ここでLevels: Wild_type HAPPY と表示されていれば図にも反映される


# for 文を用いて複数指標の値のプロットを一度に作成
for (col in columns) {
  # グラフを作成
  ind <- ggplot(data, aes(x = DAY, y = !!sym(col), shape = group, color = ID, linetype = group)) +
    geom_point(position = position_dodge(width = 0), size = 2.2) +
    geom_line() +
    geom_text(aes(label = ID), data = subset(data, DAY == max(DAY)), nudge_y = 1,  nudge_x = 0.2, check_overlap = FALSE, show.legend = FALSE, size = 3) +  # プロット上にIDを表示
    labs(x = "DAY", y = col) +
    scale_color_manual(values = universal_colors) +
    ggtitle(col) + 
    theme_classic()

  # グラフを表示
  print(ind)
  
  # グラフを保存
ggsave(filename = paste0(col, ".pdf"), plot = ind, width = 6, height = 7, dpi = 300)
}

グループごとに上下に分かれた個体データ時系列プロットの作成

グループごとに上下に分かれた個体データ時系列プロット
### グループ分けして個体ごとプロットグラフを作成 ###
# インプット(data)は上述の方法でcsv データを取り込む

# 色分け用の色設定
# オレンジ系のグラデーションカラー
orange_color <- c(
  "#FFD700", "#FFA500", "#FF8C00", "#FF6347",
  "#FF4500", "#FF0000")
# 青系のグラデーションカラー
blue_color <- c(
  "#0000FF", "#0000CD", "#4169E1", "#1E90FF",
  "#87CEEB", "#00BFFF", "#4682B4", "#5F9EA0",
  "#ADD8E6", "#B0E0E6", "#87CEFA", "#6495ED"
)
# カラーカテゴリを結合してuniversal_colorsを作成
universal_colors <- c(orange_color, blue_color)

# 列名のリスト
# 数値を含む4行目以降の列名を取得して変数 columns に格納
columns <- colnames(data)[4:ncol(data)]
# columnsから group_name 列を削除
columns <- columns[columns != "group_name"]
columns # ちゃんと格納できているかを確認

# Wild-typeを先に並べたいのでgroup 列の要素をアルファベットの逆順にする
# group列をファクターとして扱う
data$group <- factor(data$group)
# groupの順序を逆転させる
data$group <- factor(data$group, levels = rev(levels(data$group)))
data$group # ここでLevels: Wild_type HAPPY と表示されていれば図にも反映される


# for 文を用いて複数種類の値のプロットを一度に作成
for (col in columns) {
  # グラフを作成
  ind <- ggplot(data, aes(x = DAY, y = !!sym(col), shape = group, color = ID, linetype = group)) +
    geom_point(position = position_dodge(width = 0), size = 2.2) +
    geom_line() +
    geom_text(aes(label = ID), data = subset(data, DAY == max(DAY)), nudge_y = 1,  nudge_x = 0.2, check_overlap = FALSE, show.legend = FALSE, size = 3) +  # プロット上にIDを表示
    labs(x = "DAY", y = col) +
    scale_color_manual(values = universal_colors) +
    ggtitle(col) + 
    facet_grid(group ~ ., scales = "free_y") +  # groupごとに分割
    theme_classic()
  # グラフを表示
  print(ind)
  
  # グラフを保存
  ggsave(filename = paste0(col, ".png"), plot = ind, width = 6, height = 7, dpi = 300)
}

 

箱ひげ図の描画

グループで分けて個体ID で色分けした箱ひげ図の描画

インプットデータは上述のElevated plus maze 結果を使います。

グループごとの箱ひげ図
# インプットデータを上述の方法でdata に格納

# 列名のリストを作成
# 3 行目以降の列名を取得して変数 columns に格納
columns <- colnames(data)[3:ncol(data)]
columns # ちゃんとできているかを確認

# Wild-typeを先に並べたいのでgroup 列の要素をアルファベットの逆順に変更
# group列をファクターとして扱う
data$group <- factor(data$group)
# groupの順序を逆転させる
data$group <- factor(data$group, levels = rev(levels(data$group)))
data$group # ここでLevels: Wild_type HAPPY と表示されていれば図にも反映される

# 列ごと(各指標ごと)に箱ひげ図を作成して保存

## ユニバーサルカラーのグラフを描くために色を設定
# オレンジ系のグラデーションカラー
orange_color <- c("#FFA500", "#FF8C00", "#FF6347",
  "#FF4500", "#FF69B4",  "#FFB6C1")
# 青系のグラデーションカラー
blue_color <- c( "#4682B4", "#5F9EA0",
  "#ADD8E6", "#B0E0E6", "#87CEFA", "#6495ED")
# カラーカテゴリを結合してuniversal_colorsを作成
universal_colors <- c(orange_color, blue_color)

# 複数種類のグラフをfor 文で一度に描画する
for (col in columns) {
  # グラフを作成
  p <- ggplot(data, aes(x = group, y = !!sym(col), shape = group, color = ID)) +
    geom_boxplot(color = "#4d4d4d", size = 0.8) +
    geom_text(aes(label = ID), position = position_dodge(width = 0.5), vjust = -0.5, size = 3) +
    labs(x = "group", y = col) +
    geom_point(position = position_dodge(width = 0), size = 2.2) + # position = position_dodge(width = 0)の値を変えることでプロットの横方向の散らばり度合いは変更可能
    scale_color_manual(values = universal_colors) +
    ggtitle(col) + 
    theme_classic()
  
  # グラフを表示
  print(p)
  
  # グラフを保存
  ggsave(filename = paste0(col, ".png"), plot = p, width = 6, height = 8, dpi = 300)
}

 

複数の箱ひげ図を一枚の図にプロット

上と同じくEPM データを用います。

複数のグラフを一枚の図にプロット
# 必要なパッケージのインストール
install.packages("gridExtra")

# 読み込み
library(gridExtra)

# 列名のリスト
# 3 行目以降の列名を取得して変数 columns に格納
columns <- colnames(data)[3:ncol(data)]
columns

# Wild-typeを先に並べたい
# group列をファクターとして扱う
data$group <- factor(data$group)
# groupの順序を逆転させる
data$group <- factor(data$group, levels = rev(levels(data$group)))
data$group # ここでLevels: Wild_type HAPPY と表示されていれば図にも反映される


## ユニバーサルカラーのグラフを描くために色を設定
# オレンジ系のグラデーションカラー
orange_color <- c("#FFA500", "#FF8C00", "#FF6347",
  "#FF4500", "#FF69B4",  "#FFB6C1")
# 青系のグラデーションカラー
blue_color <- c( "#4682B4", "#5F9EA0",
  "#ADD8E6", "#B0E0E6", "#87CEFA", "#6495ED")

# カラーカテゴリを結合してuniversal_colorsを作成
universal_colors <- c(orange_color, blue_color)

# グラフを格納するリストを作成
plot_list <- list()

for (col in columns) {
  # グラフを作成
  p <- ggplot(data, aes(x = group, y = !!sym(col), shape = group, color = ID)) +
    geom_boxplot(color = "#4d4d4d", size = 0.8) +
    geom_text(aes(label = ID), position = position_dodge(width = 0.5), vjust = -0.5, size = 3) +
    labs(x = "group", y = col) +
    geom_point(position = position_dodge(width = 0), size = 2.2) + # position = position_dodge(width = 0)の値を変えることでプロットの横方向の散らばり度合いは変更可能
    scale_color_manual(values = universal_colors) +
    ggtitle(col) + 
    theme_classic()
  # グラフをリストに追加
plot_list [ [ col ] ] <- p
}

# グラフを1枚の図に配置
g <- grid.arrange(grobs = plot_list, ncol = 3)  # ncol は列の数を指定
# ncol を2 にすると2 列のグラフ、3 にすると3 列のグラフができる
# 上の例は3 列

# グラフを保存
ggsave(filename = paste0("plot_list.png"), plot = g, width = 10, height = 15, dpi = 300)

特定の列の値が一致するものでグルーピングしたボックスプロットを作成

ここではMWMデータを使い、TRIAL30~90 の期間だけに絞ってTRIAL ごとに分けて同じ指標のボックスプロットを描画します。

TRIAL の値が一致するものでグルーピングしたボックスプロットを作成
# インプットデータは上述の方法でdata に格納
# 変数名の整形と新しい変数(group_name)の作成
data$group_name <- paste(data$group, "-TRIAL", data$TRIAL, "", sep = "")
data$group_name # 確認

# 平均値とSD の算出
# 4行目以降の列名を取得して変数 columns に格納
columns <- colnames(data)[4:ncol(data)]
# columns リストから group_name 列を削除
columns <- columns[columns != "group_name"]
print(columns)

# 平均値とSD 値の計算
summary_data <- data %>%
  group_by(group_name) %>%
summarize(across(all_of(columns), list(Average = mean, SD = sd)))
# 欠損値のある指標があると「Caused by warning in `mean.default()`:
# !  引数は数値でも論理値でもありません。NA 値を返します」のようなエラーが出ます
# 生データを見直して、使う指標の場合は対策を講じる必要がありますが
# 今回は必要ないので無視して進みます

# 行名からTRIAL以降の数字を取り出し、新しい列(TrialNumber)を作成
summary_data$TrialNumber <- as.integer(sub(".*-TRIAL", "", summary_data$group_name))
# 行名から -TRIAL 以前の文字列を抽出して新しい列(group)を作成
summary_data$group <- sub("-TRIAL.*", "", summary_data$group_name)

# TrialNumberが10以上の行のみをフィルタリング
summary_data <- summary_data %>%
  filter(TrialNumber >= 10)
data <- data %>%
  filter(TRIAL >= 10)

# 列名を取得  
# 列名から "_Average" と "_SD" を削除
new_colnames <- sub("_Average$|_SD$", "", colnames(summary_data))
# 重複する文字列を削除
new_colnames <- unique(new_colnames)
# 新しい列名を col_names に適用
col_names <- new_colnames
# NAを含む行を削除
col_names <- na.omit(col_names)
# col_names リストから group列を削除
col_names <- columns[columns != "group"]
col_names

### グループごとボックスプロット作成 ###

# オレンジ系のグラデーションカラー
orange_color <- c(
  "#FFA500", "#FF8C00", "#FFB6C1")
# 青系のグラデーションカラー
blue_color <- c("#006cfa", "#0000FF","#6495ED")
# カラーカテゴリを結合してuniversal_colorsを作成
universal_colors <- c(orange_color, blue_color)

# 列(値)ごとに箱ひげ図を作成して保存

# Wild-type を先に並べたい
# group列をファクターとして扱う
summary_data$group <- factor(summary_data$group)
# groupの順序を逆転させる
# summary_data
summary_data$group <- factor(summary_data$group, levels = rev(levels(summary_data$group)))
summary_data$group
# group
# group列をファクターとして扱う
data$group <- factor(data$group)
# groupの順序を逆転させる
data$group <- factor(data$group, levels = rev(levels(data$group)))

# for 文でまとめて描画
for (col_name in col_names) {
  # グラフを作成
p <- ggplot(summary_data, aes(x = group, y = .data[ [ paste(col_name, "Average", sep = "_") ] ], group = group)) +
    geom_point(data = data, aes(x = group, y = !!sym(col_name), shape = group, color = ID)) +
    geom_boxplot(data = data, aes(x = group, y = !!sym(col_name)), fill = NA, outlier.shape = NA, color = "#4d4d4d", size = 0.5) +
    labs(x = "group", y = col_name, title = paste(col_name, "DAY2", sep = " ")) +
    scale_color_manual(values = universal_colors) +
    facet_wrap(. ~ TRIAL) +
    theme_classic()
  
  # グラフを表示
  print(p)
  # グラフを保存
  ggsave(file = paste0(col_name, ".box.png"), plot = p, width = 15, height = 5, dpi = 300)
}

 

R 描画におけるChatGPT の活用

最近コードのことは大体ChatGPT に解説してもらっています。また、R での描画も「こんな感じの形式のデータでこんなグラフを描きたい」と相談すると結構スクリプトを書いてくれます。それを自分であらためてR で確認しながら進めるのと、必ずしも正解を導いてくれるわけではないので時間はかかりますが、その方法だと初心者でもコードが描きやすいです。

何回同じこと訊いてもChatGPT は絶対に怒らないので、プログラミング初心者にはけっこう良い気がしています。このごろはコードは専らChatGPT に相談しつつ書いています。

カラーコードを書いてもらう

たとえば、12 個体ずつの2 群のデータを塗り分けたいときに、グループごとに同系統の色にしたいが個体でも色分けしたい、という場合があると思います。

そういうとき、24 個体分のユニバーサルカラーを自分で引っ張ってくるのは大変なので、わたしは「オレンジ系のグラデーションカラーと青系のグラデーションカラーのコードをそれぞれグループ化して12色ずつ教えてください。被りがないようにお願いいたします。それぞれをorange_color という変数とblue_color という変数に格納し、それらを統合してuniversal_colorsという変数を作ってください」という風にChatGPT にお願いします。

今回返ってきた答えは以下のものです。

以下は、オレンジ系と青系のグラデーションカラーコードをグループ化して変数に格納し、最終的にuniversal_colorsという変数に統合する方法です。

R
# オレンジ系のグラデーションカラー
orange_color <- c( "#FFD700", "#FFA500", "#FF8C00", "#FF6347", "#FF4500", "#FF0000", "#FF69B4", "#FF1493", "#FFB6C1", "#FFC0CB", "#FF69B4", "#FF1493" ) # 青系のグラデーションカラー
blue_color <- c( "#0000FF", "#0000CD", "#4169E1", "#1E90FF", "#87CEEB", "#00BFFF", "#4682B4", "#5F9EA0", "#ADD8E6", "#B0E0E6", "#87CEFA", "#6495ED" ) # グループ化されたカラーコードを統合
universal_colors <- c(orange_color, blue_color)

これで、universal_colors 変数にはオレンジ系と青系のグラデーションカラーコードが統合されています。

 

これをコピーしてR で実行すればユニバーサルカラーパレットの完成です。

 

コードを解説してもらう

たとえば、今回の「一定期間だけ選択して時系列プロット」のfor 文の中身が、何をしているコードなのかを知りたい場合

以下のコードが何をしているのか、一動作ごとにコメントを入れてもらえますか?

「# 各列名に対してグラフを生成 for (col_name in col_names) { # グラフを生成 p <- ggplot(summary_data, aes(x = TrialNumber, y = .datapaste(col_name, "Average", sep = "_"), group = group, color = group, linetype = group)) + geom_line(linewidth = 1, position = position_dodge(width = 0)) + geom_errorbar(aes(ymin = .datapaste(col_name, "Average", sep = "_") - .datapaste(col_name, "SD", sep = "_"), ymax = .datapaste(col_name, "Average", sep = "_") + .datapaste(col_name, "SD", sep = "_")), position = position_dodge(width = 0.02), width = 0.2) + geom_point(aes(shape = group), size = 2, position = position_dodge(width = 0)) + labs(x = "Trial", y = col_name, title = paste(col_name, "DAY1", sep = " ")) + scale_linetype_manual(values = c("solid", "dashed")) +  # グループの線のスタイルを設定 scale_color_manual(values = universal_colors) + theme_classic() print(p) ggsave(file = paste0(col_name, ".trial1-4.pdf"), plot = p, width = 5, height = 5, dpi = 300) }」

 

という質問を投げてみました。

すると

以下のコードは、指定された列名(col_namesで指定)に対して次のアクションを実行しています。コメントをつけて、一つずつ説明します。

R
# 各列名に対してグラフを生成
for (col_name in col_names) {
# グラフを生成
p <- ggplot(summary_data, aes(x = TrialNumber, y = .datapaste(col_name, "Average", sep = "_"), group = group, color = group, linetype = group)) +
geom_line(linewidth = 1, position = position_dodge(width = 0)) + # 折れ線グラフを描画
geom_errorbar(aes(ymin = .datapaste(col_name, "Average", sep = "_") - .datapaste(col_name, "SD", sep = "_"), ymax = .datapaste(col_name, "Average", sep = "_") + .datapaste(col_name, "SD", sep = "_")), position = position_dodge(width = 0.02), width = 0.2) + # エラーバーを描画
geom_point(aes(shape = group), size = 2, position = position_dodge(width = 0)) + # 点をプロット labs(x = "Trial", y = col_name, title = paste(col_name, "DAY1", sep = " ")) + # x軸、y軸、タイトルを設定
scale_linetype_manual(values = c("solid", "dashed")) + # グループの線のスタイルを設定
scale_color_manual(values = universal_colors) + # グループごとのカラーを設定
theme_classic() # グラフのテーマをclassicに設定
print(p) # グラフを表示
ggsave(file = paste0(col_name, ".trial1-4.pdf"), plot = p, width = 5, height = 5, dpi = 300) # グラフをPDFファイルとして保存
}

このコードは、指定された列名ごとにデータを使ってグラフを生成し、それを表示し、PDFファイルとして保存しています。

 

こんな感じでコードの説明をしてもらうこともできます。