Eric Fail
Eric Fail

Reputation: 7928

ggplot2: Heatmap Plotting, geom_text placement only in selected cells

I'm using a heatmap to follow the attrition in my experiment and I would like to print some date information exclusively in the two first columns, but for some reason ggplot2 won't accept that many missing observations.

This is how my plot look at the moment (way to many dates).

Can anyone tell me how I can limit the geom_text to only the two first columns?

See blow for sample code. heatmap and facet_grid

require(ggplot2)
require(plyr)
require(reshape)

# create sample data
set.seed(666)
dfn <- data.frame(
Referral  = seq(as.Date("2007-01-15"), len= 26, by="23 day"),
VISIT01  = seq(as.Date("2008-06-15"), len= 24, by="15 day")[sample(30, 26)],
VISIT02  = seq(as.Date("2008-12-15"), len= 24, by="15 day")[sample(30, 26)],
VISIT03  = seq(as.Date("2009-01-01"), len= 24, by="15 day")[sample(30, 26)],
VISIT04  = seq(as.Date("2009-03-30"), len= 24, by="60 day")[sample(30, 26)],
VISIT05  = seq(as.Date("2010-11-30"), len= 24, by="6 day")[sample(30, 26)],
VISIT06  = seq(as.Date("2011-01-30"), len= 24, by="6 day")[sample(30, 26)],
Discharge = seq(as.Date("2012-03-30"), len= 24, by="30 day")[sample(30, 26)],
Patient  = factor(1:26, labels = LETTERS),
openCase  = rep(0:1, 100)[sample(100, 26)])

 # set today's data for cases that do not have an Discharge date
 dfn$Discharge[ is.na(dfn$Discharge) ] <- as.Date("2014-01-30")

 mdfn <- melt(dfn, id=c('Patient', 'openCase'), variable_name = "Visit")
 names(mdfn)[4] <- 'Year'

 # order data in mdfn by 'Referral' in dfn
 mdfn$Patient <- factor(mdfn$Patient,levels = (dfn$Patient[order(dfn$Referral)]),
 ordered = TRUE)

mdfn$Year2 <- ifelse(mdfn$Year != 0, 1, 0)
mdfn$Year2[ is.na(mdfn$Year) ] <- 0

mdfn$FWrap <- 'Core Measures'
mdfn$FWrap[mdfn$Visit == 'Referral'] <- 'Referral'
mdfn$FWrap[mdfn$Visit == 'VISIT05' | mdfn$Visit == 'VISIT06'] <- 'Optional Measures'
mdfn$FWrap[mdfn$Visit == 'Discharge'] <- 'Discharge'
mdfn$FWrap <- ordered(mdfn$FWrap, levels = c('Referral', 'Core Measures', 'Optional Measures', 'Discharge'))

base_size <- 9
m2 <- ggplot(mdfn, aes(Visit, Patient)) + 
geom_tile(aes(fill = Year2), colour = "gray") +
scale_fill_gradient(low = "white", high = "steelblue")
m2 + theme_grey(base_size = base_size) + labs(x = "", y = "") +
scale_x_discrete(expand = c    (0, 0)) + scale_y_discrete(expand = c(0, 0)) + 
opts(legend.position = "none", axis.ticks = theme_blank(), 
axis.text.x = theme_text(size = base_size * 0.8, angle = 330, hjust = 0,
colour = "grey50")) + facet_grid(~ FWrap, scales = "free", space="free") + 
geom_text(aes    (label=format(Year, "%b. %d, %Y")), size=3, colour='white')

# this is how I thought I could solve it.
mdfn$Yearlabel <- mdfn$Year
mdfn$Yearlabel[mdfn$Visit != 'Referral' & mdfn$Visit != 'VISIT01'] <- NA
# mdfn[,c(4,5,7,3)]

m2 <- ggplot(mdfn, aes(Visit, Patient)) + 
geom_tile(aes(fill = Year2), colour = "gray") +
scale_fill_gradient(low = "white", high = "steelblue")
m2 + theme_grey(base_size = base_size) + labs(x = "", y = "") +
scale_x_discrete(expand = c    (0, 0)) + scale_y_discrete(expand = c(0, 0)) + 
opts(legend.position = "none", axis.ticks = theme_blank(), 
axis.text.x = theme_text(size = base_size * 0.8, angle = 330, hjust = 0,
colour = "grey50")) + facet_grid(~ FWrap, scales = "free", space="free") + 
geom_text(aes    (label=format(Yearlabel, "%b. %d, %Y")), size=3, colour='white')

Upvotes: 2

Views: 2277

Answers (1)

baptiste
baptiste

Reputation: 77106

Try this,

p = ggplot(mdfn, aes(Visit, Patient)) + 
  geom_tile(aes(fill = Year2), colour = "gray") +
  scale_fill_gradient(low = "white", high = "steelblue") + 
  theme_grey(base_size = base_size) + 
  labs(x = "", y = "") +
  scale_x_discrete(expand = c(0, 0)) + 
  scale_y_discrete(expand = c(0, 0)) + 
  opts(legend.position = "none", axis.ticks = theme_blank(), 
       axis.text.x = theme_text(size = base_size * 0.8, angle = 330,
         hjust = 0, colour = "grey50")) + 
  facet_grid(~ FWrap, scales = "free", space="free") 

s = subset(mdfn, Visit %in% c("Referral","VISIT01"))
p + geom_text(aes(label=format(Year, "%b. %d, %Y")), data = s, 
              size=3, colour = 'white')

Upvotes: 3

Related Questions