gpt4 book ai didi

r - ggvis:交互图

转载 作者:行者123 更新时间:2023-12-02 07:26:59 26 4
gpt4 key购买 nike

我曾经用 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)

enter image description here

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

enter image description here

最佳答案

当尝试在 ggvis 中实现时,基本问题是没有像 ggplot2 中那样的 position = dodge 选项,并且因此,不同 supp 值的箱线图不能绘制在相同的 x 坐标上。因此,通过 as.factor(dose) 索引 x 轴似乎不是一个选项。然而,我们可以做的是使用长度等于唯一剂量值数量的整数索引,然后根据 手动将数据的 x 位置向左或向右偏移>支持值:

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 处的箱线图彼此更接近)。这可以通过一个不太优雅的 hack 来克服,即为每个单剂量值添加一个轴。函数 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")

或者,您可以为这些使用循环,这样您就不必一遍又一遍地输入相同的内容

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"]))))
}

最后的结果是这样的

enter image description here

关于r - ggvis:交互图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27150056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com