Есть ли функция R для рисования сплошного круга с радиусом в пользовательских координатах - PullRequest
0 голосов
/ 24 июня 2019

Можно ли нарисовать настоящий сплошной круг с радиусом в «пользовательских» координатах?

Я попробовал следующее:

Полигоны: Я не хочу использовать их, потому что мне нужны настоящие круги в полученном svg.

Сегменты

segments(x, y, x, y, lwd=px, lend=0)

С сегментами есть проблема в том, что я не нахожу способ указать сегмент в «пользовательских» координатах.

Полученный график в конце экспортируется в PDF.

Обновление Я рисую график с большим количеством элементов, и элементы имеют различную ширину. Ширина элементов зависит от ширины на оси х. Если я не использую пользовательские координаты, результат в PDF неверен в зависимости от оси X.

Полигон - это приближение к окружности, и если я использую их, например, результат. PDF очень большой, производительность не очень хорошая, а использование памяти очень высокое. Я рисую 10000 кругов и больше на одном графике.

Я использую следующий код с описанными проблемами производительности:

circle <- function(x, y, r, col) {
  edgeCount <- 50
  intervals <- (1:edgeCount) / edgeCount * 2 * pi
  for(i in 1:length(x)) {
    polygon(r[i]*sin(intervals) + x[i], r[i]*cos(intervals) + y[i], col=col[i],border=NA)
  }
}

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Если вам удобно использовать оболочку для sp SpatialLine объекта, вы можете попробовать пакет oceanmap, который имеет довольно полезную функцию под названием SpatialCircle().По сути, он строит круг с помощью seq() и корректирует его для координат вашей центральной точки x и y и для вашего радиуса r.Это все еще набор линейных сегментов (поэтому не одна изогнутая линия ), но довольно простой в использовании.

Результат:

1

Код:

Довольно просто:

# Load libraries.
library(oceanmap)

# Generate plot window and data.
set.seed(1702)
plot.new()
plot.window(xlim = c(0, 20), ylim = c(0, 10), 
            asp = 1, xaxs = "i",  yaxs = "i")
axis(1)
axis(2)
box()


n <- 1000
x <- runif(n, 0, 20)
y <- runif(n, 0, 10)

for (i in 1:n) { 

    circle <- SpatialCircle(x = x[i], y = y[i], r = 0.1, n = 1000)
    lines(circle)

}

Это также работает с ggplot2 с некоторыми обработками данных.


Добавление: Precision of SpatialCircles

Если вы хотите проверить, что на самом деле означает n (точность) в функции SpatialCircle(), попробуйте следующее:

nrow(circle@lines[[1]]@Lines[[1]]@coords)
Результат:
[1] 1000

Это означает, что объект имеет 1000 координатных пар (x и y), через которые можно провести линию.Кроме того, эта линия будет иметь 999 различных отрезков, так как первая и последняя пары координат всегда идентичны.Пруф:

all.equal(circle@lines[[1]]@Lines[[1]]@coords[1, ],
          circle@lines[[1]]@Lines[[1]]@coords[1000, ])
Результат:
[1] TRUE
0 голосов
/ 25 июня 2019

Если я сам нашел решение с помощью Gregor2, которое привело меня к «сетке» библиотеки.

library(grid)
#draw frame using normal plot
plot(0, 0, cex=0)

margins <- par("mar")

#1: bottom 2:left 3:top 4:right
mb <- unit(margins[1], "lines")
ml <- unit(margins[2], "lines")

mt <- unit(margins[3], "lines")
mr <- unit(margins[4], "lines")

#create viewport equivalent to margins in par
pushViewport(viewport(x = ml, y = mb, width = unit(1, "npc") - ml - mr, height = unit(1, "npc") - mb - mt, just=c("left", "bottom"), clip=TRUE))

#draw circle in npc units (easily convertable to user units using grconvertX)
grid.draw(circleGrob(x=0.5, y=0.5, r=0.5, default.units="npc", gp=gpar(col="blue", fill="blue")))

popViewport()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...