…can we please universally start accepting tables and figures as part of the manuscript during review (i.e., not at the end)? It’s a pain to either scroll up and down, or open a second instance of the PDF just so that I can actually understand what I’m reading. Yes, I understand that there are historical reasons for this, and it facilitates production, but at the time of writing and reviewing, we have different concerns (plus: production gets paid, I don’t). Journals have managed to move from printed copies to digital copies of the manuscript, so there is no reason we cannot do the next step…
Getting Rid of Page Numbers in split.screen
This is something that nags me from time to time, particularly because it’s a documented feature I tend to forget. When using the split.screen()
function of R to combine plots (rather than par(mfrow)
) in Sweave or Knitr, the screen numbers are output in the main text, alongside the figure. Usually we want the figure only. All we need is adding results='hide'
. I find this slightly counter-intuitive, because I do want the result (in form of a figure). That said, I don’t have a suggestion what alternative would feel more intuitive. The same issue also happens when using library(rgdal)
for a local shapefile, and other similar situations.
Plotting Gradients in R
There might be an easier way to do this, but here’s one way to plot gradients in R. It draws on
colorRampPalette()
and a for()
loop, and isn’t very fast on underpowered machines — but it works. Using colorRampPalette()
we can create the necessary gradients. Here’s the code I cobbled together:
fade <- function(M=1, S=1, Y=1, H=0.05, K=50, dk = "black") {
# M = midpoint; S = spread; Y = position; H = height; K = steps in gradient; dk = dark colour
colfunc <- colorRampPalette(c(dk, "white")) # creates a function to produce the gradients
D <- S/K # delta; how wide does one rectangle have to be?
collist <- colfunc(K) # create K colours
for(i in 0:(K-1)) { # draw rectangles; K-1 because I start with 0 (this makes it easier in the line just below)
rect(M+(D*i), Y-H, M+D+(D*i), Y+H, col=collist[i+1], border=NA) # drawing a narrow rectangle, no borders drawn; to right
rect(M-(D*i), Y-H, M-D-(D*i), Y+H, col=collist[i+1], border=NA) # to left
}
}
Before applying the above code, we need an empty plot:
plot(1, ylim=c(0.5,8), xlim=c(1,8), type="n", axes=F, xlab="", ylab="")
Important are the ylim
and xlim
arguments, and the type="n"
to plot nothing. I usually prefer drawing my own axes — axis(1)
, axis(2)
as this allows easy customization…
Why not highlight the midpoint? We can this as follows:
text(M, Y, "|", col="white", font=4) # font = 4 for bold face
In many cases, the package denstrip may offer an easier solution, albeit one where we have less control.
P.S. The code produces just one of the lines in the plot included at the top.
Using Shading in Coefficient Plots
Having recently discovered the R package denstrip, I was struck by intuitive it is to use shading to express uncertainty. If you need convincing, check out the paper by Jennifer Lundquist and Ken Lin linked below.
I wondered whether this would also work well for generic coefficient plots to examine regression results. The proof is in the pudding, so here’s some quickly thrown together code (also on Gist).
library(denstrip)
fade <- function(x, labels=names(coef(x)), expo=FALSE, xlab="", ylab="", bty="n", ...) {
# argument: a regression, additional arguments passed on to plot() and text()
coe <- summary(x)$coefficients[,1] # extract coefficients
cse <- summary(x)$coefficients[,2] # standard errors
len <- length(coe) # how many coefficients (without intercept)
if(expo == TRUE) { # exponential form
coe <- exp(coe)
cse <- exp(cse)
}
ran <- c(min(coe)- 3*max(cse), max(coe)+3*max(cse)) # range of values
plot(0, ylim=c(1.5,len+0.5), xlim=ran, xlab=xlab, ylab=ylab, bty=bty, type="n", ..., axes=FALSE) # empty plot
# title, xlab, ylab, etc. can be used here.
for(i in 2:len) {
dens <- rnorm(mean=coe[i], sd=cse[i], n=1000)
denstrip(dens, at=i) # passing arguments conflicts with plot()
text(ran[1],i, labels[i], adj = c(0,0), ...) # adj to left-align
# cex, col can be used here
}
axis(1)
}
Well, it does work (see figure above). If we add an abline(v=0, lty=3)
, we can easily highlight the zero line.
However, intuitive as it is, I’m not really convinced. Here’s the coefficient plot the arm package produces. While it doesn’t use shading, lines of different thickness are used to indicate the standard errors — nicely de-emphasizing the end-point. There’s more emphasis on the point estimate (i.e. the coefficient itself: the square), while my code hides this. I did try adding a white line at the point estimate (third figure, below), but this doesn’t resolve my biggest worry: the amount of ink that is used to convey the message… I’m just not convinced that the shading adds that much to the relatively simple coefficient plots in the package arm.
(There’s an argument width
that could be added to line calling denstrip
, like width=0.2
, but it hasn’t convinced me enough.)
Jackson, Christopher H. 2008. “Displaying Uncertainty with Shading.” The American Statistician 62 (4): 340–47. doi:10.1198/000313008X370843.
Lundquist, Jennifer H., and Ken-Hou Lin. 2015. “Is Love (Color) Blind? The Economy of Race among Gay and Straight Daters.” Social Forces, March, sov008. doi:10.1093/sf/sov008.
Why Aren’t They There: Additional Figures
There’s always more to say, and many potential figures did not make it into my research monograph on political representation. I have added some additional figures on Figshare. I have added additional plots on the distributions of representation scores in different policy domains, but also included some of the figures in the book, including the theoretical framework of political representation developed in the book.