Home ยป How to anti-alias plots in R

How to anti-alias plots in R

  • by
Want to do a random act of kindness? Share this post.

In this blog post I elaborate on anti-aliasing in R. Some feedback I received quite a while is that the plots produced by ggplot2 in R aren’t as pretty as those produced by Microsoft Office, or even Python’s Matplotlib. This feedback is justified, because R doesn’t anti-alias it’s produced plots. So I searched and somewhere in Egypt I found a solution.

What is anti-aliasing? Wikipedia defines it as: “a technique for minimizing the distortion artifacts known as aliasing when representing a high-resolution image at a lower resolution.” In other words, in the real world, a diagonal line looks nice. But your computer uses a monitor with a two-dimensional grid with pixels. To draw that diagonal line, you can’t colorize half a pixel. Enter: anti-alising.

There are many ways to anti-alias an object, but the image below represents a common one. The pixels close to your diagonal line are colorized in a color that’s somewhere in between the line and the other pixels nearby. A black line on a white background produces some extra pixels in a shade of grey.

That’s why your plots produced by R look ugly: the objects within it aren’t anti-aliased. At least… in Windows. Because anti-alising already works out of the box in R on MacOS. If you have you produced visualizations in R on a MacOS device, you might have noticed that they look much smoother.

The solution in Windows is to switch to another rendering engine that does provide anti-alising. A good option is Cairo. It’s open source. It’s device-independent, which means it will produce the same result on every device. And you can install the Cairo library easily and load it as follows:


The CairoWin() function initializes a new graphics device that uses the cairo graphics library for rendering. If you use ggplot now, your plots will be rendered in a new window that uses the cairo library. Here is an example:

dt <- data.table(nhtemp)
dt[,year := ymd(paste0(seq(1912,1971,1),'-01-01'))]

g <- ggplot(dt,aes(x = year, y = nhtemp, group = 1)) + 
  geom_line(size = 1) + 
  geom_point(size = 3)

You can save your images by providing the parameter type=’cairo’ to the ggsave() function.

ggsave(g, filename = 'nhtemp_with_cairo.png', dpi = 300, type = 'cairo',
       width = 8, height = 4, units = 'in')

Here’s the difference. This one is with anti-alaising:

And this one is without anti-alaising:

The difference? Take a look at this:

Want to do a random act of kindness? Share this post.