Adding italicised r with correlation coefficient to a scatter plot chart in ggplot

Konrad picture Konrad · Jul 10, 2015 · Viewed 17.8k times · Source

I'm trying to use the code below to generate a simple scatter plot with a correlation coefficient that would have italicised r placed on the plot.

data(mtcars)

# Load required libraries
require(ggplot2)               # To derive the graphs
require(ggthemes)              # To apply ggplot themes to the chart
require(scales)                # For pretty breaks

# Function to generate correlation coefficient for the charts
corr_eqn <- function(x,y, digits = 2) {
  corr_coef <- round(cor(x, y), digits = digits)
  corr_coef <- expression(paste(italic(r)," = ", corr_coef))
  return(corr_coef)
}

# Provide a scatter plot for income and health deprivation
ggplot(mtcars, aes(x = drat, y = wt)) +
  geom_point(shape = 19, size = 2, aes(colour = as.factor(cyl))) +
  geom_smooth(colour = "red", fill = "lightgreen", method = 'lm') +
  ggtitle("Example") +
  xlab("drat") +
  ylab("wt") +
  scale_colour_tableau("tableau10") +
  geom_text(x = 3, y = 3,
            label = corr_eqn(mtcars$drat,
                             mtcars$wt), parse = TRUE) +
  theme(legend.key = element_blank(),
        legend.background = element_rect(colour = 'black'),
        legend.position = "bottom",
        legend.title = element_blank(),
        plot.title = element_text(lineheight = .8, face = "bold", vjust = 1),
        axis.text.x = element_text(size = 11, vjust = 0.5,
                                   hjust = 1, colour = 'black'),
        axis.text.y = element_text(size = 11, colour = 'black'),
        axis.title = element_text(size = 10, face = 'bold'),
        axis.line = element_line(colour = "black"),
        plot.background = element_rect(colour = 'black', size = 1),
        panel.background = element_blank())

The code stops with the ? mark in console. Running the code with the lines:

#   geom_text(x = 3, y = 3,
#             label = corr_eqn(mtcars$drat, mtcars$wt), parse = TRUE) +

commented, generates the following chart: scatter plot

I'm guessing that my function to generate equation of the format r = 0.7 does not work, how can I fix it?

Answer

aosmith picture aosmith · Jul 10, 2015

As you suspected, you just need to tweak your function. You could have used substitute as seen in this answer, but you can also just use paste here.

corr_eqn <- function(x,y, digits = 2) {
  corr_coef <- round(cor(x, y), digits = digits)
  paste("italic(r) == ", corr_coef)
}

enter image description here

Note that if you'd added as.character to what your original function returned things would have parsed. However, the result would have been with corr_coef as a string instead of the actual correlation coefficient you wanted.

I should also add that geom_text can result in poor resolution if you don't put the labels and coordinates into a new data.frame.

labels = data.frame(x = 3, y = 3, label = corr_eqn(mtcars$drat, mtcars$wt))

Then use the data argument and aes for geom_text:

geom_text(data = labels, aes(x = x, y = y,
                        label = label), parse = TRUE)

See annotate with geom = "text" as another option that avoids the new data.frame.