Как настроить размер точки на масштаб графика в ggplot2?
давайте сгенерируем некоторые данные:
x <- -10*cos(seq(0, pi, length.out = 100))+1
y <- 10*seq(0, pi, length.out = 100)
xerr <- rep(2, 100)
yerr <- rep(2, 100)
dd <- as.data.frame(cbind(x, y, xerr, yerr))
вот у меня x
и y
координаты некоторых точек с их ошибками, xerr
и yerr
(для удобства я установил их постоянными). Я хотел бы представить эти ошибки с размером очков. Это легко выполнимо:
ggplot() +
geom_point(data = dd, aes(x, y, size = sqrt(xerr^2 + yerr^2)), colour = "gray") +
geom_path(data = dd, aes(x, y), colour = "red", size = .5) +
scale_size_identity() +
theme_bw()
однако размер этих точек определяется в масштабе, который не имеет никакого отношения к масштабу графика. Есть ли способ настроить измерении точек по отношению к масштабу участка? В приведенном выше примере радиус каждой точки должен иметь размер, равный 2.828 и не менее одного, как сейчас.
1 ответов
один из способов-явно нарисовать эллипсы с осями, определенными размером ошибок.
x <- -10*cos(seq(0, pi, length.out = 10))+1
y <- 10*seq(0, pi, length.out = 10)
xerr <- runif(10, 1, 5)
yerr <- runif(10, 1, 5)
dd <- as.data.frame(cbind(x, y, xerr, yerr))
dd$frame <- factor(seq(1:10))
для этой цели мы определяем нашу функцию для создания эллипсов:
ellipseFun <- function(center = c(0, 0), axes = c(1, 1), npoints = 101){
tt <- seq(0,2*pi, length.out = npoints)
xx <- center[1] + axes[1] * cos(tt)
yy <- center[2] + axes[2] * sin(tt)
return(data.frame(x = xx, y = yy))
}
затем мы генерируем матрицы для всех эллипсов:
ddEll <- data.frame()
for(k in levels(dd$frame)){
ddEll <- rbind(ddEll, cbind(as.data.frame(with(dd[dd$frame == k,], ellipseFun(center = c(x, y), axes = c(xerr, yerr), npoints = 101))),frame = k))
}
и, наконец, мы можем построить их:
library(ggplot2)
ggplot() +
geom_point(data = dd, aes(x, y)) +
geom_polygon(data=ddEll, aes(x = x, y = y, group = frame), colour = "gray", fill = "red", alpha = .2) +
scale_size_identity() +
theme_bw() +
xlim(c(-20, 20)) +
ylim(c(-5, 35)) +
coord_fixed()