ggVis:在不同数据集上创建多层图表

8
我正在尝试使用ggvis重现一个ggplot2图表。 该图表旨在表示点的坐标(来自对应分析)以及它们的聚类(hclust)标准离散度椭圆。

简述

我想基于多个数据集创建一个包含多个图层的ggvis图表。 因此,函数/管道方法阻止我对其中一个图层进行分组而不对其他图层进行分组。

整个(简要注释)代码在这里:https://gist.github.com/RCura/a135446cda079f4fbc10


这是创建数据的代码:

 a <- rnorm(n = 100, mean = 50, sd = 5)

 b <- rnorm(n = 100, mean = 50, sd = 5)

 c <- rnorm(n = 100, mean = 50, sd = 5)

 mydf <- data.frame(A = a, B = b, C = c, row.names = c(1:100))

 library(ade4)

 myCA <- dudi.coa(df = mydf,scannf = FALSE,  nf = 2)

 myDist <- dist.dudi(myCA, amongrow = TRUE)

 myClust <- hclust(d = myDist, method = "ward.D2")

 myClusters <- cutree(tree = myClust, k = 3)

 myCAdata <- data.frame(Axis1 = myCA$li$Axis1, Axis2 = myCA$li$Axis2, Cluster = as.factor(myClusters))

 library(ellipse) # Compute Standard Deviation Ellipse

 df_ellipse <- data.frame()

 for(g in levels(myCAdata$Cluster)){
   df_ellipse <- rbind(df_ellipse,
                 cbind(as.data.frame(
                 with(myCAdata[myCAdata$Cluster==g,],
                 ellipse(cor(Axis1, Axis2),
                 level=0.7,
                 scale=c(sd(Axis1),sd(Axis2)),
                 centre=c(mean(Axis1),mean(Axis2))))),
                 Cluster=g))
 }

我可以通过ggplot2绘制这个图表:
library(ggplot2)

myPlot <- ggplot(data=myCAdata, aes(x=Axis1, y=Axis2,colour=Cluster)) +
  geom_point(size=1.5, alpha=.6) +
  geom_vline(xintercept = 0, colour="black",alpha = 0.5, linetype = "longdash" ) +
  geom_hline(xintercept = 0, colour="black", alpha = 0.5, linetype = "longdash" ) +
  geom_path(data=df_ellipse, aes(x=x, y=y,colour=Cluster), size=0.5, linetype=1)
myPlot

enter image description here

但我找不到如何使用ggvis绘制它。
我可以绘制2个不同的层:
library(ggvis)

all_values <- function(x) { paste0(names(x), ": ", format(x), collapse = "<br />")}

 ggDF <- myCAdata

 ggDF$name <- row.names(ggDF)

## Coordinates plot
myCoordPlot <- ggvis(x = ~Axis1, y = ~Axis2, key := ~name, data = ggDF) %>%

  layer_points(size := 15, fill= ~Cluster, data = ggDF) %>%

  add_tooltip(all_values, "hover")

 myCoordPlot

enter image description here

省略号图(未请求工具提示)

 myEllPlot <- ggvis(data = df_ellipse, x = ~x,  y = ~ y) %>%

  group_by(Cluster) %>%

  layer_paths(x= ~x, y= ~y, stroke = ~Cluster, strokeWidth := 1)

 myEllPlot

enter image description here

但是当我想在同一图表上绘制这两个图层时:
 myFullPlot <- ggvis(data = df_ellipse, x = ~x,  y = ~ y) %>%

 layer_paths(x= ~x, y= ~y, stroke = ~Cluster, strokeWidth := 1) %>%

 layer_points(x = ~Axis1, y= ~Axis2, size := 15, fill= ~Cluster, data = ggDF) %>%

 add_tooltip(all_values, "hover")

 myFullPlot

enter image description here

这些椭圆没有被分组,所以颜色不匹配,而且椭圆也没有分离。 如果我尝试将我的椭圆分组,它不起作用:group_by只需要在layer_paths中使用,这会弄乱layer_points。

有什么办法可以让这个工作? 对于这篇非常长的帖子感到抱歉,但我已经尝试了几个小时 :/

1个回答

8

问题在于当你试图将两个数据集合并时,你没有在省略号数据集上对 Cluster 进行分组。你需要按照以下步骤来操作才能让它正常工作:

myFullPlot <- ggvis(data = df_ellipse, x = ~x, y = ~ y) %>% group_by(Cluster) %>%

  layer_paths(stroke = ~Cluster, strokeWidth := 1) %>%

  layer_points(x = ~Axis1, y= ~Axis2, size := 15, fill= ~Cluster, data = ggDF)

myFullPlot

输入图像描述

这样就可以得到您想要的图形!

附言:我假设您的数据创建中存在某种随机性,因为我得到了与您不同的数据集。


非常感谢LyzandeR,它的效果正如预期。我尝试过使用group_by,但显然没有放在正确的位置上。 至于数据,它是基于rnorm的(根据此帖子),因此很容易复制,但当然,这里只关注方法,数据并不重要。 - RobinCura

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接