Составьте график всех наблюдений, но раскрасьте их по разным группам - PullRequest
1 голос
/ 12 марта 2019

У меня есть пример данных, приведенных ниже, с уникальными идентификаторами образцов и тремя группами.Мне нужно отобразить все наблюдения (строки) в «df», но раскрасить их в соответствии с идентификаторами группы («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)

Когда я использую группу = 1, мне удается получить график, но наблюдения окрашиваются по-разному.Но где я могу указать информацию 'groupid'?Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Значение, которое вы передаете в 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()

Создает это: enter image description here

Причина, по которой ваш код не сработал, заключалась в том, что 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))
1 голос
/ 12 марта 2019

В дополнение к ответу @ 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" ...

Вам нужна только одна строка кода для преобразования в длинный формат, и для сохранения идентификаторов вашей группы вы можете добавить переменную 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 не требуется. Используйте aes(colour=Group), если вы хотите использовать 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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...