Rで解析:「ggplot2」の軸の体裁を色々整える

Rの解析に役に立つ記事

「ggplot2」パッケージの軸の体裁を色々整えるコマンドの紹介です。ラベルの変更、第二軸の追加と体裁の調整、dttm classの調整、「ggtext」と「glue」パッケージを利用してmarkdown書式でラベルの体裁を調整、グラフの目盛りを内側するコマンドです。

windows11のR version 4.2.2で確認しています。

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

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

「ggplot2」パッケージを含む、「tidyverse」パッケージを利用します。

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

実行コマンドの紹介

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

#ggplot2を含むtidyverseパッケージの読み込み
library("tidyverse")
#日付データの作成に便利:lubridateパッケージがなければインストール
if(!require("lubridate", quietly = TRUE)){
  install.packages("lubridate");require("lubridate")
}

###データ例の作成#####
set.seed(1234)
n <- 30
TestData <- tibble(Group = sample(paste0("Group ", 1:5),
                                  n, replace = TRUE),
                   Date = seq(lubridate::ymd("2022-12-01", locale = "C",
                                             tz = "Asia/Tokyo"),
                              by = "1 day", length.out = n),
                   Text = sample(paste0("KARADA_Good_", 1:5),
                                 n, replace = TRUE))
########

###空のggplotを作成#####
#ひな形です,ひな形の内容を変更していきます
TestGG <- ggplot(TestData, aes(x = Text, y = Date))
#プロット
TestGG
########################
  
###ラベルを変更する:labs/xlab/ylabコマンド#####
##labsコマンド:title,subtitle,captionなどの変更が可能
#例:labsコマンド
TestGG + labs(x = "X軸のラベル変更",
              y = "y軸のラベル変更")

#xlab/ylabコマンド
TestGG + xlab(label = "X軸のラベル変更") +
  ylab(label = "y軸のラベル変更")
########

###ラベルの体裁を変更する:guides/guide_axisコマンド#####
##guidesコマンドで第二軸含めて指定しguide_axisコマンドで
##角度,指定数で階段状に表示する
TestGG + guides(x = guide_axis(n.dodge = 2),
                y = guide_axis(n.dodge = 3),
                #第二軸
                x.sec = guide_axis(angle = 90),
                y.sec = guide_axis(angle = 45))
########

###dttm classの軸調整#####
TestGG + 
  #scale_XXX_XXXは軸のデータのみの調整なので
  #体裁はguidesやthemeコマンドを使用する
  scale_y_datetime(
    #第一軸調整
    #月/日/曜日/年通算日数
    date_labels = "%b/%d/(%a)/[%j]",
    
    #第二軸調整
    sec.axis =
    #第一軸と同じデータでラベル内容を変える場合は
    #dup_axisコマンドを使用する
      sec_axis(
        #変形は秒で指定:例は時間*3600秒(1時間の変更)
        trans = ~ . + 48*3600,
        #第二軸ラベル
        name = "Date_2",
        #月/日/時/午前午後
        labels = scales::time_format("%b_%d_%I_%p")
  )) +
  guides(x = guide_axis(n.dodge = 2),
         y = guide_axis(n.dodge = 3),
         y.sec = guide_axis(angle = -45))
########

###markdown書式でラベルの体裁を調整する#####
###「ggtext」パッケージの「element_markdownコマンド」と
###「glue」パッケージを使用することが拡張性がありおすすめ
if(!require("ggtext", quietly = TRUE)){
  install.packages("ggtext");require("ggtext")
}
if(!require("glue", quietly = TRUE)){
  install.packages("glue");require("glue")
}

#例えばGroupの最後尾が偶数の時「太字の緑」
#奇数の時「イタリックの黄」の表示にする
#まずはfunctionを作成する:markdown表記は
#「glue」パッケージを使用すると簡単です
#XLabの体裁
XJugeLabs <- function(x) {
  ifelse(as.numeric(str_sub(x, -1)) > 3,
         glue::glue("<b style='color:green; font-size:20pt;'>{x}</b>"),
         glue::glue("<i style='color:black; font-size:13pt;'>{x}</i>"))
}

#例えばDateの日が偶数の時「太字の赤」
#奇数の時「イタリックの青」の表示にする
#まずはfunctionを作成する:markdown表記は
#「glue」パッケージを使用すると簡単です
#YLabの体裁
YJugeLabs <- function(x) {
  ifelse(lubridate::day(x)%%2 == 0,
         glue::glue("<b style='color:red; font-size:15pt;'>
                    {format(x,'%b_%d_%I_%p')}</b>"),
         glue::glue("<i style='color:blue; font-size:13pt;'>
                    {format(x,'%b_%d_%I_%p')}</i>"))
  }
#「glue」パッケージを使用しない場合
#JugeLabs <- function(x) {
#  ifelse(lubridate::day(x)%%2 == 0,
#         paste0("<b style='color:red'>", x, "</b>"),
#         paste0("<i style='color:blue'>", x, "</i>"))}

#プロット
TestGG +
  scale_x_discrete(labels = XJugeLabs) +
  scale_y_datetime(labels = YJugeLabs) +
  #markdown表記を適応する
  theme(axis.text.x = ggtext::element_markdown(angle = 45, hjust = 1.1),
        axis.text.y = ggtext::element_markdown())
########

###目盛りを内側にする#####
#axis.ticks.lengthにマイナスを設定する
#axis.ticks.length.x/axis.ticks.length.yがある
#極端な長さにしてます
TestGG +
  theme(axis.ticks.length = unit(-10, "mm"))
#######

###目盛りの色,太さを変える#####
#themeコマンド「axis.ticks」オプションに
#「element_line」コマンドに設定する
#axis.ticks.x/axis.ticks.yがある
TestGG +
  theme(axis.ticks.length.x = unit(10, "mm"),
        axis.ticks = element_line(color = "red",
                                    size = 5))
#######

###軸線の色,太さを変える#####
#themeコマンド「axis.line」オプションに
#「element_line」コマンドに設定する
#axis.line.x/axis.line.yがある
TestGG +
  theme(axis.ticks.length.x = unit(10, "mm"),
        axis.line.x = element_line(color = "red",
                                   size = 2))
#######

###軸線を矢印にする#####
#themeコマンド「axis.line」オプションに
#「element_line」コマンドに「grid::arrow」を設定する
#矢印の位置:endオプション:"last","first","both"
#矢印のスタイル:typeオプション:"open","closed"
TestGG +
  theme(axis.line.x = element_line(arrow = arrow(length = unit(1, "cm"), 
                                                 ends = "both",
                                                 type = "open"),
                                   color = "red",
                                   size = 2))
########

###dttm class軸を指定した日の間隔に変更する#####
#lubridateパッケージと組み合わせてfunctionを作成する
DaysLabsCreate <- function(day){
  function(x){
  ifelse(lubridate::day(x)%%day == 0,
         #ラベルのフォーマットはここで変更する
         format(x,'%Y_%b_%d'), "")
  }
}
#例えば
TestGG +
  scale_y_datetime(date_breaks = "1 day",
                   labels = DaysLabsCreate(day = 5))
#######

出力例

各画像はクリックで拡大表示されます。

ラベルを変更する:labs/xlab/ylabコマンド
ラベルの体裁を変更する:guides/guide_axisコマンド
dttm classの軸調整
markdown書式でラベルの体裁を調整する
目盛りを内側にする
目盛りの色,太さを変える
軸線の色,太さを変える
軸線を矢印にする
dttm class軸を指定した日の間隔に変更する

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

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