以前、時系列データの折れ線グラフ表示について、下記リンクの投稿をさせていただきました。
今回は、前回表示した気温変化に加え、湿度変化についても同じ図にのせて表示したいと思います。
「単位や、推移するスケールも違うのでは?」
それを一度に解決すべく、両側2軸の別目盛を使って、違うスケールのものを一つに美しく表示しよう!というものです。
◆今回のポイント
①ggplot2のパッケージを使う。
②左側の軸はそのまま、右軸を整える。
③グラフの表示を調整する
④できた図でプレゼンテーション!
では、前回同様、気象庁が公表する熊本のデータを活用します。
こちらから得られたデータを、列名を英語で入れ、不要な情報は削除し、csvで保存(temp_pressure_kumamoto2020.csv)しました。
①
temp_pressure_kumamoto2020<-read.csv("temp_pressure_kumamoto2020.csv") head(temp_pressure_kumamoto2020) Day Temperature Atmospheric_pressure 1 2020/1/1 3.4 1025.1 2 2020/1/2 6.4 1023.4 3 2020/1/3 6.9 1020.0 4 2020/1/4 6.7 1018.2 5 2020/1/5 7.2 1022.8 6 2020/1/6 9.5 1021.9 temp_pressure_kumamoto2020[,1]<- as.Date(temp_pressure_kumamoto2020[,1],"%Y/%m/%d") #1 head(temp_pressure_kumamoto2020) Day Temperature Atmospheric_pressure 1 2020-01-01 3.4 1025.1 2 2020-01-02 6.4 1023.4 3 2020-01-03 6.9 1020.0 4 2020-01-04 6.7 1018.2 5 2020-01-05 7.2 1022.8 6 2020-01-06 9.5 1021.9 library(ggplot2) library(scale) ggplot()+geom_line(data =temp_pressure_kumamoto2020, aes(x=Day, y=Temperature, color="Temperature"))+ geom_line(data =temp_pressure_kumamoto2020, aes(x=Day, y=Atmospheric_pressure, color="Atmosphere_pressure"))+ #2 theme_bw()+theme(text=element_text(size=14))+ #3 scale_x_date(breaks = seq(as.Date("2020-01-01"), as.Date("2020-12-31"), by="2 month"),labels=date_format("%Y/%m")) #4
#1 as.DateでDayの日付情報を日付と認識させます。
#2 ggplot2のパッケージで可視化を行います。以下、前の投稿にも書いていますが、念の為。
geome_line(data=データ名, aes(x=横軸はDayの列, y=縦軸はTemperatureの列, color=”このデータの名称(後で色名の指定とつなげる)”)) を意味します。
#3 theme_bw()は、ggplot2の表示のデザインの指示(theme_ の指示はこちらのサイトが詳しいですね。御参考まで。)で、数値がわかりやすいように横線縦線ありのデザインを使いました。
#4 scaleパッケージでX軸表示の調整します。
scale_x_date(breaks = seq(as.Date(“最初の日付”), as.Date(“最後の日付”), by=”何か月おきの表示”), labels=date_format(“%年/%月”))年月表示にしました。
表示されたものだと、スケールが大きく異るため、Temperature(気温)とAtmosphere_pressure(気圧)の変化が読み取りにくい図となっています。
②③
では、左の軸を気温(Temperature)、右に新しく軸を作り、気圧(Atmosphere_pressure)を表示します。
変化がわかりやすいような目盛調整を行いました。
#1 y軸の幅指定
y1.lim <- c(0, 40) #左軸 temperature
y2.lim <- c(860, 1040) #右軸 Atmospheric_pressure
#2 気圧の数値を、上記y1.limとy2.limの幅で記載する際に、各数値を調整
variable_scaler<- function(p, lim1, lim2){ #pとlim1とlim2に対する処理を{}にかく
to_zero <- p-lim2[1] #lim2[1]は、軸スケールの最小値。#4でlim2は、y2.lim(右軸)であり、y2.limの最小値は860。pは気圧の各数値。
y1_range <- lim1[2]-lim1[1] #lim1[2]はy1.limの最大値から、lim1[1]はy1.limの最小値を引いたものがy1.lim(左軸)幅ということ。
y2_range <- lim2[2]-lim2[1] #上記と同様y2.lim(右軸)の幅
scaled <- to_zero*y1_range/y2_range # 気圧の各数値から、最小値860をひく。これに、y1幅/y2幅をかける。y2(右軸)の幅表示をy1(左軸)の幅表示に合わせる作業。
from_zero <- scaled + lim1[1] # 左軸の最小値をゼロとするため、もし0以上であれば、その分y1の最小値を足しておく。
return(from_zero)} #2 この関数を使えば、数値の修正が簡単。
#3 y2.lim(右軸)の目盛表示を調整。左軸情報から右軸を作成する。
axis_scaler <- function(p, lim1, lim2){ #pは#4でいうところの.になる。.は左軸情報を表す。左軸とlim1とlim2に対する処理を{}にかく
to_zero <- p-lim1[1] #左軸の数値-y1(左軸)の最小値
y1_range <- lim1[2]-lim1[1]
y2_range <- lim2[2]-lim2[1] # variable_scalerの同じ表記のところと同じ意味
scaled <- to_zero*y2_range/y1_range #pは、左軸情報として最小〜最大値があるので、それぞれにy2幅/y1幅をかけることで、左軸情報が右軸情報に変える。
from_zero <- scaled + lim2[1] #右軸の最小値分足しておく。
return(from_zero)} #3 この関数を使えば、数値の修正が簡単。
#4 作図
ggplot()+geom_line(data=temp_pressure_kumamoto2020, aes(x=Day, y=Temperature, color="Temperature")) +
geom_line(data=temp_pressure_kumamoto2020, aes(x=Day, y=variable_scaler(Atmospheric_pressure, y1.lim, y2.lim), color="Atmospheric_pressure")) + scale_y_continuous(limit=y1.lim, breaks=c(0,10,20,30,40), sec.axis=sec_axis(~(azis_scaler(., y1.lim, y2.lim)), breaks=c(850,900,950,1000,1050), name="Atmospheric_pressure") )+ theme_bw()+theme(text=element_text(size=14),legend.position = c(0.98, 0.98),legend.justification = c(0.98, 0.98), legend.background=element_rect(fill="white",color="black"))+scale_x_date(breaks = seq(as.Date("2020-01-01"), as.Date("2020-12-31"), by="2 month"),labels=date_format("%Y/%m")) #4
各コードの横に意味を書いています。
#以降は、コードとして反映しないでください。コードの意味を書いてますということです。
#1 温度(y1.lim 右の縦軸)は0〜40で、気圧(y2.lim 左の縦軸)は860〜1040で表示せよ。のコード。
※後で軸の区切りを4つに揃えて、変化がわかりやすくするためです。データから最終的な表示をイメージして設定するのが良いかと思います。
#2 主にデータ情報を右軸に合わせるための関数になります。ここで初めてfunction関数が出てきます。
variable_scaler (左軸) <- function (p, lim1, lim2) { pとlim1とlim2は、こういう計算をして出しますという処理内容}
ここでは、最終的に、#3のaes(x=Day, y=variable_scaler(Atmospheric_pressure, y1.lim, y2.lim), で使用するので、気圧の数値を設定したy1.limとy2.limの幅で記載する際に、数値を調整するfunction関数になります。
#3 y2.lim(右軸)の目盛表示を調整する関数です。作業としては、左軸情報から右軸を作成しています。
ここでは、最終的に、#3のsec.axis=sec_axis(~(axis_scaler(., y1.lim, y2.lim)), breaks=c(850,〜で使用します。sec.axisは2つめの軸、つまり右軸について使われます。
#4 #2と#3で作ったfunction関数については、それぞれ該当ヶ所を対応する色に変えています。
scale_y_continuous(limit=y1.lim, breaks=c(左軸目盛で表示する数値を順番に記載)〜
legend.position = c(0.98, 0.98),legend.justification = c(0.98, 0.98), で、凡例の場所を指定しました。右上の端に。ということですね。
以下、上記コードによる作図です。
拡大して表示したことで、Atmospheric_pressureの気圧が1月から、夏に向かって下降し、秋冬に向けてまた上昇していることがわかりました。
Temperatureの気温が上昇する時期に気圧は下降し、気温が下降する時期に気圧は上昇し、概ね逆の動きをする傾向があることがわかりました。
ただ、気圧は7月初旬、9月初旬に最小のピークがあり、8月に最大のピークが気温との逆の動きで必ずしも一致しているわけではないようでした。
このように、1軸で表した一つ目の図だと見えなかったものが、2軸を使って表現することで1つの図からも読み取れるようになりました。
④
コメント