[英]How to draw a point in polar coordinates with negative r?
我試圖在極坐標(r,theta)中繪制兩個點,其中r是距離中心的距離,θ是角度。
當前的解決方案不起作用,因為我沒有軸的唯一“原點”。 使用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'))
更新:
雖然coord_polar
創建的系統可能不是一個“直的”極坐標系統,但這里引用的是圖形語法,部分解釋了coord_polar
的行為,以及我必須修正y
的極限的原因:
我們可以將極坐標視為該系統中處理所有其他尺度的例外。 也就是說,我們可以將角度值解釋為弧度。 如果我們所有的圖形都是涉及弧度的數學或工程應用,這將是有意義的。 但是,我們選擇不這樣做,這樣我們就可以在進行坐標轉換時隱藏縮放細節。 例如,這使得在極坐標中表示年度時間變得容易。 因此,在極坐標轉換中,我們將0弧度與數據單位(度,弧度,比例等)中的最小刻度值和最大值的2S弧度對齊。 循環參數以及縮放功能中的最小和最大參數允許我們根據需要創建具有多個旋轉的極坐標圖。
我不完全明白你的最終目標是什么,但也許問題是,如果你想要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))
我不確切地知道你對“原點對稱”的意思,但是這樣可以嗎?
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))
由reprex包創建於2019-07-16(v0.3.0)
將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))
r < 0
點未在極坐標中定義,因為r
是距中心的距離。 否則,即使迫使theta處於(0, 2pi)
,每個點也會有2組坐標,其中r != 0
。
所以你真的試圖在一個擴展的極坐標系中繪制,其中允許負r
並且(r, theta)
和(-r, theta + pi)
是相同的點。
我建議使用從您的系統到規范極坐標的映射。
canonical <- function(r, theta) {
if (r >= 0) {
c(r = r, theta = theta %% (2*pi))
} else {
c(r = -r, theta = (theta + pi) %% (2*pi))
}
}
或更短和矢量化:
canonical <- function(r, theta) {
list(r = abs(r),
theta = (theta + ifelse(r < 0, pi, 0)) %% (2 * pi))
}
這使得有效的極坐標保持不變(除非將θ (0, 2pi)
帶入(0, 2pi)
如果尚未),並將r < 0
點轉換為有效的極坐標。
canonical(1, 0)
# untouched
canonical(-1, 0)
# becomes (1, pi)
優點是您可以在轉換后使用ggplot
所有標准極性函數。
library(ggplot2)
df <- data.frame(r = c(-100, -50, 0, 50, 100) , theta = rep(1, 5))
df_polar <- as.data.frame(canonical(df$r, df$theta))
ggplot(df_polar,
aes(x = r, y = theta)) +
geom_text(aes(label = paste(round(r, 1),',', round(theta, 1)))) +
coord_polar(theta = 'y') +
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'))
同樣的另一種選擇是從極坐標轉換為笛卡爾坐標,以便於繪制直線。 映射是x = r*cos(theta)
和y=r*sin(theta)
並且有趣的是,對於負r也是有效的,因為cos(theta+pi) = -cos(theta)
和sin
相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.