如何用负r在极坐标中绘制点?

Dam*_*mbo 9 r ggplot2

我正在尝试在极坐标(r,theta)中绘制两个点,其中r是距中心的距离,theta是角度。

当前的解决方案不起作用,因为我没有轴的唯一“原点”。使用时coord_plane,y的原点是圆的中心,但是x的原点似乎是每个半径的中心。

我正在尝试做的是在以下示例中的两个点相对于原点对称的系统中进行绘制。

library(ggplot2)
ggplot(data.frame(r = c(-100, 100) , theta = c(1, 1)),
       aes(x = r, y= theta)) +
  geom_text(aes(label = paste(round(r, 1),',', round(theta, 1)))) +
  coord_polar(theta = 'y',
              direction = -1,
              start = -pi/2) +
  scale_y_continuous(limits = c(0, 2*pi),
                     breaks = c(0, pi/2, pi, 3*pi/2 ),
                     labels = c('0', 'pi/2', 'pi', '3/2pi'))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

更新:

尽管coord_polar创建的系统可能不是“直的”极坐标系统,但这是图形语法的引言,部分引用了部分行为coord_polar,并解释了为什么我必须解决以下限制y

我们可以将极坐标视为该系统中所有其他比例尺处理方式的例外。也就是说,我们可以将角度值绝对解释为弧度。如果我们所有的图形都是涉及弧度的数学或工程应用,这将是有道理的。但是,我们选择不这样做,以便在进行坐标转换时可以隐藏缩放细节。例如,这使用极坐标表示年时间变得容易。因此,在极坐标转换中,我们将最小弧度值的0弧度以数据单位(度,弧度,比例等)对齐,将2S弧度的最大值对齐。循环参数,以及比例函数中的最小和最大参数,使我们可以根据需要创建旋转不止一圈的极坐标图。

Eli*_*lli 7

我不完全了解您的最终目标是什么,但是可能的问题是,如果您要r表示到原点的距离,那么它不可能是负数。ggplot2使用coord_polar()所做的只是使整个笛卡尔平面遵循极坐标变形。这导致“零”实际上是“径向”坐标的下限。如果您手动更改其限制,则可以清楚地看到它:

library(ggplot2)
ggplot(data.frame(r = c(-100, 100) , theta = c(1, 1)),
       aes(x = r, y= theta)) +
  geom_text(aes(label = paste(round(r, 1),',', round(theta, 1)))) +
  coord_polar(theta = 'y',
              direction = -1,
              start = -pi/2) +
  scale_y_continuous(limits = c(0, 2*pi),
                     breaks = c(0, pi/2, pi, 3*pi/2 ),
                     labels = c('0', 'pi/2', 'pi', '3/2pi')) +
  scale_x_continuous(limits = c(-200, NA))
Run Code Online (Sandbox Code Playgroud)

我不知道您所说的“关于原点对称”是什么意思,但是可以吗?

library(ggplot2)
ggplot(data.frame(r = c(100, 100) , theta = c(1, 1 + pi)),
       aes(x = r, y= theta)) +
  geom_text(aes(label = paste(round(r, 1),',', round(theta, 1)))) +
  coord_polar(theta = 'y',
              direction = -1,
              start = -pi/2) +
  scale_y_continuous(limits = c(0, 2*pi),
                     breaks = c(0, pi/2, pi, 3*pi/2 ),
                     labels = c('0', 'pi/2', 'pi', '3/2pi')) +
  scale_x_continuous(limits = c(0, NA))
Run Code Online (Sandbox Code Playgroud)

reprex软件包(v0.3.0)创建于2019-07-16


Jon*_*ing 6

将Elio Campitelli的答案改编为函数,可以使用以下方法:

plot_polar_signed <- function(r, theta) {
  data2 <- data.frame(r2 = abs(r),
             theta2 = theta + ifelse(r < 0, pi, 0))
  ggplot(data2, aes(x = r2, y = theta2)) +
    geom_text(aes(label = paste(round(r, 1),',', round(theta, 1)))) +
    coord_polar(theta = 'y',
                direction = -1,
                start = -pi/2) +
    scale_y_continuous(limits = c(0, 2*pi),
                       breaks = c(0, pi/2, pi, 3*pi/2 ),
                       labels = c('0', 'pi/2', 'pi', '3/2pi'))

}

plot_polar_signed(r = c(-100, 100), theta = c(1, 1))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明