如何在ggplot2中包围极坐标限制?

Jef*_*ard 9 r ggplot2 polar-coordinates

我有一个圆形空间,角度0和360是等价的.我想在这个空间中绘制矩形,使矩形可以穿过这个值.但是,我遇到了ggplot2的问题.

base <- ggplot() +
  scale_x_continuous(breaks = seq(45, 360, 45), limits = c(0, 360)) +
  scale_y_continuous(breaks = seq(0, 1, 0.2), limits = c(0, 1)) +
  coord_polar(theta = "x", start = 1.5 * pi, direction = -1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

1.尝试绘制超过xlim的值:

base + geom_rect(aes(xmin = 340, xmax = 380, ymin = 0.4, ymax = 0.6), 
  color = "darkblue", fill = "steelblue")
#> Warning message:
#> Removed 1 rows containing missing values (geom_rect). 
Run Code Online (Sandbox Code Playgroud)

xlim之外的所有值都被删除,因此这不起作用.

2.尝试使用重新调整的值进行绘图

base + geom_rect(aes(xmin = 340, xmax = 380 %% 360, ymin = 0.4, ymax = 0.6), 
  color = "darkblue", fill = "steelblue")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 这至少会产生一个情节,但与我想要的相反.而不是从340到380 CCW,这绘制340到20 CW.

3.尝试绘制两个连接元素

  base + geom_rect(aes(xmin = c(350, 0), xmax = c(360, 10), ymin = 0.4, ymax = 0.6), 
    color = "darkblue", fill = "steelblue")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这显示了我想要它的矩形,但由于角度为0/360的笔划线并且因为我现在必须将每个矩形表示为两个矩形,因此这不能令人满意.

4.尝试1使用缩放而不是剪裁

ggplot() +
  scale_x_continuous(breaks = seq(45, 360, 45)) +
  scale_y_continuous(breaks = seq(0, 1, 0.2), limits = c(0, 1)) +
  coord_cartesian(xlim = c(0, 360)) +
  coord_polar(theta = "x", start = 1.5 * pi, direction = -1) +
  geom_rect(aes(xmin = 340, xmax = 380, ymin = 0.4, ymax = 0.6), 
    color = "darkblue", fill = "steelblue")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 这似乎失去了缩放和限制.

5.尝试2使用缩放而不是剪裁

ggplot() +
  scale_x_continuous(breaks = seq(45, 360, 45)) +
  scale_y_continuous(breaks = seq(0, 1, 0.2), limits = c(0, 1)) +
  coord_polar(theta = "x", start = 1.5 * pi, direction = -1) +
  coord_cartesian(xlim = c(0, 360)) +
  geom_rect(aes(xmin = 340, xmax = 380, ymin = 0.4, ymax = 0.6), 
    color = "darkblue", fill = "steelblue")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 这样可以正确地完成缩放,但会覆盖极坐标系.

如果有人能为这个问题提供解决方案或想法,我将非常感激.再次,我正在寻找看起来像#3但没有内部笔划而不需要使用两个矩形的东西.

编辑:这个问题是相关的,也没有答案.

Cla*_*lke 1

底层坐标系是极坐标系很重要吗?geom_arc_bar()包中的ggforce行为如您所期望的那样,因此您可以使用它以任意角度绘制圆弧。但是你下面有一个笛卡尔坐标系,所以如果你需要的话,你可能必须自己绘制坐标线。

library(ggforce)
library(dplyr)

data_deg <- data.frame(xmin = 340,
                   xmax = 380,
                   ymin = 0.4,
                   ymax = 0.6)

offset = 90 # by how much are angles offset
dir = 1 # should we go counterclockwise (1) or clockwise (-1)

# convert angles from degrees into radians, apply offset and direction
data_rad <- mutate(data_deg,
               xmin = dir*2*pi*(xmin + offset)/360,
               xmax = dir*2*pi*(xmax + offset)/360)

ggplot(data_rad) + geom_arc_bar(aes(x0 = 0, y0 = 0, r0 = ymin, r = ymax,
                                start = xmin, end = xmax),
                            color = "darkblue", fill = "steelblue") +
  scale_x_continuous(limits = c(-1, 1)) +
  scale_y_continuous(limits = c(-1, 1)) +
  coord_fixed()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这并不能解决您链接到的其他问题,但一般来说,您可能会发现自己将坐标从极坐标转换为欧几里得坐标可以为您提供更大的灵活性,使绘图看起来像您想要的那样。