Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R graphs: Creating Tufte's horizontal bar lines

Tags:

graph

r

ggplot2

How can we replicate Tufte's implicit horizontal lines in R?

Tufte bars

For example, the following is a good starting point:

library(ggplot2)    
ggplot(msleep, aes(x=order)) + stat_bin() + theme_bw()

Removing the border line should be straightforward. The crucial point, overlaying the horizontal line with the bars, is unclear to me.

I imagine two approaches here:

  1. Ad-hoc solution for this particular example
  2. Suggestion how to incorporate it into a theme
like image 330
Rico Avatar asked Dec 04 '12 11:12

Rico


3 Answers

In principle, this is straightforward - all you need to do is draw white horizontal lines in a new layer. You can use geom_hline to do this:

library(ggplot2)    
ggplot(msleep, aes(x=order)) + stat_bin() + theme_bw() +
  geom_hline(yintercept=seq(5, 20, 5), col="white")

enter image description here

As for your second question - I'd imagine this may be hard to incorporate in a theme, although it should be possible to create a custom geom that reads the y-scale breaks and plot the lines correspondingly.

(I'd love to be proved wrong.)

like image 62
Andrie Avatar answered Oct 18 '22 20:10

Andrie


Not a big addition to @Andrie answer, but you can take an advantage of the package ggthemes to make Tufte-sque plots with ggplot2. Below, I'm using theme_tufte, change the font using extrafont package, and use opts to fine-tune all the other visual features:

library(ggthemes)
library(extrafont)
ggplot(msleep, aes(x=order)) + stat_bin(width=0.6, fill="gray") + 
  theme_tufte(base_family="GillSans", base_size=16, ticks=F) +
  theme(axis.line=element_blank(), axis.text.x=element_blank(),
        axis.title=element_blank()) +
  geom_hline(yintercept=seq(5, 20, 5), col="white", lwd=1.2)

enter image description here

like image 45
Geek On Acid Avatar answered Oct 18 '22 20:10

Geek On Acid


There's also a pretty easy base R solution for this:

tmp <- table(msleep$order)
barplot(tmp, col='black', las=3)
abline(h=seq(5, max(tmp), by=5), col='white', lwd=2)

enter image description here

like image 3
Thomas Avatar answered Oct 18 '22 19:10

Thomas