3

I created a simple heatmap graph with ggplot2 but I need to force the x-axis tick marks to appear at the end of my x variable, rather than at its center. For example, I would expect 1 to appear at the position of where 1.5 is now. I beleive a heatmap done in Base R would do that.

library(car) #initialize libraries
library(ggplot2)  #initialize libraries
library(reshape)

df=read.table(text= "x  y  fill
1 1 B
2 1 A
3 1 B
1 2 A
2 2 C
3 2 A
",  header=TRUE, sep=""  )

#plot data
qplot(x=x, y=y, 
      fill=fill, 
      data=df, 
      geom="tile")+  
      scale_x_continuous(breaks=seq(1:3) ) 

enter image description here

The idea is to create a simple heatmap which looks like this: enter image description here

The tick marks in this graph are placed at the end of the bars instead of their centers

joran
  • 169,992
  • 32
  • 429
  • 468
Max C
  • 2,573
  • 4
  • 23
  • 28

2 Answers2

4

What about this?

object = qplot(x=x, y=y, 
      fill=fill, 
      data=df, 
      geom="tile")+  
      scale_x_continuous(breaks=seq(1:3))

object + scale_x_continuous(breaks=seq(.5,3.5,1), labels=0:3)

enter image description here

Alex
  • 4,030
  • 8
  • 40
  • 62
  • Thanks!!! I was kind of hoping there was an option to do it without adjusting the x scale but it is possible that I do not quite understand the way heatmap works. I appreciate your help – Max C May 22 '12 at 23:12
  • What do you mean by not adjusting the x scale? like instead of starting at 0, you want to start at the proper value which is 0.5? – Alex May 22 '12 at 23:21
  • @MaxC Try this if you want the first tick to start at 0.5: object + scale_x_continuous(breaks=seq(.5,3.5,1), labels=seq(.5,3.5,1)) – Alex May 22 '12 at 23:26
3

geom_tile centres each tile at the coordinates given. Therefore you would expect the output which it does give.

Therefore If you give ggplot the centres (not the top-right corner coordinates) for each cell it will work.

ggplot(df, aes(x = x-0.5, y = y-0.5, fill = fill)) + 
  geom_tile() + 
  scale_x_continuous(expand = c(0,0), breaks = 0:3) + 
  scale_y_continuous(expand = c(0,0), breaks = 0:3) + 
  ylab('y') + 
  xlab('x')

or using qplot

qplot(data = df, x= x-0.5, y = y-0.5, fill = fill, geom = 'tile')  + 
   scale_x_continuous(expand = c(0,0), breaks = 0:3) + 
   scale_y_continuous(expand = c(0,0), breaks = 0:3) + 
   ylab('y') + 
   xlab('x')
mnel
  • 113,303
  • 27
  • 265
  • 254