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