geom_point 在 geom_polar 饼图(甜甜圈)图表的开头引入偏移

geom_point introducing shift in start of geom_polar pie (doughnut) chart

在使用 ggplot2 创建饼图时,我无意中发现了极坐标图开头的奇怪行为。如果我们取

dta <- data.frame(val = 1:60, col = rep(c(0,1), each = 10))

并使用

制作饼图
library(ggplot2)
ggplot(dta, aes(x = val, y = 2, fill = factor(col), color = factor(col))) + 
  geom_col() + 
  coord_polar(start = 0)

我们最终得到了预期的饼图:

说,我们想在图表中间创建一个小甜甜圈洞,我们可以通过在中间添加一个点来实现:

ggplot(dta, aes(x = val, y = 2, fill = factor(col), color = factor(col))) + 
  geom_col() + 
  coord_polar(start = 0) + 
  geom_point(aes(0,0), size = 30, color = "lightgrey", show.legend = FALSE) 

然而,这一点引入了饼图开始的奇怪偏移,导致顶部出现一个小的灰色区域。

为什么会造成这种转变?如何避免?顺便提一句。这种转变也被其他 geom 引入,如 geom_vline(xintercept = 0)

班次看起来像是从 ?scale_x_continuous() 开始的。它的 expand 参数说,"The defaults are c(0.05, 0) for continuous variables, and c(0, 0.6) for discrete variables.".

所以如果你想消除这个差距,你可以在 aes() 之外定义你的 geom_point() 层以防止 scale_x_continuous 参与其中:

ggplot(dta, aes(x = val, y = 2, fill = factor(col), color = factor(col))) + 
    geom_col() + 
    coord_polar(start = 0) +
    geom_point(x = 0, y = 0, size = 30, color = "lightgrey", show.legend = FALSE)

或调整传递给 expand 参数的值:

ggplot(dta, aes(x = val, y = 2, fill = factor(col), color = factor(col))) + 
    geom_col() + 
    coord_polar(start = 0) + 
    geom_point(aes(0,0), size = 15, color = "lightgrey", show.legend = FALSE) +
    scale_x_continuous(expand = c(0,-.25))

我不确定为什么 c(0,0) 没有产生所需的输出...

对于 geom_vline() 情况(再次不确定为什么会这样,coord_polar() 是个挑剔的家伙)我们可以将 geom_vline(xintercept = .5) 添加到上述任一策略中,并获得适当放置的垂直行:

ggplot(dta, aes(x = val, y = 2, fill = factor(col), color = factor(col))) + 
    geom_col() + 
    coord_polar(start = 0) +
    geom_point(x = 0, y = 0, size = 30, color = "lightgrey", show.legend = FALSE) +
    geom_vline(xintercept = .5)

我认为第一种策略更好,因为第二种策略似乎是将颜色边界(和 vline)从 "true" 垂直方向稍微倾斜。在小预览的第一遍中没有看到 window..