Search code examples
rplotggplot2visualizationlattice

Harvey balls in R


How to create a chart like the following in R?

enter image description here

Some toy data would look like this:

# Data
data <- rep(c(0, 25, 50, 75, 100),6) 
data <-  matrix(data, ncol=3, byrow=TRUE) 
colnames(data) <- paste0("factor_", seq(3))
rownames(data) <- paste0("observation_", seq(10))


#                factor_1 factor_2 factor_3
# observation_1         0       25       50
# observation_2        75      100        0
# observation_3        25       50       75
# observation_4       100        0       25
# observation_5        50       75      100
# observation_6         0       25       50
# observation_7        75      100        0
# observation_8        25       50       75
# observation_9       100        0       25
# observation_10       50       75      100

Thanks.


Solution

  • Here's a quick & dirty solution using base graphics and unicode symbols:

    library(extrafont)
    # font_import() # ... if you need to
    loadfonts()
    getPch <- function(x) {
      sapply(x, function(x) {
        switch(as.character(x), 
        "0"=-9675,
        "25"=-9684,
        "50"=-9682,
        "75"=-9685,
        "100"=-9679
      )})
    }
    par(mar=c(2, 7, 2, 4))
    plot(y =rep(1:nrow(data), ncol(data)), 
         x = rep(1:ncol(data), each=nrow(data)), 
         pch = getPch(as.vector(data)), 
         axes = F, xlab = "", ylab = "",
         cex = 3, xlim = c(.5, ncol(data) + .5),
         family = "Arial Unicode MS")
    abline(v = 0:ncol(data)+.5)
    abline(h = 1:nrow(data) + .5)
    mtext(side = 1, at=1:ncol(data), text=colnames(data))
    mtext(side = 2, at=1:nrow(data), text=rownames(data), las=2)
    

    enter image description here