【问题标题】:ggVis : creating a plot with multiple layers on different datasetggVis:在不同的数据集上创建具有多个图层的图
【发布时间】:2014-12-26 17:18:45
【问题描述】:

我正在尝试使用 ggvis 重现 ggplot2 图。 该图旨在表示点的坐标(来自对应分析)及其簇 (hclust) 标准色散椭圆。


TL;博士

我想根据多个数据集制作一个包含多个图层的 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

但我找不到如何使用 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

椭圆图(不要求工具提示)

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

  group_by(Cluster) %>%

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

 myEllPlot

但是当我想在同一个图上绘制 2 层时:

 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

椭圆没有分组,所以颜色不合适,椭圆没有分开。 如果我尝试对 Ellipses 进行分组,它不起作用:group_by 只有 layer_paths 需要,它会弄乱 layer_points。

知道如何进行这项工作吗? 很抱歉这篇很长的帖子,但我已经努力了好几个小时了:/

【问题讨论】:

    标签: r ggplot2 ggvis


    【解决方案1】:

    问题在于,当您尝试将两者结合起来时,您并没有在省略号数据集上 group_by 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
    

    这样你就得到了你想要的图表!

    附:我假设您的数据创建存在一些随机性,因为我得到的数据集与您的不同。

    【讨论】:

    • 非常感谢 LyzanderR,它可以按预期工作。当然,我曾尝试将 group_by 放在正确的位置,但显然不是正确的位置。对于数据,它(基于这篇文章)基于 rnorm,因此很容易重现,但当然,这里的数据并不重要,只有方法。
    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多