裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ggplot2 って,ちっとも簡単じゃないよ!(2)

2019年12月25日 | ブログラミング

> 最後にgeom_blankを使い,かつ体裁を最大限整えたグラフを描いてみます。論文にもそのまま使えるほど綺麗なので,参考にしてください。

との触れ込みで,プログラムと図が掲載されていた。

library(dplyr)
library(tidyr)
library(ggplot2)
iris %>%
  gather(feature, value, -Species) %>%
  group_by(Species, feature) %>%
  summarise(mean_value = mean(value))  %>%
  group_by(feature) %>%
  mutate(y_max = max(mean_value)*1.15) %>%
  ggplot(aes(x = Species, y = mean_value, label = mean_value, fill = Species)) +
  geom_bar(stat = "identity", width = 0.5, size = 0.3, color = "grey80")  +
  geom_text(size = 2.4, vjust = -0.5) +
  geom_blank(aes(y = y_max)) +
  facet_wrap(~feature, ncol = 4, scales = "free") +
  scale_y_continuous(expand = c(0, 0)) +
  scale_fill_brewer(palette = "Set1") +
  theme_bw() +
  theme(panel.border = element_blank(),
        axis.line = element_line(color = "grey50", size = 0.2),
        axis.text.x = element_text(size = 8, angle = 45, hjust = 1, vjust = 1),
        axis.text.y = element_text(size = 8),
        axis.title = element_text(size = 8),
        strip.background = element_blank(),
        strip.text = element_text(size = 8, face = "bold"),
        axis.ticks = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none") +
  labs(x = "Species",
      y = "Mean") -> p

なんたる長さ。

この際,平均値を棒グラフで描くことの是非には触れないが,x 軸ラベルも斜めになってジャギー・ジャギー 。

graphics::barplot で書くと

layout(matrix(1:4, 4))
old = par(mar = c(2, 5.5, 2, 1),
    mgp = c(1.8, 0.6, 0), las = 1, bty = "l",
    tck = -0.05, cex.axis = 1.2)
for (i in 1:4) {
    df = iris[, c(i, 5)]
    value = by(df[, 1], df$Species, mean)
    vname = colnames(df)[1]
    pos.bar = barplot(value, bty = "l",
        col = c("firebrick3 ", "dodgerblue3 ", "darkgreen "),
        xlim = c(0, max(value) * 1.1), horiz = TRUE)
    title(main = paste0("mean of ", vname), cex = 0.8)
    text(value, pos.bar, value, pos = 2, col = "white", cex = 1.1)
}
par(old)
layout(1)

ぐらいで(まだまだリファインできるけど),次の図が描けた。

こっちの方がやはり,好きだ。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ggplot2 って,ちっとも簡単じゃないよ!

2019年12月25日 | ブログラミング

Why I don't use ggplot2

で,

ggplot() + geom_point(data = quakes, aes(x = lat, y = long, colour = stations))

の一行で以下のような図が描けるのはかなり驚くべき事だ。

中略。しかし,ちゃんとした図であるためには,(1) 軸を大きくし,(2) ラベルを大きくし,(3) ラベルをフルネームで,(4) 凡例のタイトルも省略名ではなく詳しく描く必要がある

などと書いている。その他にも,(5) バックグラウンドは白,(6) グリッドラインは描かない,(7) 図の周りの枠は描かない,(8) 軸,ティックマークおよび目盛り文字を灰色でというようなことも必要だろう。タイトル,サブタイトル,キャプションは,このような図を引用する側で付ける(例えば LaTeX の figure 環境では,LaTeX 側で付ける)のでなくてもよいだろう。

つまり,以下のような図である。

あなたは,上の図と比べてどのように評価するだろうか?

上の 1 行だけのプログラムに,どれだけ追加書きすれば良いのだろうか?

キーワードでググりながら,書いてみた。以下のようになった。ggplot2 のヘビーユーザーなら,もっともっと少ない行数で書けるのかもしれないが。できるようだったら教えて欲しい。

library(ggplot2)
data(quakes)
p = ggplot()
p = p +  geom_point(data = quakes, aes(x = lat, y = long, colour = stations)) + # 最初の 1 行プログラム
  labs(
    title = "Locations of Earthquakes off Fiji", # 図のタイトル
    subtitle = "The locations of 1000 seismic events of MB > 4.0", # 図のサブタイトル
    caption = "This is one of the Harvard PRIM-H project data sets.", # 図のキャプション
    x = "Latitude ", # x 軸ラベル
    y = "Longitude", # y 軸ラベル
    colour = "Number of\n stations\n reporting" # 凡例の説明書き
  ) +
  theme(
    plot.title = element_text(size = 16, hjust = 0.5), # タイトルの文字サイズと位置
    plot.subtitle = element_text(size = 14, hjust = 0.5), # サブタイトルの文字サイズと位置
    axis.line = element_line(colour = "gray"), # 軸の色
    axis.ticks = element_line(colour = "gray"), # ティックマークの色
    axis.text = element_text(size = 12), # 軸の目盛り文字の大きさ
    axis.title = element_text(size = 14), # 軸の名前の茂治の大きさ
    panel.border = element_blank(), # 図の周りに枠を描かない
    panel.grid.major = element_blank(), # 主グリッドラインを描かない
    panel.grid.minor = element_blank(), # 副グリッドラインを描かない
    panel.background = element_blank()  # バックグラウンドを白にする
  )

print(p)

 

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村