# グラフの描画 ---- # 処理結果は数値だけではわかりにくいので,グラフなど図示されることが多いです. # もちろんRにも強力なグラフ作成機能があります. # 最初から用意されているパッケージを利用してグラフを作成することもできますが,ここではggplot2を利用して作成する手順を説明します. # まず標準では使用するパッケージがインストールされていないので,パッケージをインストールします. install.packages("ggplot2") # インストールできたら,ロードしておきます. library("ggplot2") # これで利用する準備ができました.なお繰り返しになりますが,標準で提供されていないパッケージは毎回セッションを開くたびに自分でロードしてください(面倒なら.Rprofileに追記しておいてください) # ggplot2によるグラフ作成 ---- # 参考になるページのURL # https://kazutan.github.io/fukuokaR11/intro_ggplot2.html # # ggplot2はdata.frame型のオブジェクトをグラフ化します. # そのためまずはdata.frame型のオブジェクトを用意します. # ここでは既にDS1-resume02.Rで作成しておそらく残っているdata5を利用します # もしなければ, # 次のサイト https://baseball.yahoo.co.jp/npb/stats/batter?series=1 のヘッダー以外のデータをコピー # 例えば,clipboard001.txtに貼り付け data5=scan("clipboard001.txt", sep = "\t", what=list(順位=numeric(0),選手名="",チーム="",打率=numeric(0),試合=numeric(0),打席=numeric(0),打数=numeric(0),安打=numeric(0),二塁打=numeric(0),三塁打=numeric(0),本塁打=numeric(0),塁打=numeric(0),打点=numeric(0),得点=numeric(0),三振=numeric(0),四球=numeric(0),死球=numeric(0),犠打=numeric(0),犠飛=numeric(0),盗塁=numeric(0),盗塁死=numeric(0),併殺打=numeric(0),出塁率=numeric(0),長打率=numeric(0),OPS=numeric(0),得点圏=numeric(0),失策=numeric(0))) data5 = data.frame(data5) # オブジェクトにプロットをセット p=ggplot() # 表示はオブジェクトをコンソールでEnterでOK p # 枠だけしかないです # 棒グラフの作成 ---- # いろいろなグラフが作成できますが,まず棒グラフを作成してみます # ggplot()にdataやmappingを直接指定する書き方も可能ですが,今回はgeom_のコマンドで指定するやり方で書きます # geom_bar()コマンドでpの上に重ねます # geom_bar()のmappingにaex()でそれぞれx,y軸に使う列名を指定,dataに使用するデータフレームを設定します p1=p+geom_bar(mapping=aes(x=選手名, y=安打), data=data5, stat="identity") p1 # 今度は棒グラフが表示されたはず # aex()にfillで塗り分けたい情報の列を指定すると色分けしてくれます p1=p+geom_bar(mapping=aes(x=選手名, y=安打, fill=チーム), data=data5, stat="identity") p1 # 日本語が文字化けしているのは,現在のRStudio.Cloudでは回避方法を見つけられていません # ただし後で説明しますが,日本語フォントを指定してpdfに出力すれば文字化けしません # グラフの出力 ---- # 作成したグラフをpdf形式で保存するにはggsave()で拡張子が".pdf"のファイルを指定すればよい # まず出力したい図を呼び出して,ggsave() p1 ggsave("sample1.pdf", family="Japan1GothicBBB") # こっちでもOK ggsave("sample1.pdf", plot=p1, family="Japan1GothicBBB") # family="Japan1GothicBBB"は日本語フォントの指定,Japan1も使えます # ないと文字が化ける # 横幅,高さはそれぞれwidthとheightで指定できる # サイズ指定のデフォルトはインチ,センチメートルに変える場合は # units="cm" ggsave("sample1.pdf", plot=p1, width=18, height=8, units="cm", family="Japan1GothicBBB") # 後の実習で内容を文字化けしていない状態で,確認したければ適宜pdfに出力して確認するよい # 積み上げ型棒グラフの作成 ---- # 先ほどの棒グラフは単純に横方向に度数が並んだ棒グラフでしたが,例えば安打に二塁打を積み重ねて描きたいなどは積み上げ型棒グラフが必要になります # ggplot2ではデータフレームの変形が必要になる場合が多く,その時に使う便利なコマンドを含むreshape2パッケージもインストールしておきます install.packages("reshape2") library("reshape2") # melt():複数のデータフレームの列を1列にまとめて,元の列名を分類の列として作成してくれる便利なコマンドです # https://www.kimoton.com/entry/2018/02/24/151754 # 例えば,安打と二塁打と三塁打と本塁打を積み上げ棒グラフとして描きたい場合 # まとめたい列をmeasure.varsにベクトルの形で列名を渡します # variable.nameには元の列名が格納される列の名前を指定します # value.nameにはまとめられたデータが格納される列の名前をしています # id.varsは保存したい列を指定します(省略時はmeasure.vars以外すべてになります) # id.varsを指定した場合,指定されなかった列は保存されません data6=melt(data=data5,measure.vars=c("安打","二塁打","三塁打","本塁打"),variable.name="種類", value.name="本数") data6 data6$種類 # チームごとの積み上げ型棒グラフ p2=p+geom_bar(mapping=aes(x=チーム,y=本数,fill=種類), data=data6, stat="identity") p2 # 塁打数が多いチーム順に並べたい # reorder():横軸に使用する変数を規則により並べ替えてくれる # https://qiita.com/kazutan/items/7840f743d642122d1219 # xは横軸の列,Xは並べ替えの基準になる列 # FUNは並べ替えの時に演算したい場合 # 単純に昇順ならFUNは不要,総数の大きい順ならsum,平均ならmean # 積み上げる場合 # 塁打の総数が多い順に並べ替え p3=p+geom_bar(mapping=aes(x=reorder(x=チーム,X=塁打*(-1), FUN="sum"),y=本数,fill=種類), data=data6, stat="identity") p3 # 積み上げない場合 # position="dodge"を指定 p4=p+geom_bar(mapping=aes(x=reorder(x=チーム,X=塁打*(-1), FUN="sum"),y=本数,fill=種類), data=data6, stat="identity", position="dodge") p4 # 軸のタイトルがみっともないので変更 # labs()を使う p5=p+geom_bar(mapping=aes(x=reorder(x=チーム,X=塁打*(-1), FUN="sum"),y=本数,fill=種類), data=data6, stat="identity", position="dodge")+labs(x="チーム",y="安打総数[本]") p5 # coord_filp()で軸の入れ替え # 縦軸と横軸を入れ替えたグラフを作成できます p6=p+geom_bar(mapping=aes(x=reorder(x=チーム,X=塁打*(-1), FUN="sum"),y=本数,fill=種類), data=data6, stat="identity", position="dodge")+labs(x="チーム",y="各安打数[本]")+coord_flip() p6 # 選手ごとに並べてみる # 誰がどのチームかわからないので非常に見にくい p7=p+geom_bar(mapping=aes(x=reorder(選手名,安打),y=安打, fill=チーム), data=data5, stat="identity")+coord_flip()+labs(x="選手名",y="安打総数[本]") p7 p8=p+geom_bar(mapping=aes(x=reorder(選手名,塁打),y=本数, fill=種類), data=data6, stat="identity")+coord_flip()+labs(x="選手名",y="安打総数[本]") p8 # facet_wrap()で,特定の列の値ごとに個別に描くことができる # 上のグラフをチームごとにバラしてみる # facet_wrap(の後ろの~の前に何も書かないこと # 分類に使用する列名をそのあとに書く # nrowとncolで並べ方を設定できる p9=p+geom_bar(mapping=aes(x=reorder(選手名,塁打),y=本数, fill=種類), data=data6, stat="identity")+coord_flip()+labs(x="選手名",y="安打総数[本]")+facet_wrap(~ チーム, ncol=3) p9 # 他所のチームの選手はいらん # scales="free_y"とすると縦軸の目盛りが自動調整,scales="free_x"とすると横軸の目盛りが自動調整される p10=p+geom_bar(mapping=aes(x=reorder(選手名,塁打),y=本数, fill=種類), data=data6, stat="identity")+coord_flip()+labs(x="選手名",y="安打総数[本]")+facet_wrap(~ チーム, ncol=3, scales="free_y") p10 # 折れ線グラフと散布図 ---- # 今度は折れ線グラフと散布図を書いてみる # 折れ線グラフや散布図は横軸も順序尺度以上の変数が必要となるので,別のデータフレームを用意する # 糸井選手の年度別データをサンプルとして利用する # https://hanshintigers.jp/data/player/2019/7.html # 例によって,データの部分だけ選択してコピーして,それをRStudio.Cloudのclipboard001.txtに貼り付けて保存する data7=scan("clipboard001.txt", sep = "\t", what=list(年度=numeric(0),所属球団="",試合=numeric(0),打席=numeric(0),打数=numeric(0),得点=numeric(0),安打=numeric(0),二塁打=numeric(0),三塁打=numeric(0),本塁打=numeric(0),塁打=numeric(0),打点=numeric(0),盗塁=numeric(0),盗塁刺=numeric(0),犠打=numeric(0),犠飛=numeric(0),四球=numeric(0),死球=numeric(0),三振 =numeric(0),併殺打=numeric(0),打率=numeric(0),長打率=numeric(0),出塁率=numeric(0))) data7=data.frame(data7) # 折れ線グラフを描くためにはgeom_line()を使えばよい p11=p+geom_line(data=data7, mapping=aes(x=年度,y=打率)) # さらにデータを点で表示したければ折れ線グラフのp11オブジェクトに点を描くgeom_point()を追記すればよい # sizeで点の大きさ,shapeを12とすると白丸になるので,fillで色の指定をすると色をつけることができる p12=p11+geom_point(data=data7,mapping=aes(x=年度,y=打率),size=3,shape=21,fill="yellow") # 糸井のデータの場合は,所属球団が3つあるので,それを使って色分けもできる # 折れ線グラフで色分けをする場合は,aesでcolourに塗り分けの区別に使うデータ列を指定する p13=p+geom_line(data=data7,mapping=aes(x=年度,y=打率,colour=所属球団))+geom_point(data=data7,mapping=aes(x=年度,y=打率,colour=所属球団)) # 複数のグラフを重ね合わせることもできる # 例えば,糸井の打率の折れ線グラフと安打の棒グラフを重ねて描いてみる # ただし複数のグラフを重ね合わせると一番大きい縦軸の目盛でグラフが作成される(この場合は安打) # そのため,小さい方の打率の値を500倍して描いてやる p14=p+geom_bar(data=data7,mapping=aes(x=年度,y=安打,fill=所属球団),stat="identity")+geom_line(data=data7,mapping=aes(x=年度,y=打率*500))+geom_point(data=data7,mapping=aes(x=年度,y=打率*500)) # 打率の目盛がないので,第2軸として右側に追加する # このためにはscale_y_continuous()を使う # 500倍した打率は0から175の区間で書いてやればよいので,limts=c(0,175)にする # 目盛は0から175の500分の1(換算すると0から0.350)にしたいので,sec.axisにsec_axis()の引数として~ ./500を指定する # これは縦軸に使う値を500で割ることを意味している # nameに軸に表示する名前を代入する p15=p14+scale_y_continuous(limits=c(0,175), sec.axis=sec_axis(~ ./500,name="打率")) # 散布図の作成 ---- # 最後に散布図を作成してみる # data5オブジェクトを利用して,安打と打率の散布図を描いてみる # 折れ線グラフの点を描くのに使ったgeom_point()を使えばよい p16=p+geom_point(data=data5, mapping=aes(x=安打,y=打率)) # チームごとに塗り分けてみる p16=p+geom_point(data=data5, mapping=aes(x=安打,y=打率,colour=チーム)) # 例えば,選手の名前をプロットしてみる # 文字列のプロットはgeom_text()を使う # aes()の引数として,表示するデータ列をlabelに指定,打率に0.002を加えているのは上方向に文字をずらすため # 塗り分けのcolourも利用可能 # 文字が大きすぎるときはsizeを適切になるように指定 p17=p+geom_point(data=data5, mapping=aes(x=安打,y=打率,colour=チーム))+geom_text(data=data5, mapping=aes(x=安打,y=打率+0.002,label=選手名,colour=チーム),size=2) # 回帰直線の記入 # 2つの変数の関係を推定する関数式を図示することもできる # geom_smooth()を利用する # 引数としてmethod=lmとすると線形回帰の結果を図示できる # se=Fは信頼区間の非表示の設定 p18=p+geom_point(data=data5, mapping=aes(x=安打,y=打率,colour=チーム))+geom_text(data=data5, mapping=aes(x=安打,y=打率+0.002,label=選手名,colour=チーム),size=2)+geom_smooth(data=data5, mapping=aes(x=安打,y=打率),method=lm,se=F) # ggplotでは後から追加したものが一番上に描かれるので,先に回帰直線を描いておいた方が見栄えがよい p18=p+geom_smooth(data=data5, mapping=aes(x=安打,y=打率),method=lm,se=F)+geom_point(data=data5, mapping=aes(x=安打,y=打率,colour=チーム))+geom_text(data=data5, mapping=aes(x=安打,y=打率+0.002,label=選手名,colour=チーム),size=2)