首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggvis:互动情节

ggvis:互动情节
EN

Stack Overflow用户
提问于 2014-11-26 13:06:42
回答 1查看 1K关注 0票数 2

我曾经用ggplot2绘制交互图,下面给出了代码。现在,我想用ggvis再现同样的情节,如下所示,这与ggplto2输出不一样。如何使用ggvis获得相同的绘图?

代码语言:javascript
复制
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)

代码语言:javascript
复制
library(ggvis)
ggvis(data=ToothGrowth, x= ~as.factor(dose), y= ~len, fill= ~supp, stroke = ~supp) %>% 
  layer_points(shape=~supp) %>% 
  layer_lines(fillOpacity=0)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-03 11:29:12

ggvis中实现这一点的基本问题是,没有像ggplot2那样的position = dodge选项,因此不能在相同的x坐标上绘制不同supp值的框图。因此,用x来索引as.factor(dose)轴似乎不是一个选项。然而,我们可以做的是使用一个长度的整数指数,它等于唯一剂量值的数目,然后根据x值手动偏移数据的左或右的supp位置:

代码语言:javascript
复制
library(ggvis)
library(dplyr)
d <- ToothGrowth
d$xpos <- as.integer(factor(d$dose)) + ifelse(d$supp == "OJ", -.2, .2)

因此,我们现在可以使用x = ~xpos在正确的位置绘制盒形图。下一步是定义数据保存方法,用于绘制由直线连接的点。

代码语言:javascript
复制
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()

这个图现在可以作为

代码语言:javascript
复制
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()提供了一种修改轴属性(其中包括标签)的方法,但是它将对整个轴使用相同的标签,因为这些属性适用于整个轴。因此,通过对每个剂量值添加一个轴,我们可以一个一个地操作标签。这看起来就像

代码语言:javascript
复制
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")

或者,您可以使用一个循环来实现这些,这样您就不必一次又一次地键入相同的内容。

代码语言:javascript
复制
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"]))))
}

最后的结果如下

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27150056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档