如何在ggplot2极坐标柱状图中添加圆形参考线且避免变形
问题描述
我尝试使用geom_polygon()在径向柱状图中添加圆形参考线(我知道这不是呈现该数据的最优方式,但该需求不由我完全决定)。参考相关方案,我可以生成符合预期的圆形:
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()

该效果符合要求,但问题是1和7在极坐标中处于同一径向位置,因此当我添加柱状图数据后,圆形参考线就出现了扁平化变形。
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()

请问有没有办法在该场景下让多边形保持圆形?或者可以在7和1之间插值以保留原始曲线效果?
由reprex包(v2.0.0)于2021-07-26创建
会话信息
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
解决方案
变形的核心原因是极坐标下rating=1和rating=7的位置重合,geom_polygon仅用7个点绘制多边形时,首尾连接处会呈现直线而非平滑圆弧。只需要为参考线数据集补充插值点,扩展x轴范围即可解决,修改后代码如下:
library(tidyverse) set.seed(123) # 为参考线数据集每个分组增加rating=8的插值点,使多边形闭合时形成圆弧 lines <- tibble( rating = rep(c(1:7, 8), times = 3), average = rep(1:3, each = 8) ) 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") + # x轴范围扩展到8,刻度仍保留1-7,不影响原有柱状图的显示逻辑 scale_x_continuous(breaks = 1:7, limits = c(1, 8)) + scale_y_continuous(limits = c(0, 3), breaks = 0:3) + coord_polar()
修改后参考线会保持完整圆形,不会出现扁平化变形。
内容的提问来源于stack exchange,提问作者Jake Thompson
相关产品推荐
相关产品推荐

