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

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

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

「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軸を指定した日の間隔に変更する

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

このコードの続きを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.