7

我有一个关于控制 ggvis 中数据点颜色的问题。

我有一个数据框,我正在以多种方式过滤(在闪亮的应用程序中,以防万一)。这导致通常没有观察到我通过出现在生成的过滤数据框中为数据点着色的组。这显然会导致不同的颜色出现在不同的图中,这是令人困惑的。

这是一个非常接近的例子:

set.seed(101)
dfvis <- data.frame(x = runif(20), y = runif(20), mygroup = LETTERS[1:5])
dfvis


dfvis %>% 
  ggvis(x= ~x, y= ~y)  %>% 
  layer_points(fill = ~factor(mygroup))
   

在此处输入图像描述

让我们过滤掉一个组 -

  dfvis <- dfvis %>% filter(mygroup!="A")
    
    dfvis %>% 
      ggvis(x= ~x, y= ~y)  %>% 
      layer_points(fill = ~factor(mygroup))

在此处输入图像描述

在这里,“B”现在是蓝色的,所有其他组在颜色顺序方面都上移了一个。

有没有办法在同一个 df 上执行多个过滤器时,始终确保因子/组的每个级别的颜色相同?

之前在 ggplot 中起作用的一个技巧是将一个 NA 观察值添加到每个因子级别的数据帧的末尾。乍一看,这没问题,因为颜色恢复了正确的顺序,但请注意左上角的流氓数据点!

dfvis1 <- rbind(dfvis, data.frame(x=NA, y=NA, mygroup="A"))

dfvis1 %>% 
  ggvis(x= ~x, y= ~y)  %>% 
  layer_points(fill = ~factor(mygroup))

在此处输入图像描述

所有帮助表示赞赏。

4

1 回答 1

10

解决方案 1

似乎我忽略了一个非常简单的解决方案:

只需重新定义因子的水平,然后将因子从fill=

我会留下这个,因为它可能会帮助别人。

dfvis$mygroup<-factor(dfvis$mygroup, levels=c("A", "B", "C", "D", "E"))

dfvis %>% 
  ggvis(x= ~x, y= ~y)  %>% 
  layer_points(fill = ~mygroup)

解决方案 2

这实际上可能对 ggvis 用户具有更多的通用性。我们可以利用:vs :=。为每个组创建一个新的颜色变量

dfvis$color <- c("blue","orange","green","red","purple")

fill:=然后我们可以在 ggvis 函数中使用未缩放的原始颜色值......

#:= denotes unscaled raw value
dfvis %>% 
  ggvis(x= ~x, y= ~y, fill:= ~color)  %>% 
  layer_points()

即使在过滤掉其他组之后,这也将确保颜色一致性。

于 2014-12-13T03:11:01.413 回答