'r: ggplot2 and shiny: how to make text more readable without using geom_label?

I use shiny to create some reactive plots. When I use geom_text to put the intercepts of geom_vlines next to the lines, I can hardly read the text because of the colors of the plot. I have tried with various colours, none work well.

When I use geom_label instead of geom_text from the {ggplot2} package, my plots take much longer to load. The time basically triples. I have read the article on geom_label and it says that it takes longer to create the plot.

So my question is, how could I make text more readable on the plot without using geom_label and thus slowing down the time to create the plot? Does anybody have any ideas? I know there are solutions, but which one is the ideal one in terms of the time it takes to create the plot. Thank you!

EDIT Here is an example. I can not change the colors of the plot or text. I could change the position along the y axis of the text.

    set.seed(1)
    df <- data.frame(numbers = rnorm(1000, 1000, 500))
    p123 <- ggplot(data = df, aes(x = numbers))+
      geom_histogram(bins = 15, fill = "#000D62")+
      geom_vline(xintercept = mean(df$numbers)*2.5)+
      geom_text(label = paste0("value = ", round(mean(df$numbers)*2.5, 0),
          "€"), x = mean(df$numbers)*2.5, y = 4,
           size = 4, colour = "#FFBA18")+
      labs(x = "Numbers", y = "number of observations")
    plot(p123)

enter image description here



Solution 1:[1]

Option 1

One option is to replicate the geom_text() layer and put a copy of it below in white and bold to serve as a makeshift dropshadow. I don't know if that would actually improve your performance, but it does technically avoid using geom_label(). Also I've found that it can be used with plotly::ggplotly() which is not true of geom_label().

library(tidyverse)
# sim data
set.seed(1)
df <- data.frame(numbers = rnorm(1000, 1000, 500))

# base plot
p <- ggplot(data = df, aes(x = numbers)) +
  geom_histogram(bins = 15, fill = "#000D62") +
  geom_vline(xintercept = mean(df$numbers) * 2.5) +
  labs(x = "Numbers", y = "number of observations")

## with plain ggplot2 using two geom_text layers
p + 
  geom_text(label = paste0("value = ", round(mean(df$numbers) * 2.5, 0), "€"),
  x = mean(df$numbers) * 2.5, y = 4, size = 4,
  colour = "white", fontface = "bold") +
  geom_text(label = paste0("value = ", round(mean(df$numbers) * 2.5, 0), "€"),
            x = mean(df$numbers) * 2.5, y = 4, size = 4,
            colour = "#FFBA18")

Option 2

Another option is to use the {shadowtext} package which directly addresses this issue.

## with shadowtext library
library(shadowtext)

p + 
  geom_shadowtext(
  label = paste0("value = ", round(mean(df$numbers) * 2.5, 0), "€"),
  x = mean(df$numbers) * 2.5, y = 4, size = 4, colour = "#FFBA18")

Created on 2022-05-18 by the reprex package (v2.0.1)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1