ggvis:交互图

MYa*_*208 2 r graph ggplot2 ggvis

我以前用交互绘图,ggplot2代码如下.现在我想重现相同的情节,ggvis如下所示,与ggplto2输出不同.如果有人指出我用`ggvis获得相同的情节,我将非常感激.提前致谢.

library(ggplot2)
p <- qplot(as.factor(dose), len, data=ToothGrowth, geom = "boxplot", color = supp) + theme_bw()
p <- p + labs(x="Dose", y="Response")
p <- p + stat_summary(fun.y = mean, geom = "point", color = "blue", aes(group=supp))
p <- p + stat_summary(fun.y = mean, geom = "line", aes(group = supp))
p <- p  + theme(axis.title.x = element_text(size = 12, hjust = 0.54, vjust = 0))
p <- p  + theme(axis.title.y = element_text(size = 12, angle = 90,  vjust = 0.25))
print(p)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

library(ggvis)
ggvis(data=ToothGrowth, x= ~as.factor(dose), y= ~len, fill= ~supp, stroke = ~supp) %>% 
  layer_points(shape=~supp) %>% 
  layer_lines(fillOpacity=0)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

kon*_*vas 7

当试图实现这个时ggvis,基本问题是没有position = dodge像in 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)
Run Code Online (Sandbox Code Playgroud)

因此,我们现在可以使用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()
Run Code Online (Sandbox Code Playgroud)

现在可以获得图表

ggvis(d, x = ~xpos, y = ~len, stroke = ~supp) %>% 
    layer_boxplots() %>%
    layer_points(data = means, fill := "blue") %>%
    layer_paths(data = means)
Run Code Online (Sandbox Code Playgroud)

现在我们遇到的问题是,图的x位置将是1,2,3而不是实际剂量值.这不是很容易克服,因为add_axis()没有办法重新标记轴刻度(同样,我们不能首先使用实际剂量值而不是1,2,3,因为这样会将箱形图放在剂量值0.5和1比剂量值1和2处的剂量值更接近彼此.这可以通过不那么优雅的黑客来克服,即为每个单剂量值添加轴.该函数add_axis()提供了一种修改轴属性(包括标签)的方法,但它将对整个轴使用相同的标签,因为属性适用于整个轴.因此,通过为每个剂量值添加轴,我们可以逐个操作标签.这看起来像

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")
Run Code Online (Sandbox Code Playgroud)

或者,您可以为这些使用循环,这样您就不必反复键入相同的内容

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"]))))
}
Run Code Online (Sandbox Code Playgroud)

最终结果如下

在此输入图像描述