ggVis: создание графика с несколькими слоями в другом наборе данных

Я пытаюсь воспроизвести график ggplot2 с помощью ggvis. График направлен на представление координат точек (из анализа соответствия) вместе с их кластерами (hclust) стандартными эллипсами рассеяния.


TL; DR

Я хотел бы сделать график 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

введите здесь описание изображения

Эллипсы не сгруппированы, поэтому цвет не подходит, и эллипсы не разделены. Если я попытаюсь сгруппировать свои эллипсы, это не сработает: group_by требуется только для layer_paths, и это испортит layer_points.

Любая идея, как заставить это работать? И извините за этот очень длинный пост, но я пытался это сделать часами :/


person RobinCura    schedule 26.12.2014    source источник


Ответы (1)


Проблема в том, что когда вы пытаетесь объединить их, вы не группируете 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

введите здесь описание изображения

И таким образом вы получите график, который вы хотите!

P.S. Я предполагаю, что в вашем создании данных есть некоторая случайность, потому что я получил другой набор данных, чем ваш.

person LyzandeR    schedule 27.12.2014
comment
Большое спасибо, LyzandeR, все работает так, как и ожидалось. Я, конечно, пытался поставить group_by, но явно не в ту позицию. Что касается данных, то они основаны (в этом посте) на rnorm, поэтому их легко воспроизвести, но, конечно, данные здесь не имеют значения, только метод. - person RobinCura; 28.12.2014