Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 350
Konrad Avatar asked Jul 10 '15 09:07

Konrad


People also ask

How do you add a correlation coefficient to a scatter plot in R?

To add correlation coefficient with P-value to a scatter plot, we use the stat_cor() function of the ggpubr package in the R Language. The ggpubr package provides some easy-to-use functions for creating and customizing ggplot2 plots.

How do you plot correlation in R?

In order to compute a correlation in R, we use the cor() function. The first argument x is the first of the two variables for which we would like to calculate a correlation. The second argument y is the second of the two variables.

What is r in a scatter plot?

The sample correlation coefficient (r) is a measure of the closeness of association of the points in a scatter plot to a linear regression line based on those points, as in the example above for accumulated saving over time.


1 Answers

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.

like image 92
aosmith Avatar answered Sep 24 '22 01:09

aosmith