## Variation I

Just playing around the other day to get the default *plot.density()* function a bit more like publishing quality. Above is my favorite so far. Further down are two more spartanic versions.

In this connection I also wrote my first function. When I get more customed to R I will package my ideas into an R library – but later…

There is the possibility to call R-functions without embedding the code into your analysis script, but I did not look that up yet, so embedding the following code into your script (at the beginning) and then using

`densityplot(Dataset$Coviate)`

will do the job, where **Dataset** and **Covariate** have to be replaced by the according values of course.

Now the function code:

`# function densityplot`

densityplot <- function(x , digits = 1 , xlab = "" , ylab = "" , main = "Density" , col = "blue"){

dens <- density(x , na.rm = T)

bins <- as.numeric(cut(dens$x , breaks = fivenum(x)))

i1 <- bins == 1 & !is.na(bins)

i2 <- bins == 2 & !is.na(bins)

i3 <- bins == 3 & !is.na(bins)

i4 <- bins == 4 & !is.na(bins)

x.p1 <- dens$x[i1]; x.p1 <- c(x.p1,max(x.p1),min(x.p1))

x.p2 <- dens$x[i2]; x.p2 <- c(x.p2,max(x.p2),min(x.p2))

x.p3 <- dens$x[i3]; x.p3 <- c(x.p3,max(x.p3),min(x.p3))

x.p4 <- dens$x[i4]; x.p4 <- c(x.p4,max(x.p4),min(x.p4))

y.p1 <- dens$y[i1]; y.p1 <- c(y.p1,0,0)

y.p2 <- dens$y[i2]; y.p2 <- c(y.p2,0,0)

y.p3 <- dens$y[i3]; y.p3 <- c(y.p3,0,0)

y.p4 <- dens$y[i4]; y.p4 <- c(y.p4,0,0)

plot(dens , type = "n" , axes = F, main = main, xlab = xlab , ylab = ylab)

polygon(x.p1,y.p1 , border = F , col = col)

polygon(x.p2,y.p2 , border = F , col = col)

polygon(x.p3,y.p3 , border = F , col = col)

polygon(x.p4,y.p4 , border = F , col = col)

axis(side = 1 , line = 0 , at = fivenum(x, na.rm = T) , label = c("Minimum","Quartile 1", "Median", "Quartile 3", "Maximum"), lwd = 0, cex.axis = 0.6)

axis(side = 1 , line = 1 , at = fivenum(x, na.rm = T))

axis(side = 1 , line = 1 , at = round(mean(x , na.rm = T) , digits = digits) , tcl = 0.4 , label = F)

axis(side = 1 , line = -1.5 , at = round(mean(x , na.rm = T) , digits = digits) , tick = F , cex.axis = 0.6)

axis(side = 1 , line = -2.0 , at = round(mean(x , na.rm = T) , digits = digits) , label = "Mean" , tick = F , cex.axis = 0.6)

}

## Variation II

Some might find the colored area to much, although IMHO it puts the focus on the fact that one is looking at areas when ploting a density. But then something similar without the color fill. Not a function just a few lines of code to embed and adjust to the script:

… and the source…

`plot(density(angio$PE_ALDER , na.rm = T), axes = F, main = "Basic densityplot", xlab = "" , ylab = "")`

# Add Quartiles

axis(side = 1 , line = 1 , at = fivenum(angio$PE_ALDER, na.rm = T) , label = c("Minimum","Quartile 1", "Median", "Quartile 3", "Maximum"), lwd = 0, cex.axis = 0.6)

axis(side = 1 , line = 2 , at = fivenum(angio$PE_ALDER, na.rm = T))

abline(v = fivenum(angio$PE_ALDER, na.rm = T)[2:4] , lty = 3)

# Mean

axis(side = 1 , line = 2 , at = round(mean(angio$PE_ALDER , na.rm = T) , digits = 2) , tcl = 0.4 , label = F)

axis(side = 1 , line = -0.5 , at = round(mean(angio$PE_ALDER , na.rm = T) , digits = 2) , tick = F)

axis(side = 1 , line = -1.4 , at = round(mean(angio$PE_ALDER , na.rm = T) , digits = 2) , label = "Mean" , tick = F , cex.axis = 0.6)

abline(v = mean(angio$PE_ALDER , na.rm = T) , lty = 4)

## Variation III

… finally an even more stripped down version without the mean:

which was achieved by:

`plot(density(angio$PE_ALDER , na.rm = T), axes = F, main = "Basic densityplot", xlab = "Age")`

abline(v = fivenum(angio$PE_ALDER, na.rm = T)[2:4] , lty = 3)

axis(side = 1 , line = -1 , at = fivenum(angio$PE_ALDER, na.rm = T) , label = c("Minimum","Quartile 1", "Median", "Quartile 3", "Maximum"), lwd = 0, cex.axis = 0.6)

axis(side = 1 , at = fivenum(angio$PE_ALDER, na.rm = T))