でこれを実装しようとするときの基本的な問題は、のようなオプションggvis
がないため、異なる値の箱ひげ図を同じ座標にプロットできないことです。したがって、軸にインデックスを付けることはオプションではないようです。ただし、一意の線量値の数に等しい長さの整数インデックスを使用し、値に応じてデータの位置を手動で左または右にオフセットすることができます。position = dodge
ggplot2
supp
x
x
as.factor(dose)
x
supp
library(ggvis)
library(dplyr)
d <- ToothGrowth
d$xpos <- as.integer(factor(d$dose)) + ifelse(d$supp == "OJ", -.2, .2)
x = ~xpos
これで、ボックスプロットを正しい位置にプロットするために使用できるようになりました。次のステップは、線で結ばれた点をプロットするために使用される平均を保持するデータを定義することです。
means <- d %>% group_by(dose, supp) %>% summarise(len = mean(len))
means$xpos <- as.integer(factor(means$dose))
means <- group_by(means, supp) # The grouping is needed for layer_paths()
グラフは次のように取得できます。
ggvis(d, x = ~xpos, y = ~len, stroke = ~supp) %>%
layer_boxplots() %>%
layer_points(data = means, fill := "blue") %>%
layer_paths(data = means)
ここx
で、プロットの位置が実際の線量値ではなく 1、2、3 になるという問題があります。軸の目盛りにラベルを付け直す方法がないため、これを克服するのは簡単ではありませんadd_axis()
(また、最初に 1、2、3 の代わりに実際の線量値を使用することはできませんでした。線量値 0.5 と 1 は、線量値 1 と 2 よりも互いに近い値です)。これは、個々の線量値ごとに軸を追加するという、それほど洗練されていないハックによって克服できます。この関数add_axis()
は、軸のプロパティ (ラベルを含む) を変更する方法を提供しますが、プロパティは軸全体に適用されるため、軸全体に同じラベルを使用します。したがって、線量値ごとに軸を追加することで、ラベルを 1 つずつ操作できます。これは次のように見えます
ggvis(d, x = ~xpos, y = ~len, stroke = ~supp) %>%
layer_boxplots() %>%
layer_points(data = means, fill := "blue") %>%
layer_paths(data = means) %>%
add_axis("x", title = "Dose",
values = c(1, 1), # For some reason values of length 1 don't work...
properties = axis_props(labels = list(text = "0.5"))) %>%
add_axis("x", title = "",
values = c(2, 2),
properties = axis_props(labels = list(text = "1"))) %>%
add_axis("x", title = "",
values = c(3, 3),
properties = axis_props(labels = list(text = "2"))) %>%
add_axis("y", title = "Response")
または、これらにループを使用して、同じことを何度も入力する必要がないようにすることもできます
labs <- data.frame(dose = unique(d$dose))
labs$xpos <- as.integer(factor(labs$dose))
v <- ggvis(d, x = ~xpos, y = ~len, stroke = ~supp) %>%
layer_boxplots() %>%
layer_points(data = means, fill := "blue") %>%
layer_paths(data = means) %>%
add_axis("x", title = "Dose", ticks = 0) %>%
add_axis("y", title = "Response")
for (i in 1:nrow(labs)) {
v <- add_axis(v, "x", title = "", values = rep(labs[i, "xpos"], 2),
properties = axis_props(labels = list(text = as.character(labs[i, "dose"]))))
}
最終結果はこんな感じ
