0

I am trying to add different colors to a text in ggplot using the function annotate(). The results are quite good, but I have to define manually which are the right y values to correctly overlap the text. Plot with annotations for

I would love to know if there is a better way to overlap text in annotations in R. Thank you,

Btw, here is the code I am using:

ex_3_1 %>% 
  ggplot(aes(x = DATE)) +
    # geometries
    geom_line(aes(y = if_else(ORIGIN == "ACTUAL" |
                                (YEAR == 2019 & MONTH == "JUN"), 
                              SALES, NULL)), size = 1) +
    geom_line(aes(y = if_else(ORIGIN == "FORECAST", SALES, NULL)), 
              linetype = "dashed", size = 1) +
    geom_point(aes(y = REL_SALES), size = 3) +
    geom_point(aes(y = if_else(MONTH == "JUL" & YEAR == 2018, SALES, NULL)), 
               shape = 21, fill = "darkorange", size = 3) + 
    geom_point(aes(y = if_else(MONTH == "FEB" & YEAR == 2019, SALES, NULL)), 
               shape = 21, fill = col, size = 3) + 
    geom_text(aes(y = SALES, label = dollar(round(REL_SALES,1), 
                                 suffix = "B", accuracy = 0.1)), 
              vjust = -1.5, hjust = 0.2, size = 3) +
    # annotations
      # square text
    annotate(geom = "rect", xmin = as_date("2019-05-20"), 
             xmax = as_date("2020-01-10"), ymin = 0, ymax = 2.6, 
             alpha = 0.1) + 
    annotate(geom = "text",
             x = as_date("2020-01-01"), y = 1, hjust = 1, vjust = -1,
             label = expression(bold("2019 FORECAST")), 
             col = "gray60", size = 3.25) +
    annotate(geom = "text",
             x = as_date("2020-01-01"), y = 1, hjust = 1, vjust = 1,
             label = paste0("This is provided by ABC\n",
                              "consultants and based on\n",
                              "market data through June.\n",
                              "The forecast assumes no\n",
                              "major market changes.\n"), 
             col = "gray60", size = 3.5) +
      # 2018 notes
    annotate(
      geom = "text", x = as_date("2018-01-10"), y = 3.5, hjust = 0, vjust = 1,
      label = paste0("2018: Jan-Jun was a period of stability, with\n",
                     "fairly steady growth (averaging +3% per\n",
                     "month). There was a nearly 20% decrease\n", 
                     "in July, when Product X was recalled and\n", 
                     "pulled from the market. Total sales remained\n", 
                     "at reduced volume for the rest of the year."),
      col = "gray60", size = 3.5) +   
    annotate(
      geom = "text", x = as_date("2018-01-10"), y = 3.5, hjust = 0, vjust = 1,
      label = expression(bold("2018:")),
      col = "gray60", size = 3.5) +
    annotate(
      geom = "text", x = as_date("2018-01-10"), y = 3.19, hjust = 0, vjust = 1,
      label = expression(phantom("month). There was a ")*
                           "nearly 20% decrease"),
      size = 3.5, col = "darkorange") +
    annotate(
      geom = "text", x = as_date("2018-01-10"), y = 3.03, hjust = 0, vjust = 1,
      label = "in July",
      size = 3.5, col = "darkorange") +
      # 2019 notes
    annotate(
      geom = "text", x = as_date("2019-01-10"), y = 3.5, hjust = 0, vjust = 1,
      label = paste0("2019: The year started at less than $1.6B, but\n",
                     "Increased markedly in February, when a new\n",
                     "study was released. Total sales have increased\n", 
                     "steadly since then and this projected to continue.\n", 
                     "The latest forecast is for $2.4B in monthly sales by\n", 
                     "the end of the year."),
      col = "gray60", size = 3.5) +
    annotate(
      geom = "text", x = as_date("2019-01-10"), y = 3.5, hjust = 0, vjust = 1,
      label = expression(bold("2019:")),
      col = "gray60", size = 3.5) +
    annotate(
      geom = "text", x = as_date("2019-01-10"), y = 3.35, hjust = 0, vjust = 1,
      label = "Increased markedly in February",
      size = 3.5, col = col) +
    # scales
    scale_x_date(date_labels = "%b'%y", date_breaks = "3 month") +
    scale_y_continuous(labels = dollar, breaks = c(seq(0,3.5,0.5)), 
                       limits = c(0, 3.5)) +
    # titles
    labs("Market size over time") +
    ylab("SALES ($USD BILLIONS)") +
    # themes
    theme_void() +
    theme(
      axis.line.x = element_line(color = "gray58"),
      axis.text.y = element_text(size = 11, color = "gray58"),
      axis.title.y = element_text(hjust = 1, color = "gray58"),
      axis.text.x = element_text(size = 9, color = "gray58")
    )
pogibas
  • 27,303
  • 19
  • 84
  • 117
  • This will be a much better question if you share a little bit of data reproducibly so that we can run your code. Doesn't need to be everything, just enough rows so that the code runs. `dput()` is a great way to share data in a copy/pasteable way. – Gregor Thomas Dec 17 '19 at 16:50
  • You also might look into `?strwrap` rather than manual line breaks. – Gregor Thomas Dec 17 '19 at 16:50
  • Hi! Thanks for your reply! Here is a link to download the data: https://drive.google.com/file/d/1JzAjW5BDDsn9uwftfXbByR3CtHesVxHF/view?usp=sharing – joan claverol Dec 19 '19 at 10:29
  • 1
    You may find people other than me willing to download, import, and experiment with your full data. But you'll get help much faster if you share a **little** bit of data in a copy/pasteable way. [See this FAQ about making reproducible examples in R](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) for lots of tips. `dput()` works really well, e.g., `dput(droplevels(your_data[1:10, ]))` makes a copy/pasteable version of the first 10 rows. If you could find an appropriate 10-20 row subset to share, it makes it very easy for people to help you. – Gregor Thomas Dec 19 '19 at 14:13

0 Answers0