绘制所有观察结果,但根据不同的组对它们进行着色

Plotting all observations but colour them based on different group

我有下面给出的示例数据,其中包含唯一的示例 ID 和 3 个组。我需要绘制 'df' 中的所有观察结果(行),但根据组 ID ('groupid') 为它们着色。 这是我目前拥有的:

# sample data creation
samples <- paste0("S",c(1:9))
groupid <- c("group1", "group2", "group3")
foo <- data.frame(Samples = samples, Group = rep(groupid, each = 3))

bar <- data.frame()
for(i in 1:length(samples)){
  ran.data <- rnorm(10, 0.5)
  #colnames <- paste0("w",c(1:length(ran.data)))
  for(j in 1:length(ran.data)){
    bar[i,j] <- ran.data[j]
  }
}
df <- cbind(foo, bar)

# ******************
# creating plot data
plotdf <- as.data.frame(t(df))
cols <- as.character(unlist(plotdf[1,]))
plotdf <- plotdf[-c(1,2),] # removing rows
groupid <- df$Group # var to group by
names(plotdf) <- cols
plotdfrows <- names(df[,3:ncol(df)])
plotdf$rownames <- plotdfrows

# melt and plot
library(reshape2)
library(ggplot2)
melteddf <- melt(plotdf, id.var = "rownames")

final.plot <- ggplot(melteddf, aes(rownames, value, colour = variable, group = groupid)) + geom_point() + #geom_line() +
  scale_y_discrete(breaks=seq(-3, 3, by = 0.5)) + scale_x_discrete() + 
  labs(title = paste("Sample plot"))  #breaks=seq(0, 4, by = 0.5)

print(final.plot)

当我使用 group = 1 时,我设法得到了绘图,但观察结果的颜色不同。但是我在哪里可以指定 'groupid' 信息呢? 提前致谢。

您传递给 aes() 的值必须是关联数据框中的有效列名。

这是我们要处理的数据:

set.seed(0)
dat <- data.frame(
  rownames=LETTERS[1:25],
  variables=sample(c("S1", "S2", "S3"), 25, replace = TRUE),
  value=runif(25)
)

groupid = sample(c("group1", "group2", "group3"), 25, replace = TRUE)
# assigning group as a new variable to the data we use for plotting
dat$group <- groupid

数据如下所示:

'data.frame':   25 obs. of  4 variables:
 $ rownames : Factor w/ 25 levels "A","B","C","D",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ variables: Factor w/ 3 levels "S1","S2","S3": 3 1 2 2 3 1 3 3 2 2 ...
 $ value    : num  0.2672 0.3861 0.0134 0.3824 0.8697 ...
 $ group    : chr  "group3" "group2" "group3" "group2" ...

注意 group 变量是如何出现在原始数据中的。 ggplot 的代码相对简单:

ggplot(dat, aes(x=rownames, y=value, color=group))+
  geom_point()

产生这个:

您的代码不起作用的原因是 groupid 不存在于您传递给 ggplot 调用的数据中。您将 melteddf 指定为数据参数,但 melteddf 数据框中没有 groupid 变量。

如果出于某种原因您需要颜色美学 (col) 来引用来自与您在 ggplot2 调用中指定的数据框不同的数据框的值,您也可以这样做。

以下代码产生相同的结果:

set.seed(0)
dat <- data.frame(
  rownames=LETTERS[1:25],
  variables=sample(c("S1", "S2", "S3"), 25, replace = TRUE),
  value=runif(25)
)
# group is a different data frame from dat
group = data.frame("groupid"=sample(c("group1", "group2", "group3"), 25, replace = TRUE))

ggplot(data=dat, aes(x=rownames, y=value))+
  geom_point(aes(col=group$groupid))

除了@onlyphantom 的回答之外,您的代码还有一些问题。

您对 df 进行了不必要的操作以转换为长格式。请注意,您的原始数据框 df 具有在您操作数据时丢失的列 group。更重要的是,如果您查看融化数据框的结构 melteddf,您的代码创建的是字符值而不是数值:

str(melteddf)
'data.frame':   90 obs. of  3 variables:
$ rownames: chr  "V1" "V2" "V3" "V4" ...
$ variable: Factor w/ 9 levels "S1","S2","S3",..: 1 1 1 1 1 1 1 1 1 1 ...
$ value   : chr  " 0.5705084" " 0.62928774" " 2.2150650" " 0.96091621" ...

您只需要一行代码即可转换为长格式,并且要保留您的群组 ID,您可以将 Group 变量添加到您的 id.vars:

melteddf2 <- melt(df, id.vars=c("Samples", "Group"))

str(melteddf2)
'data.frame':   90 obs. of  4 variables:
$ Samples : Factor w/ 9 levels "S1","S2","S3",..: 1 2 3 4 5 6 7 8 9 1 ...
$ Group   : Factor w/ 3 levels "group1","group2",..: 1 1 1 2 2 2 3 3 3 1 ...
$ variable: Factor w/ 10 levels "V1","V2","V3",..: 1 1 1 1 1 1 1 1 1 2 ...
$ value   : num  0.571 0.611 -0.229 1.378 2.669 ...

head(melteddf2)
Samples  Group variable      value
1      S1 group1       V1  0.5705084
2      S2 group1       V1  0.6106827
3      S3 group1       V1 -0.2288912
4      S4 group2       V1  1.3781335
5      S5 group2       V1  2.6689560
6      S6 group2       V1  1.8686023

最后,关于你的 ggplot2 代码,你的 y 轴值是连续的,你不应该使用 scale_y_discrete,而你的 x 轴已经是离散的,scale_x_discrete 是没必要。如果要使用 Group 定义颜色组,请使用 aes(colour=Group)

ggplot(melteddf2, aes(x=variable, y=value, colour = Group)) + geom_point() +
  scale_y_continuous(breaks=seq(-3, 3, by = 0.5)) + 
  labs(title = paste("Sample plot"))