I usually make my own idiosyncratic choices when preparing plots. However, I wonder if there are any best practices for generating plots.
Note: Rob's comment to an answer to this question is very relevant here.
I usually make my own idiosyncratic choices when preparing plots. However, I wonder if there are any best practices for generating plots.
Note: Rob's comment to an answer to this question is very relevant here.
The Tufte principles are very good practices when preparing plots. See also his book Beautiful Evidence
The principles include:
The term to search for is Information Visualization
SO
: stackoverflow.com/questions/6973394/…
$\endgroup$
We could stay here all day denoting best practices, but you should start by reading Tufte. My primary recommendation:
Keep it simple.
Often people try to load up their charts with information. But you should really just have one main idea that you're trying to convey and if someone doesn't get your message almost immediately, then you should rethink how you have presented it. So don't start working on your chart until the message itself is clear. Occam's razor applies here too.
One rule of thumb that I don't always follow but which is on occasion useful is to take into account that it is likely that your plot will at some point in its future be
You need to try and make your plots clear enough that even if they are imprecisely reproduced in the future, the information the plot is trying to convey is still legible.
In the physics field there is a rule that the whole paper/report should be understandable only from quick look at the plots. So I would mainly advise that they should be self-explanatory.
This also implies that you must always check whether your audience is familiar with some kind of plot -- I had once made a big mistake assuming that every scientist knows what boxplots are, and then wasted an hour to explain it.
In addition to conveying a clear message I always try to remember the plotsmanship:
I have configured my plotting software (matplotlib, ROOT or root2matplotlib) to do most of this right by default. Before I was using gnuplot
which needed extra care here.
If plotting in color, consider that colorblind people may have trouble distinguishing elements by color alone. So:
Here are my guidelines, based on the most common errors I see (in addition to all the other good points mentioned)
Take a look at the R graphics library, ggplot2. Details are at the web page.This package generates very good default plots, that follow the Tufte principles, Cleveland's guidelines and Ihaka's color package.
These are wonderful suggestions. We have assembled a lot of materials here. A group of statisticians in the pharma industry, academia, and FDA have also creating a resource that are useful for clinical trials and related research here$^\dagger.$
My personal favorite graphics book is Elements of Graphing Data by William Cleveland.
In terms of software, in my opinion it is hard to beat R's ggplot2
and plotly
. Stata also supports some excellent graphics.
$\dagger$ The site is unfortunately temporarily down.
It also depends on where you wan't to publish your plots. You'll save yourself a lot of trouble by consulting the guide for authors before making any plots for a journal.
Also save the plots in a format that is easy to modify or save the code you have used to create them. Chances are that you need to make corrections.
Don't use dynamite plots: http://pablomarin-garcia.blogspot.com/2010/02/why-dynamite-plots-are-bad.html, use violin plots or similar (boxplots family)
One thing that I seem to remember Tufte mentioning, that isn't in the other answers is mapping - that is, make position, direction, size, etc. on your graph represent reality. What is up on the graph should be up in the real world. What is big should be big (keeping in mind that areas should represent areas, and volumes volumes. Never try to represent a scalar value by an area, it's highly ambiguous!). This also applies to colours, shapes, etc, if they are relevant.
An interesting example is the "skirt series" graph here. While technically it's correct, and a "taller" skirt length occupies a higher position on the graph, it's actually quite confusing, because skirt length starts from the top, and goes down (unlike humans, or trees, where we measure the height from the ground). So increased skirt length actually represents a lower value:
skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat",skip=5)
skirtsseries <- ts(skirts, start=c(1866))
plot.ts(skirtsseries, ylim=c(max(skirts), min(skirts)))
There are, as always, difficulties. For example, we generally consider time to move forward, and in the west, at least, we read left to right, so our time-series graphs also usually flow left to right as time increases. So what happens if you want to represent something that's best represented laterally (e.g. east-west measurements of something), over time? In that case, you have to compromise, and either portray time a moving up or down (which one depends again on cultural perceptions, I guess), or choose to map your lateral variable to up/down on your graph.
I would add that the choice of plot should reflect the type of statistical test used to analyse the data. In other words, whatever characteristics of the data were used for analysis should be shown visually - so you would show means and standard errors if you used a t-test but boxplots if you used a Mann-Whitney test.
The other answers are too formulaic to be convincing, so let me give a more general answer. I've struggled with this question for a while. I offer this process:
I am skeptical of blanket claims such as "keep it simple" -- what does that mean? Well, it depends on the audience. Some audiences will eat up the Tufte style. But some audiences appreciate a little chart junk now and then. Some people are bored by scatterplots. Some people like colorful backgrounds. Is it so wrong to engage them a little bit even if you compromise "aesthetic" purity? That is up to you to decide.
Your audience's reaction will be an important piece of feedback, but not the only one. If you find a way to measure their understanding before and after your presentation, then you will start to understand the impact you've made.
The "right" answer will depend upon these sorts of questions:
What media will you be using?
Are you creating static or interactive plots?
Are you trying to tell a pre-defined story (exposition) or encourage experimentation (exploration)?
To what degree do you want the audience to draw their own conclusions?
To what degree to you want the audience to follow along with and be convinced by your story?
To what degree to you want the audience to challenge your findings?
In summary, design your materials deliberately given your message, audience, and constraints.
It depends on the way in which the plots will be discussed.
For instance, if I'm sending out plots for a group meeting that will be done with callers from different locations, I prefer putting them together in Powerpoint as opposed to Excel, so it's easier to flip around.
For one-on-one technical calls, I'll put something in excel so that the client be able to move a plot aside, and view the raw data. Or, I can enter p-values into cells along side regression coefficients, e.g.
Keep in mind: plots are cheap, especially for a slide show, or for emailing to a group. I'd rather make 10 clear plots that we can flip through than 5 plots where I try to put distinct cohorts (e.g. "males and females") on the same graph.
Here are my personal best practices (subjective):
Generally important:
Settle for a main message and try to most easily and effectively communicate it
Name your plot axes appropriately, e.g., „hours“, „dollars“, „dollars per hour“
If the axes titles do not already make it fully clear, indicate what unit the axis is representing, e.g., „Expenditure (in percentage of total daily USD spending)“
If your axis scales have a zero position, include it, e.g., in a bar chart with the height representing the count of items or for monetary values
If you use transformed axes, clearly indicate this, e.g., for a log-scale transformation
Use colours to encode information (nowadays, even scientific journal usually print in colour), e.g., food price series in „orange“ and energy price series in „blue“, if you compare two time series of prices
Remember that colours invoke emotions, e.g., „red“ for losses and bad events, „green“ for positive things
People are naturally drawn to bright colours and bold things first in a graph, so encode the most important thing for your main message in the brightest colour, e.g., they will usually spot the red line first and the rest of the plot only later
Otherwise, we (usually) read from left to right, up to down, so place the most important things in a title or graph ideally on the left-upper side
Always include a legend if you use colours
Remember that some people are colour blind
Only use 3-dimensional plots if the third dimension is necessary to convey your message
For bar charts: if you have categorical values on the x-axis and (many) text labels describing these, simply flip your axes so the text labels are on the y-axis instead
Use annotations and text labels to emphasize important values
Most important: do not use pie charts (never ever ;)), but bar charts instead (percentage values in pie charts are hard to read for us humans)
Depending on your audience: