控制ggparcoord中的alpha(来自GGally包)

时间:2015-12-16 09:21:35

标签: r ggplot2 alpha ggally parallel-coordinates

我正在尝试从a question similar to mine构建(我从中借用了自包含的示例和标题灵感)。我试图将透明度单独应用于ggparcoord的每一行,或者以某种方式在另一行上添加两层ggparcoord。下面提供了解决方案工作的问题和数据格式的详细说明。

我有一个包含数千行的数据集,我们称之为x

library(GGally)
x = data.frame(a=runif(100,0,1),b=runif(100,0,1),c=runif(100,0,1),d=runif(100,0,1))

在对这些数据进行聚类后,我还得到一组5行,让我们调用这个数据集y

y = data.frame(a=runif(5,0,1),b=runif(5,0,1),c=runif(5,0,1),d=runif(5,0,1))

为了查看覆盖y的质心x,我使用以下代码。首先,我将y添加到x,使得5行位于最终数据帧的底部。这可以确保ggparcoord将它们放在最后,因此保持在所有数据之上:

df <- rbind(x,y)

接下来,我为df创建了一个新列,遵循我提到的问题建议,以便我可以对质心进行不同的颜色,因此可以将其与数据区分开来:

df$cluster = "data"
df$cluster[(nrow(df)-4):(nrow(df))] <- "centroids"

最后我绘制了它:

p <- ggparcoord(df, columns=1:4, groupColumn=5, scale="globalminmax", alphaLines = 0.99) + xlab("Sample") + ylab("log(Count)")
p + scale_colour_manual(values = c("data" = "grey","centroids" = "#94003C"))

我遇到的问题是从这个阶段开始。在我的原始数据上,单独绘制x并不会带来太多洞察力,因为它是一大堆线(在此数据上,这相当于在x上使用ggparcoord而不是df

enter image description here

通过显着减少alphaLines(0.05),我可以自然地看到一些群集由于行的重叠(这再次在x上运行ggparcoord减少alphaLines):

enter image description here

在第二个图上观察添加到df的质心更有意义,而不是第一个。

但是,由于它在单个数据帧上的所有内容,因此对alphaLine应用如此高的值会使质心线消失。我唯一的选择是在df上使用ggparcoord(如上所述)而不降低alphaValue:

enter image description here

我的目标是让第二个数字顶部的红线(质心线)具有非常低的alpha值。到目前为止,我有两种方法,但无法使其正常工作:

(1)有没有办法在数据框上创建一个列,类似于对颜色所做的那样,这样我就可以为每一行指定alpha值?

(2)我最初尝试创建两个不同的ggparcoords并“总结”希望覆盖,但是出现了错误。

这个问题可能包含太多细节,但我认为这可以更好地激发答案的适用性,以满足其他读者的兴趣。

我正在寻找的答案将使用当前格式提供的数据变量并生成我正在寻找的图。还欢迎更好的重建数据的方法,但优选使用当前结构。

1 个答案:

答案 0 :(得分:3)

在这种情况下,我认为使用ggplot更容易,并自己构建图表。我们稍微调整数据的表示方式(我们将其设置为长格式),然后我们制作平行坐标图。我们现在可以将任何属性映射到您喜欢的cluster

library(dplyr)
library(tidyr)

# I start the same as you
x <- data.frame(a=runif(100,0,1),b=runif(100,0,1),c=runif(100,0,1),d=runif(100,0,1))
y <- data.frame(a=runif(5,0,1),b=runif(5,0,1),c=runif(5,0,1),d=runif(5,0,1))

# I find this an easier way to combine the two data.frames, and have an id column
df <- bind_rows(data = x, centroids = y, .id = 'cluster')
# We need to add id's, so we know which points to connect with a line
df$id <- 1:nrow(df)

# Put the data into long format
df2 <- gather(df, 'column', 'value', a:d)

# And plot:
ggplot(df2, aes(column, value, alpha = cluster, color = cluster, group = id)) +
  geom_line() +
  scale_colour_manual(values = c("data" = "grey", "centroids" = "#94003C")) +
  scale_alpha_manual(values = c("data" = 0.2, "centroids" = 1)) +
  theme_minimal()

enter image description here