Jake Thompson
Jake Thompson

Reputation: 2843

Add circular reference line to polar bar chart in ggplot2

I’m attempting to add a circle using geom_polygon() to add a reference line to radial bar chart. (I know this is not the ideal way to present this data, but it’s not entirely up to me). Following this issue, I can create a nice circle:

library(tidyverse)

lines <- tibble(
  rating = rep(1:7, times = 3),
  average = rep(1:3, each = 7)
)

ggplot(lines, aes(x = rating, y = average)) +
  geom_polygon(aes(group = average), fill = NA, color = "black") + 
  scale_x_continuous(breaks = 1:7) +
  scale_y_continuous(limits = c(0, 3), breaks = 0:3) +
  coord_polar()

This is great. The problem is that 1 and 7 share the top spot. So when I add data for the bars, the circle flattens out.

set.seed(123)
bars <- tibble(rating = 1:7,
               average = runif(7, min = 0, max = 3))

ggplot(lines, aes(x = rating, y = average)) +
  geom_col(data = bars, aes(fill = factor(rating)), show.legend = FALSE) +
  geom_polygon(aes(group = average), fill = NA, color = "black") + 
  scale_x_continuous(breaks = 1:7) +
  scale_y_continuous(limits = c(0, 3), breaks = 0:3) +
  coord_polar()

Is there any way keep the polygon a circle in this situation? Or to interpolate between the 7 and 1 to keep the original curve?

Created on 2021-07-26 by the reprex package (v2.0.0)

Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.1.0 (2021-05-18)
#>  os       macOS Big Sur 10.16         
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       America/Chicago             
#>  date     2021-07-26                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date       lib source             
#>  assertthat    0.2.1   2019-03-21 [1] standard (@0.2.1)  
#>  backports     1.2.1   2020-12-09 [1] standard (@1.2.1)  
#>  broom         0.7.8   2021-06-24 [1] CRAN (R 4.1.0)     
#>  cellranger    1.1.0   2016-07-27 [1] standard (@1.1.0)  
#>  cli           3.0.1   2021-07-17 [1] CRAN (R 4.1.0)     
#>  colorspace    2.0-2   2021-06-24 [1] CRAN (R 4.1.0)     
#>  crayon        1.4.1   2021-02-08 [1] standard (@1.4.1)  
#>  curl          4.3.2   2021-06-23 [1] CRAN (R 4.1.0)     
#>  DBI           1.1.1   2021-01-15 [1] standard (@1.1.1)  
#>  dbplyr        2.1.1   2021-04-06 [1] standard (@2.1.1)  
#>  digest        0.6.27  2020-10-24 [1] standard (@0.6.27) 
#>  dplyr       * 1.0.7   2021-06-18 [1] CRAN (R 4.1.0)     
#>  ellipsis      0.3.2   2021-04-29 [1] standard (@0.3.2)  
#>  evaluate      0.14    2019-05-28 [1] standard (@0.14)   
#>  fansi         0.5.0   2021-05-25 [1] standard (@0.5.0)  
#>  farver        2.1.0   2021-02-28 [1] standard (@2.1.0)  
#>  forcats     * 0.5.1   2021-01-27 [1] standard (@0.5.1)  
#>  fs            1.5.0   2020-07-31 [1] standard (@1.5.0)  
#>  generics      0.1.0   2020-10-31 [1] standard (@0.1.0)  
#>  ggplot2     * 3.3.5   2021-06-25 [1] CRAN (R 4.1.0)     
#>  glue          1.4.2   2020-08-27 [1] standard (@1.4.2)  
#>  gtable        0.3.0   2019-03-25 [1] standard (@0.3.0)  
#>  haven         2.4.1   2021-04-23 [1] standard (@2.4.1)  
#>  highr         0.9     2021-04-16 [1] standard (@0.9)    
#>  hms           1.1.0   2021-05-17 [1] standard (@1.1.0)  
#>  htmltools     0.5.1.1 2021-01-22 [1] standard (@0.5.1.1)
#>  httr          1.4.2   2020-07-20 [1] standard (@1.4.2)  
#>  jsonlite      1.7.2   2020-12-09 [1] standard (@1.7.2)  
#>  knitr         1.33    2021-04-24 [1] standard (@1.33)   
#>  lifecycle     1.0.0   2021-02-15 [1] standard (@1.0.0)  
#>  lubridate     1.7.10  2021-02-26 [1] standard (@1.7.10) 
#>  magrittr      2.0.1   2020-11-17 [1] standard (@2.0.1)  
#>  mime          0.11    2021-06-23 [1] CRAN (R 4.1.0)     
#>  modelr        0.1.8   2020-05-19 [1] standard (@0.1.8)  
#>  munsell       0.5.0   2018-06-12 [1] standard (@0.5.0)  
#>  pillar        1.6.1   2021-05-16 [1] standard (@1.6.1)  
#>  pkgconfig     2.0.3   2019-09-22 [1] standard (@2.0.3)  
#>  purrr       * 0.3.4   2020-04-17 [1] standard (@0.3.4)  
#>  R6            2.5.0   2020-10-28 [1] standard (@2.5.0)  
#>  Rcpp          1.0.7   2021-07-07 [1] CRAN (R 4.1.0)     
#>  readr       * 2.0.0   2021-07-20 [1] CRAN (R 4.1.0)     
#>  readxl        1.3.1   2019-03-13 [1] standard (@1.3.1)  
#>  reprex        2.0.0   2021-04-02 [1] standard (@2.0.0)  
#>  rlang         0.4.11  2021-04-30 [1] standard (@0.4.11) 
#>  rmarkdown     2.9     2021-06-15 [1] CRAN (R 4.1.0)     
#>  rstudioapi    0.13    2020-11-12 [1] standard (@0.13)   
#>  rvest         1.0.1   2021-07-26 [1] CRAN (R 4.1.0)     
#>  scales        1.1.1   2020-05-11 [1] standard (@1.1.1)  
#>  sessioninfo   1.1.1   2018-11-05 [1] standard (@1.1.1)  
#>  stringi       1.7.3   2021-07-16 [1] CRAN (R 4.1.0)     
#>  stringr     * 1.4.0   2019-02-10 [1] standard (@1.4.0)  
#>  styler        1.5.1   2021-07-13 [1] CRAN (R 4.1.0)     
#>  tibble      * 3.1.3   2021-07-23 [1] CRAN (R 4.1.0)     
#>  tidyr       * 1.1.3   2021-03-03 [1] standard (@1.1.3)  
#>  tidyselect    1.1.1   2021-04-30 [1] standard (@1.1.1)  
#>  tidyverse   * 1.3.1   2021-04-15 [1] standard (@1.3.1)  
#>  tzdb          0.1.2   2021-07-20 [1] CRAN (R 4.1.0)     
#>  utf8          1.2.2   2021-07-24 [1] CRAN (R 4.1.0)     
#>  vctrs         0.3.8   2021-04-29 [1] standard (@0.3.8)  
#>  withr         2.4.2   2021-04-18 [1] standard (@2.4.2)  
#>  xfun          0.24    2021-06-15 [1] CRAN (R 4.1.0)     
#>  xml2          1.3.2   2020-04-23 [1] standard (@1.3.2)  
#>  yaml          2.2.1   2020-02-01 [1] standard (@2.2.1)  
#> 
#> [1] /Library/Frameworks/R.framework/Versions/4.1/Resources/library

Upvotes: 1

Views: 463

Answers (1)

stefan
stefan

Reputation: 124213

One option would be to make use of geom_hline instead of geom_polygon:

library(tidyverse)

set.seed(123)
lines <- tibble(
  rating = rep(1:7, times = 3),
  average = rep(1:3, each = 7)
)

bars <- tibble(rating = 1:7,
               average = runif(7, min = 0, max = 3))

ggplot(lines, aes(x = rating, y = average)) +
  geom_col(data = bars, aes(fill = factor(rating)), show.legend = FALSE) +
  geom_hline(aes(yintercept = average)) +
  scale_x_continuous(breaks = 1:7) +
  scale_y_continuous(limits = c(0, 3), breaks = 0:3) +
  coord_polar()

Upvotes: 2

Related Questions