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))
########

###&#31354;&#12398;ggplot&#12434;&#20316;&#25104;#####
#&#12402;&#12394;&#24418;&#12391;&#12377;,&#12402;&#12394;&#24418;&#12398;&#20869;&#23481;&#12434;&#22793;&#26356;&#12375;&#12390;&#12356;&#12365;&#12414;&#12377;
TestGG <- ggplot(TestData, aes(x = Text, y = Date))
#&#12503;&#12525;&#12483;&#12488;
TestGG
########################
  
###&#12521;&#12505;&#12523;&#12434;&#22793;&#26356;&#12377;&#12427;:labs/xlab/ylab&#12467;&#12510;&#12531;&#12489;#####
##labs&#12467;&#12510;&#12531;&#12489;:title,subtitle,caption&#12394;&#12393;&#12398;&#22793;&#26356;&#12364;&#21487;&#33021;
#&#20363;:labs&#12467;&#12510;&#12531;&#12489;
TestGG + labs(x = "X&#36600;&#12398;&#12521;&#12505;&#12523;&#22793;&#26356;",
              y = "y&#36600;&#12398;&#12521;&#12505;&#12523;&#22793;&#26356;")

#xlab/ylab&#12467;&#12510;&#12531;&#12489;
TestGG + xlab(label = "X&#36600;&#12398;&#12521;&#12505;&#12523;&#22793;&#26356;") +
  ylab(label = "y&#36600;&#12398;&#12521;&#12505;&#12523;&#22793;&#26356;")
########

###&#12521;&#12505;&#12523;&#12398;&#20307;&#35009;&#12434;&#22793;&#26356;&#12377;&#12427;:guides/guide_axis&#12467;&#12510;&#12531;&#12489;#####
##guides&#12467;&#12510;&#12531;&#12489;&#12391;&#31532;&#20108;&#36600;&#21547;&#12417;&#12390;&#25351;&#23450;&#12375;guide_axis&#12467;&#12510;&#12531;&#12489;&#12391;
##&#35282;&#24230;,&#25351;&#23450;&#25968;&#12391;&#38542;&#27573;&#29366;&#12395;&#34920;&#31034;&#12377;&#12427;
TestGG + guides(x = guide_axis(n.dodge = 2),
                y = guide_axis(n.dodge = 3),
                #&#31532;&#20108;&#36600;
                x.sec = guide_axis(angle = 90),
                y.sec = guide_axis(angle = 45))
########

###dttm class&#12398;&#36600;&#35519;&#25972;#####
TestGG + 
  #scale_XXX_XXX&#12399;&#36600;&#12398;&#12487;&#12540;&#12479;&#12398;&#12415;&#12398;&#35519;&#25972;&#12394;&#12398;&#12391;
  #&#20307;&#35009;&#12399;guides&#12420;theme&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12377;&#12427;
  scale_y_datetime(
    #&#31532;&#19968;&#36600;&#35519;&#25972;
    #&#26376;/&#26085;/&#26332;&#26085;/&#24180;&#36890;&#31639;&#26085;&#25968;
    date_labels = "%b/%d/(%a)/[%j]",
    
    #&#31532;&#20108;&#36600;&#35519;&#25972;
    sec.axis =
    #&#31532;&#19968;&#36600;&#12392;&#21516;&#12376;&#12487;&#12540;&#12479;&#12391;&#12521;&#12505;&#12523;&#20869;&#23481;&#12434;&#22793;&#12360;&#12427;&#22580;&#21512;&#12399;
    #dup_axis&#12467;&#12510;&#12531;&#12489;&#12434;&#20351;&#29992;&#12377;&#12427;
      sec_axis(
        #&#22793;&#24418;&#12399;&#31186;&#12391;&#25351;&#23450;:&#20363;&#12399;&#26178;&#38291;*3600&#31186;(1&#26178;&#38291;&#12398;&#22793;&#26356;)
        trans = ~ . + 48*3600,
        #&#31532;&#20108;&#36600;&#12521;&#12505;&#12523;
        name = "Date_2",
        #&#26376;/&#26085;/&#26178;/&#21320;&#21069;&#21320;&#24460;
        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&#26360;&#24335;&#12391;&#12521;&#12505;&#12523;&#12398;&#20307;&#35009;&#12434;&#35519;&#25972;&#12377;&#12427;#####
###&#12300;ggtext&#12301;&#12497;&#12483;&#12465;&#12540;&#12472;&#12398;&#12300;element_markdown&#12467;&#12510;&#12531;&#12489;&#12301;&#12392;
###&#12300;glue&#12301;&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#20351;&#29992;&#12377;&#12427;&#12371;&#12392;&#12364;&#25313;&#24373;&#24615;&#12364;&#12354;&#12426;&#12362;&#12377;&#12377;&#12417;
if(!require("ggtext", quietly = TRUE)){
  install.packages("ggtext");require("ggtext")
}
if(!require("glue", quietly = TRUE)){
  install.packages("glue");require("glue")
}

#&#20363;&#12360;&#12400;Group&#12398;&#26368;&#24460;&#23614;&#12364;&#20598;&#25968;&#12398;&#26178;&#12300;&#22826;&#23383;&#12398;&#32209;&#12301;
#&#22855;&#25968;&#12398;&#26178;&#12300;&#12452;&#12479;&#12522;&#12483;&#12463;&#12398;&#40644;&#12301;&#12398;&#34920;&#31034;&#12395;&#12377;&#12427;
#&#12414;&#12378;&#12399;function&#12434;&#20316;&#25104;&#12377;&#12427;:markdown&#34920;&#35352;&#12399;
#&#12300;glue&#12301;&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#20351;&#29992;&#12377;&#12427;&#12392;&#31777;&#21336;&#12391;&#12377;
#XLab&#12398;&#20307;&#35009;
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>"))
}

#&#20363;&#12360;&#12400;Date&#12398;&#26085;&#12364;&#20598;&#25968;&#12398;&#26178;&#12300;&#22826;&#23383;&#12398;&#36196;&#12301;
#&#22855;&#25968;&#12398;&#26178;&#12300;&#12452;&#12479;&#12522;&#12483;&#12463;&#12398;&#38738;&#12301;&#12398;&#34920;&#31034;&#12395;&#12377;&#12427;
#&#12414;&#12378;&#12399;function&#12434;&#20316;&#25104;&#12377;&#12427;:markdown&#34920;&#35352;&#12399;
#&#12300;glue&#12301;&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#20351;&#29992;&#12377;&#12427;&#12392;&#31777;&#21336;&#12391;&#12377;
#YLab&#12398;&#20307;&#35009;
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>"))
  }
#&#12300;glue&#12301;&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#20351;&#29992;&#12375;&#12394;&#12356;&#22580;&#21512;
#JugeLabs <- function(x) {
#  ifelse(lubridate::day(x)%%2 == 0,
#         paste0("<b style='color:red'>", x, "</b>"),
#         paste0("<i style='color:blue'>", x, "</i>"))}

#&#12503;&#12525;&#12483;&#12488;
TestGG +
  scale_x_discrete(labels = XJugeLabs) +
  scale_y_datetime(labels = YJugeLabs) +
  #markdown&#34920;&#35352;&#12434;&#36969;&#24540;&#12377;&#12427;
  theme(axis.text.x = ggtext::element_markdown(angle = 45, hjust = 1.1),
        axis.text.y = ggtext::element_markdown())
########

###&#30446;&#30427;&#12426;&#12434;&#20869;&#20596;&#12395;&#12377;&#12427;#####
#axis.ticks.length&#12395;&#12510;&#12452;&#12490;&#12473;&#12434;&#35373;&#23450;&#12377;&#12427;
#axis.ticks.length.x/axis.ticks.length.y&#12364;&#12354;&#12427;
#&#26997;&#31471;&#12394;&#38263;&#12373;&#12395;&#12375;&#12390;&#12414;&#12377;
TestGG +
  theme(axis.ticks.length = unit(-10, "mm"))
#######

###&#30446;&#30427;&#12426;&#12398;&#33394;,&#22826;&#12373;&#12434;&#22793;&#12360;&#12427;#####
#theme&#12467;&#12510;&#12531;&#12489;&#12300;axis.ticks&#12301;&#12458;&#12503;&#12471;&#12519;&#12531;&#12395;
#&#12300;element_line&#12301;&#12467;&#12510;&#12531;&#12489;&#12395;&#35373;&#23450;&#12377;&#12427;
#axis.ticks.x/axis.ticks.y&#12364;&#12354;&#12427;
TestGG +
  theme(axis.ticks.length.x = unit(10, "mm"),
        axis.ticks = element_line(color = "red",
                                    size = 5))
#######

###&#36600;&#32218;&#12398;&#33394;,&#22826;&#12373;&#12434;&#22793;&#12360;&#12427;#####
#theme&#12467;&#12510;&#12531;&#12489;&#12300;axis.line&#12301;&#12458;&#12503;&#12471;&#12519;&#12531;&#12395;
#&#12300;element_line&#12301;&#12467;&#12510;&#12531;&#12489;&#12395;&#35373;&#23450;&#12377;&#12427;
#axis.line.x/axis.line.y&#12364;&#12354;&#12427;
TestGG +
  theme(axis.ticks.length.x = unit(10, "mm"),
        axis.line.x = element_line(color = "red",
                                   size = 2))
#######

###&#36600;&#32218;&#12434;&#30690;&#21360;&#12395;&#12377;&#12427;#####
#theme&#12467;&#12510;&#12531;&#12489;&#12300;axis.line&#12301;&#12458;&#12503;&#12471;&#12519;&#12531;&#12395;
#&#12300;element_line&#12301;&#12467;&#12510;&#12531;&#12489;&#12395;&#12300;grid::arrow&#12301;&#12434;&#35373;&#23450;&#12377;&#12427;
#&#30690;&#21360;&#12398;&#20301;&#32622;:end&#12458;&#12503;&#12471;&#12519;&#12531;:"last","first","both"
#&#30690;&#21360;&#12398;&#12473;&#12479;&#12452;&#12523;:type&#12458;&#12503;&#12471;&#12519;&#12531;:"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&#36600;&#12434;&#25351;&#23450;&#12375;&#12383;&#26085;&#12398;&#38291;&#38548;&#12395;&#22793;&#26356;&#12377;&#12427;#####
#lubridate&#12497;&#12483;&#12465;&#12540;&#12472;&#12392;&#32068;&#12415;&#21512;&#12431;&#12379;&#12390;function&#12434;&#20316;&#25104;&#12377;&#12427;
DaysLabsCreate <- function(day){
  function(x){
  ifelse(lubridate::day(x)%%day == 0,
         #&#12521;&#12505;&#12523;&#12398;&#12501;&#12457;&#12540;&#12510;&#12483;&#12488;&#12399;&#12371;&#12371;&#12391;&#22793;&#26356;&#12377;&#12427;
         format(x,'%Y_%b_%d'), "")
  }
}
#&#20363;&#12360;&#12400;
TestGG +
  scale_y_datetime(date_breaks = "1 day",
                   labels = DaysLabsCreate(day = 5))
#######

出力例

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

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

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

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