2013-10-16 112 views
6

让我们产生了一些数据:如何将点大小调整为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)) 

这里我有一些点xy坐标与他们的错误,xerryerr(为方便起见,我已经将它们设置不变)。我想用点的大小来表示这些错误。这是很容易可行:

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

enter image description here

然而,这些点的大小上没有的情节规模任何关系的规模确定。有没有办法根据图的比例调整点的尺寸?在上面的例子中,每个点的半径应该等于2.828,并且不小于现在的一个。

+0

R图中点的“大小”通常设置为与不由x或y比例中的任何一个确定的默认大小的比率。在这种情况下,你是否真的希望点的跨度为2.8单位(半径或直径?)?如果是这样,则将该大小参数乘以足以近似所需扩展的量,可能为10倍。 –

+0

您可以使用[scale_size](http://docs.ggplot2.org/current/scale_size.html)来设置任何符号相对于您建立的某个比例的大小(通常是df中的连续变量或分类变量)。如果您正在讨论像素精度和缩放到图表的实际输出大小,那就更棘手了。 :( –

+0

@DWin这只是一个例子,我的数据中的错误低于这个值 – VLC

回答

6

一种方法是使用由错误大小定义的轴明确绘制椭圆。

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

enter image description here

+0

这是一个绝对的宝石!对于使用这个的人来说,一定要延长'y lim()'和'xlim()'通过错误省略号,否则你会得到一些没有完全绘制的多边形。 – James