Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change ggplot2 colourbar tick marks to black

In some of my plots I find it hard to see the tick marks in the colour bar. I haven't been able to find a documented way to change the colour of the ticks. All the examples seem to focus on changing the labels or not drawing ticks at all. Is it possible?

#  Data
require(ggplot2)
require(grid)
n <- 100
x <- y <- seq(-4*pi, 4*pi, len=n)
r <- cos( sqrt( outer(x^2, y^2, "+") ) ^ 2 )
df <- data.frame( x = rep( x , each = n) , y = rep( y , times = n ) , val = c(r) )

#  Plot
ggplot( df , aes( x , y , fill = val ) )+
  geom_raster()+
  scale_fill_gradient( low = "#FFFFFF" , high = "#de2d26" )+
  guides( fill = guide_colourbar( barheight = unit( 3 , "in" ) ) )+
  theme_bw()+
  theme( line = element_line( colour = "#0000FF" ) )

enter image description here

How can I make the ticks in the colourbar be plotted in black rather than white, without changing other elements of the plot?


p.s. kudos to this question for the function to create the example data

like image 303
Simon O'Hanlon Avatar asked Jan 13 '14 10:01

Simon O'Hanlon


2 Answers

The pull request mentioned in another answer never made it into the ggplot2 code base, but this is now possible in a slightly different way in the development version (slated to be released as ggplot2 2.3):

ggplot(df, aes(x, y, fill = val)) +
  geom_raster() +
  scale_fill_gradient(low = "#FFFFFF", high = "#de2d26") +
  guides(fill = guide_colourbar(barheight = unit( 3 , "in" ),
                                ticks.colour = "black",
                                ticks.linewidth = 1)) +
  theme_bw() +
  theme(line = element_line(colour = "#0000FF"))

enter image description here

You can also add a frame, which may be useful when some of the colors in the colorbar are very light.

ggplot(df, aes(x, y, fill = val)) +
  geom_raster() +
  scale_fill_gradient(low = "#FFFFFF", high = "#de2d26") +
  guides(fill = guide_colourbar(barheight = unit( 3 , "in" ),
                                ticks.colour = "black",
                                ticks.linewidth = 1,
                                frame.colour = "black",
                                frame.linewidth = 1)) +
  theme_bw() +
  theme(line = element_line(colour = "#0000FF"))

enter image description here

like image 128
Claus Wilke Avatar answered Sep 30 '22 10:09

Claus Wilke


EDIT: Please refer to the answer below by Claus Wilke.


I have included the original answer below, but please note that it is now outdated and I do not recommend using it.

I included the functionality to customize tick marks and legend borders in my fork of ggplot2. I have submitted a pull request, but thought I would let people know here in case they stumble on this question.

Install my fork using the following code,

if (!require(devtools))
  install.packages('devtools')
install_github('paleo13/ggplot2')

We can specify black marks using the following code,

ggplot(df, aes( x, y, fill = val)) +
  geom_raster() +
  scale_fill_gradient(low = "#FFFFFF", high = "#de2d26") +
  theme_bw() +
  theme(line = element_line(colour = "#0000FF")) +
  guides(fill = guide_colourbar(barheight = unit(3, "in"),
   ticks=element_line(color='black'), border=element_line(color='black')))

black ticks and color ramp border

(I would have included this as a comment but I lack the reputation to do so, if anyone with sufficient privileges wants to delete this answer and move the contents to the comments then feel free)

like image 31
paleo13 Avatar answered Sep 30 '22 10:09

paleo13