如何绘制椭圆以可视化 AFL 场

How to plot an ellipse in to visualise an AFL field

我刚刚开始使用 R,因为我对做一些与运动相关的基本可视化很感兴趣,但我一直在尝试绘制一个代表 AFL 场地的椭圆。

我目前已经使用 ggplot2 绘制了场地内的所有地标和线标记,并且正在使用 plotrix 的 draw.ellipse() 来尝试覆盖场地周围的椭圆形边界线。我只有场的尺寸,我可以用它来找到椭圆的中心点和椭圆每条臂的半径。

xmin <- 0
xmax <- 17000
ymin <- 0
ymax <- 15000

但我更希望能够使用 ggplot2 绘制椭圆,因为我现在更熟悉该程序包。

library(plotrix)
library(ggplot2)

field <- ggplot() + xlim(c(-10,xmax+10)) + ylim(c(-10,ymax+10))

oval <- draw.ellipse(c((xmax/2),(ymax/2)),a = (xmax/2), b = (ymax/2))

我想将椭圆绘制到空白 canvas "field" 上,然后我可以覆盖我已经绘制的其他地标,但目前收到此错误消息:

1: In doTryCatch(return(expr), name, parentenv, handler) :
  invalid graphics state
2: In doTryCatch(return(expr), name, parentenv, handler) :
  invalid graphics state

创建我自己的椭圆函数并使用 geom_path() 绘制它会更简单吗?还是我没有足够的信息来绘制一个?

跟进

为了跟进,我绘制了所有适当的线条标记,例如

library(ggplot2)
library(ggforce)
xmin <- 0
xmax <- 17000
ymin <- 0
ymax <- 15000
fiftyarc_d <- 10000

circleFun <- function(centre=c(0,0),diameter=1,npoints=100){
  r = diameter/2
  tt <- seq(0,2*pi,length.out = npoints)
  xx <- centre[1] + r * cos(tt)
  yy <- centre[2] + r * sin(tt)
  return(data.frame(x = xx, y = yy))
}

field <- ggplot() + xlim(c(-10,xmax+10)) + ylim(c(-10,ymax+10))
oval  <- list(ggforce::geom_ellipse(aes(x0 = xmax/2, y0 = ymax/2, 
                                        a = 8000, b = 6000, angle = 0)))
fiftyarcleft <- circleFun(c(xmin,(ymax/2)),fiftyarc_d,npoints=100)

field + oval + geom_path(data=fiftyarcleft,aes(x=x,y=y))

我想要 "cut" 位于椭圆外侧的弧段,x 轴的两端各有一个。我试过使用

fiftyarcleft[which(fiftyarcleft$x >= oval)]

但是我收到一个错误,指出无法强制对象键入 'double'

我不确定你想要什么尺寸(听起来 AFL 尺寸有所不同,但这在 ggplotggforce::geom_ellipse 中应该是可行的,如下所示:

library(ggplot2)
library(ggforce)
xmin <- 0
xmax <- 17000
ymin <- 0
ymax <- 15000

field <- ggplot() + xlim(c(-10,xmax+10)) + ylim(c(-10,ymax+10))
oval  <- list(ggforce::geom_ellipse(aes(x0 = xmax/2, y0 = ymax/2, 
                                        a = 8000, b = 6000, angle = 0)))
field + oval