#r #ggplot2
#r #ggplot2
Вопрос:
Я пытаюсь отобразить тепловую карту «отсутствие / присутствие» с помощью geom_tile в R. Я хотел бы иметь заливку для «1» или «присутствует», если объект (здесь: OTU) можно найти хотя бы в одной из выборок в группе. Итак, ниже приведен пример кода, в котором я сгруппировал образцы по сайтам:
library(reshape2)
library(ggplot2)
df <- data.frame(
OTU = c("OTU001", "OTU002", "OTU003", "OTU004", "OTU005"),
Sample1 = c(0,0,1,1,0),
Sample2 = c(1,0,0,1,0),
Sample3 = c(1,1,0,1,0),
Sample4 = c(1,1,1,1,0))
molten_df <- melt(df)
# add group data
sites <- data.frame(
site = c(rep("site_A", 10), rep("site_B", 10)))
molten_df2 <- cbind(molten_df, sites)
# plot heatmap based on group variable sites
ggplot(molten_df2, aes(x = site, y = OTU, fill = value))
geom_tile()
плитка (site_A, OTU003) состоит из значений Sample1 = 1 и Sample2 = 0, а результат равен 0. С другой стороны, плитка (site_B, OTU003) также имеет Sample3 = 0 и Sample4 = 1, но получается как 1. Может быть, она использует последнее значение для заливки? Поскольку я хотел бы отобразить 1, если OTU появляется в любой из сгруппированных выборок независимо от порядка, я подумал, знает ли кто-нибудь, как это сделать в ggplot2?
Другой способ, о котором я думал (но неудачное кодирование), заключается в написании функции, которая устанавливает оставшиеся значения данного тайла равными 1, если появляется хотя бы одно 1.
Ответ №1:
С помощью библиотеки dplyr
вы можете создать новую переменную, указывающую, присутствует ли OTU на данном сайте хотя бы в одной выборке :
tmp = group_by(molten_df2,OTU, site) %>%
summarise(., PA=as.factor(ifelse(sum(value)>0,1,0)))
Затем нанесите :
ggplot(tmp, aes(x = site, y = OTU, fill = PA))
geom_tile()
Или непосредственно внутри функции ggplot :
ggplot(group_by(molten_df2,OTU, site) %>%
summarise(., PA=factor(ifelse(sum(value)>0,1,0))),
aes(x = site, y = OTU, fill =PA))
geom_tile()
Комментарии:
1. спасибо, это сработало хорошо. Есть ли у вас какие-либо идеи, как было вызвано описанное поведение в вызове geom_tile()?
2. Ваше приветствие ! Для каждой плитки отображаются все значения, но они накладываются друг на друга (первое, второе … до последнего). Таким образом, вы можете видеть только цвет, связанный с последним значением.
3. отлично, теперь это имеет смысл!