文書の過去の版を表示しています。
ggplot
ggplot関係のメモ
数値の「年」の末尾に「年度」を付ける
グラフの横軸が「年度」だがデータは数値の「年」の場合、「○○年度」と表示したい場合が多い。これまでは、文字列やfactorなどで新しい変数を作成してaes()に与えていたが、やはり数値データは数値データとして使いたい。ようやく理解したのは、データは数値として私、ラベルのフォーマットを変更すればよいということ。
以下のように、scalesパッケージのnumber_formatを使う。この場合、接尾辞として「年度」を付与し、精度は整数まで、桁区切りは無しにする。
scale_x_continuous( labels = scales::number_format(suffix = "年度", accuracy = 1, big.mark = ""), )
scalesパッケージの「*_format」の使い方がいまいちわからなかったが、こういう時に使うということか。
geom_* からデータフレームにアクセス
例えば、2つのgeom_pointで片方はデータを絞り込んでプロットしたいときなど、ggplotに与えられたデータフレームにアクセスしたい場合がある。ggplotに与えるデータフレームをあらかじめ作成してから処理する場合は、元のデータフレームを用いて絞り込み等をかければよいが、パイプでデータ処理をしたうえで、パイプから直接ggplotにデータフレームを与えるとき、しばしばデータ処理を施した段階のデータフレームにアクセスしたいことがある。多くの場合、データフレームの各フィールドに直接アクセスすればよいが、一部のgeom_*のdataに、元のデータフレームに追加でフィルタなどを施したいことがある。そのような場合のトリック。
source_data %>% filter(年度==2020) %>% ggplot(aes(x=算数, y=国語)) + geom_point() + geom_point(data=~.x %>% filter(理科>=45), color="red", size=5)
ほとんど意味はないし、他の方法もあるが例として。
2020年度に絞り込んで算数と国語の成績で散布図を作成したい。その際、理科の成績が45点以上の時は、さらに赤で大きめの点を重ねたい。その時、2番目のgeom_pointのdataオプションで理科が45点以上に絞ったデータを与えたい。ここで、source_dataからデータを作成しようとすると、ggplotに渡す直前までの処理をもう一度書いて、さらにそこから理科が45点以上というフィルタをかけなければならず、煩雑で変更する際の修正箇所も増える。そこで、dataの値に「~」を付けてformulaとすると、どうも「.x」でggplotに与えられたデータフレームにアクセスできるらしい。それを利用して「~ .x %>% filter(理科>45)」とすると、ggplotに与えられた段階のデータフレームに対してさらに処理を加えることができるようだ。
数値軸の表示範囲
数値軸の表示範囲を決める場合、ズームをするときはcoord_cartesianを利用するが、折れ線グラフの上部にgeom_textなどで値を表示するような場合、最大のデータポイントのテキストが見切れる場合がある。これに対する処理として、geom_blankを上に挿入する方法などがあるが、scale_y_continuousのexpandを利用する方法もある。
... + scale_y_continuous(expand = c(.1,.1)) + ....
expandはデータの最小、最大に対してどれだけ余白を設けるかを決めているようだ。上記の例では、それぞれ10%の余白を入れる設定になる。これで、最大のデータポイントより上に余白ができるので、ラベルなどがはみ出すのを防げる。