Как построить эллипс для визуализации поля AFL - PullRequest
0 голосов
/ 02 июня 2019

Я только начинаю играть с 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))

Я хочу нанести эллипс на пустое «поле» холста, после чего я могу наложить другие ориентиры, которые я уже нанес, но в настоящее время получаю это сообщение об ошибке:

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

Было бы проще создать мою собственную функцию эллипса и построить ее с помощью geom_path ()?Или у меня недостаточно информации для построения графика?

Follow Up

Чтобы продолжить, у меня нанесены все соответствующие маркировки линий, например

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))

Я хочу «отрезать» сегмент дуги, который находится вне эллипса, по одному на каждом конце оси X.Я попытался использовать

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

, однако я получаю сообщение об ошибке, что объект не может быть приведен к типу 'double'

1 Ответ

0 голосов
/ 03 июня 2019

Я не уверен, для каких размеров вы собираетесь (и это звучит так, как будто размеры AFL различаются, но это должно быть выполнимо в ggplot и ggforce::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

enter image description here

...