R ggplot2: унифицируйте заливку для сгруппированных выборок с двоичными данными в geom_tile

#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. отлично, теперь это имеет смысл!