Search code examples
rggplot2

ggplot axis with midline decimal


I need to output ggplot figures with midline decimals for my y axis.

The unicode \U00B7 allows to get midline decimal dots but I don't know how to get an automated result without some unclean solutions as I show in my attempt.

My code is not reproducible for examples where the numbers don't have the same sign (positive vs negative), or the same number of digits (2 digits vs 1 digit for example).

Reproducible example

##### Import library
library(ggplot2)


##### Initiating data
### y-axis labels
yaxisLabels <- format(seq(3, 7, 0.5), nsmall=1)

### Dataset
set.seed(1)
dftmp <- data.frame(values=rnorm(100, 5, 0.5),
                    group=rep(c("A", "B"), each=50))


##### Initiating plot
### Original plot
ggplot(data=dftmp, aes(y=values, x=group)) + 
  geom_boxplot() + 
  scale_y_continuous(limits=c(3, 7), breaks=seq(3, 7, 0.5)) + 
  theme_minimal()

### My attempt
ggplot(data=dftmp, aes(y=values, x=group)) + 
  geom_boxplot() + 
  scale_y_continuous(limits=c(3, 7), breaks=seq(3, 7, 0.5), 
                     labels=paste0(substr(yaxisLabels, 1, 1), "\U00B7", substr(yaxisLabels, 3, 3))) + 
  theme_minimal()

Original plot
enter image description here

My attempt
enter image description here

### Mikko Martila solution
ggplot(data=dftmp, aes(y=values, x=group)) + 
  geom_boxplot() + 
  scale_y_continuous(limits=c(3, 7), breaks=seq(3, 7, 0.5),
                     labels=scales::label_number(decimal.mark="\U00B7")) + 
  theme_minimal()

Solution

  • The labels argument can be a function. scales::label_number(decimal.mark = "\U00B7") would do the trick.