1

I have a scatterpie plot, and I want to add the percents that correspond to pie proportions, for every single pie in the plot.

This question is a follow-up to a previous question I posted here.

My Data

library(tidyverse)
library(scatterpie)

my_df <- structure(list(day_in_july = 13:20, yes_and_yes = c(0.611814345991561, 
0.574750830564784, 0.593323216995448, 0.610539845758355, 0.650602409638554, 
0.57429718875502, 0.575971731448763, 0.545454545454545), yes_but_no = c(0.388185654008439, 
0.425249169435216, 0.406676783004552, 0.389460154241645, 0.349397590361446, 
0.42570281124498, 0.424028268551237, 0.454545454545455), y = c(0.388185654008439, 
0.425249169435216, 0.406676783004552, 0.389460154241645, 0.349397590361446, 
0.42570281124498, 0.424028268551237, 0.454545454545455)), row.names = c(NA, 
-8L), class = c("tbl_df", "tbl", "data.frame"))


> my_df

## # A tibble: 8 x 4
##   day_in_july yes_and_yes yes_but_no     y
##         <int>       <dbl>      <dbl> <dbl>
## 1          13       0.612      0.388 0.388
## 2          14       0.575      0.425 0.425
## 3          15       0.593      0.407 0.407
## 4          16       0.611      0.389 0.389
## 5          17       0.651      0.349 0.349
## 6          18       0.574      0.426 0.426
## 7          19       0.576      0.424 0.424
## 8          20       0.545      0.455 0.455

Plotting the scatterpie

xvals <- my_df$day_in_july

ggplot(data = my_df) +
  geom_scatterpie(aes(x = day_in_july, y = y*20, r = 0.25), 
                  data = my_df, 
                  cols = colnames(my_df)[2:3],
                  color = "red") + 
  scale_fill_manual(values = c("pink", "seagreen3")) +
  scale_x_continuous(labels = xvals, breaks = xvals) +
  scale_y_continuous(name = "yes but no",
                     labels = function(x) x/20) + 
  coord_fixed()

which gives this plot:

scatterpie



How can I add the pie proportions for each pie, such as the following demo?

  • (Unlike the demo, I'm looking to add percents to all pies, not just the first 5).

scatterpie_demo

One hint for solving this is that scatterpie is basically a circularized boxplot, as commented by the developer. However, when I tried to implement a barplot annotation strategy I realized I had no idea how to apply it to scatterpie.

Emman
  • 3,695
  • 2
  • 20
  • 44

1 Answers1

1

You could add labels with geom_text like this.

ggplot(data = my_df) +
  geom_scatterpie(aes(x = day_in_july, y = y*20, r = 0.25), 
                  data = my_df, 
                  cols = colnames(my_df)[2:3],
                  color = "red") + 
  geom_text(aes(y = y*20, x = day_in_july, 
                label = paste0(formatC(y*100, digits = 3), "%")),
                nudge_y = 0.07, nudge_x = -0.25, size = 3) +
  geom_text(aes(y = y*20, x = day_in_july, 
                label = paste0(formatC((1-y)*100, digits = 3), "%")),
            nudge_y = 0.07, nudge_x = 0.25, size = 3) +
  scale_fill_manual(values = c("pink", "seagreen3")) +
  scale_x_continuous(labels = xvals, breaks = xvals) +
  scale_y_continuous(name = "yes but no",
                     labels = function(x) x/20) + 
  coord_fixed()

enter image description here

Aligning the labels differently for each tick on the x-axis (like in your demo) would require more tinkering.

AndreasM
  • 902
  • 5
  • 10
  • Outstanding! It's wonderful as it is, but if I had wanted to change the text color of each label to match its corresponding pie slice (e.g., red/green) -- could I do it in this code? – Emman Jul 24 '20 at 08:37
  • 1
    Yes. You can change the appearance of the text (bold, color, size...) by adding the respetive properties of `geom_text`. For instance, for the green color add `color = "green"` to the first geom_text. – AndreasM Jul 24 '20 at 08:48
  • FYI, when I run this code on my environment, the texts are swapped so each labels is over the opposite pie slice. I flipped the `-` and `+` signs in both `nudge_x` and `nudge_y`, for each `geom_text`. Would you consider revising the code in your answer in case it indeed doesn't match the plot in your answer? – Emman Jul 24 '20 at 09:13
  • Ah, my mistake. Thanks! I realized I had switchted this when typing my answer, corrected it in my code to produce the figure, but forgot to update the code I had already copy/pasted here... It's now fixed. – AndreasM Jul 24 '20 at 10:05