まずは蝋の翼から。

学んだことを書きながら確認・整理するためのメモブログ。こういうことなのかな?といったことをふわっと書いたりしていますが、理解が浅いゆえに的はずれなことも多々あると思うのでツッコミ歓迎

ggchartsを試す

ggchartsとは

Rのggplot2のラッパーで、aes + geom_xxxの形式ではなく、pythonseabornplotly_expressみたいにグラフ関数を用いて表現をすることができる。ラッパーなので、通常の書き方を組み合わせることができるので、ggplot2の機能が追加されただけと考えてもよさそう。

また、各グラフ関数では上位x位のみやハイライトなど、ggplot2のままだと面倒な作業の一部は引数でおこなえるようになっている。

github.com

APIリファレンス

thomas-neitmann.github.io

Chart

基本的にドキュメントのExampleをトレース

各ファセットのrevenueTop10のみをを表示し、昇順にしたい。

ggplot2で通常通り行うと、year毎にgroup_byしてtop_nでrevenueのTop10を抽出をおこない、companyをreorder_withinでyearと結合しつつ並び替える。
この前処理をしてから、ggplot2coord_flipで軸を反転させたりscale_x_reorderedで並び替えたりと、地味にめんどい。

library(dplyr)
library(ggplot2)
library(ggcharts)
data("biomedicalrevenue")


data(biomedicalrevenue)
revenue2016 <- biomedicalrevenue[biomedicalrevenue$year == 2016, ]
revenue_roche <- biomedicalrevenue[biomedicalrevenue$company == "Roche", ]


biomedicalrevenue %>%
  filter(year %in% c(2012, 2015, 2018)) %>%
  group_by(year) %>%
  top_n(10, revenue) %>%
  ungroup() %>%
  mutate(company = tidytext::reorder_within(company, revenue, year)) %>%
  ggplot(aes(company, revenue)) +
  geom_col() +
  coord_flip() +
  tidytext::scale_x_reordered() +
  facet_wrap(vars(year), scales = "free_y")

f:id:chito_ng:20200525074031p:plain

ggchartsだと簡単に作成ができる。

biomedicalrevenue %>%
  filter(year %in% c(2012, 2015, 2018)) %>%
  bar_chart(x = company, y = revenue, facet = year, top_n = 10)

f:id:chito_ng:20200525074159p:plain

lollipop_chartという、ggchartsのオサレ棒グラフがあるが前述のようにggplot2の書き方で追記ができる。以下の例ではlabsscale_y_continuousggplot2での見た目設定の仕方と同じ。

biomedicalrevenue %>%
  filter(year == 2018) %>%
  lollipop_chart(x = company, y = revenue, threshold = 30) +
  labs(
    x = NULL,
    y = "Revenue",
    title = "Biomedical Companies with Revenue > $30Bn."
  ) +
  scale_y_continuous(
    labels = function(x) paste0("$", x, "Bn."),
    expand = expansion(mult = c(0, .05))
  )

f:id:chito_ng:20200525075818p:plain

他にも色々な関数があるのでgallery見ると楽しい。

bar_chart

thomas-neitmann.github.io

bar_chart(biomedicalrevenue, company, revenue, facet = year, top_n = 10, highlight = "Roche")

f:id:chito_ng:20200525082821p:plain

軸の逆転

column_chart(biomedicalrevenue, company, revenue, facet = year, top_n = 10, highlight = "Roche")

f:id:chito_ng:20200525082908p:plain

lollipop_chart

thomas-neitmann.github.io

lollipop_chart(revenue2016, company, revenue, point_color = "darkgreen", line_color = "gray")

f:id:chito_ng:20200525082511p:plain

diverging_bar_chart

thomas-neitmann.github.io

data(mtcars)
mtcars_z <- dplyr::transmute(
  .data = mtcars,
  model = row.names(mtcars),
  hpz = scale(hp)
)

diverging_bar_chart(mtcars_z, model, text_size = 14, hpz, text_color = c("#1F77B4", "#FF7F0E"), bar_color = c("#1F77B4", "#FF7F0E"))

f:id:chito_ng:20200525083349p:plain

diverging_lollipop_chart

thomas-neitmann.github.io

diverging_lollipop_chart(mtcars_z, model, hpz, text_size = 14, text_color = c("#1F77B4", "#FF7F0E"), lollipop_colors = c("#1F77B4", "#FF7F0E"))

dumbbell_chart

thomas-neitmann.github.io

data(popeurope)

dumbbell_chart(popeurope, country, pop1952, pop2007, top_n = 10,
               line_size = 2, point_size = 5,
               legend_labels = c("1952", "2007"), # ラベル名変更
               line_color = "lightgray", point_color = c("lightgray", "black"))

thomas-neitmann.github.io

data(popch)

pyramid_chart(popch, age, pop, sex, xlab = "Population", title = "Switzerland 2020",
              bar_colors = c("blue", "red"))

f:id:chito_ng:20200525085237p:plain

highlight_spec

各グラフ関数内でhighlight引数でハイライトしたい文字を指定すると、変数のその文字のグラフがハイライトされる。

thomas-neitmann.github.io

このとき、highlight_spec関数を使うと、文字と色の組み合わせも指定できる。

spec <- highlight_spec(c("Bayer", "AstraZeneca"), c("darkgreen", "darkorange"))
bar_chart(revenue2018, company, revenue, highlight = spec)

f:id:chito_ng:20200525085535p:plain

theme

テーマはtheme_ggcharts theme_hermit theme_ng theme_nightblueの4種類ある。

thomas-neitmann.github.io

library(patchwork)

scatter <- ggplot(mtcars, aes(hp, mpg)) +
  geom_point(color = "red")

g1 = scatter + theme_ggcharts(grid = "XY", axis = "XY", ticks = "XY")
g2 = scatter + theme_hermit(grid = "XY", axis = "XY", ticks = "XY")
g3 = scatter + theme_ng(grid = "XY", axis = "XY", ticks = "XY")
g4 = scatter + theme_nightblue(grid = "XY", axis = "XY", ticks = "XY")

(g1|g2)/(g3|g4)

f:id:chito_ng:20200525091518p:plain

参考

R-bloggerの紹介記事

www.r-bloggers.com