geom_point控制半径完全而不是缩放它

时间:2014-05-28 09:45:47

标签: r ggplot2

我的数据包含一组带半径的圆圈。 x,y和radius的比例相同。

x    y    radius
0.1  0.8  0.1
0.4  0.4  0.2
0.6  0.2  0.9
0.3  0.6  0.5
0.5  0.5  0.2
...
0.9  0.1  0.1

当我使用时:

myplot <- ggplot() + geom_point(data=df, aes(x=x, y=y, size=(2*radius)))

得到的图是一个气泡图,其大小按比例缩放到半径。我想要一个气泡图,其中radius of bubble = radius(即气泡的半径是原始单位)。

我如何实现这一点(在ggplot2中)?

2 个答案:

答案 0 :(得分:6)

事实证明,似乎没有一种简单的方法可以做到这一点。

我查看了由baptiste链接的邮件列表条目(用于单个圆圈),并使用for循环扩展,逐个绘制每个圆圈。

df = data.frame(x=c(0.1,0.4,0.6, 0.3, 0.5,0.9), y=c(0.8,0.4,0.2,0.6,0.5,0.1), r=c(0.1,0.2,0.2,0.1,0.2,0.1))

angle <- seq(-pi, pi, length = 50)

myplot = ggplot()
for (i in 1:length(df$x)) {
        df_temp = data.frame(x = df$x[i] + df$r[i]*sin(angle), y = df$y[i] + df$r[i]*cos(angle))
        myplot = myplot + geom_polygon(data=df_temp, aes(x=x, y=y), inherit.aes=F)
      }
myplot = myplot + geom_point(data=df, aes(x=x, y=y))

这给出了:

enter image description here

示例数据集略有变化,使图中的内容更清晰。我还在这里绘制了圆心的坐标。

编辑:建议改进,只绘制一个多边形图层。

circularise <- function(d, n=360){
  angle <- seq(-pi, pi, length = n)
  make_circle <- function(x,y,r,id){
    data.frame(x=x+r*cos(angle), y=y+r*sin(angle), id)
  }
  lmat <- mapply(make_circle, id = seq_len(nrow(d)), 
                x = d[,1], y=d[,2], r=d[,3], SIMPLIFY = FALSE)
  do.call(rbind, lmat)
}

circles <- circularise(df)

p = ggplot() + 
  geom_point(data=df, aes(x=x, y=y))

p + geom_polygon(aes(x,y,group=id, fill=id), data=circles) +
    coord_fixed()

答案 1 :(得分:3)

如果您希望radius相对于xy变量的比例,则可以使用scale_size_continuous参数并设置比例范围。一个例子:

# reading some example data
df <- read.table(header=TRUE, text="x    y    radius
0.1  0.8  0.1
0.4  0.4  0.2
0.6  0.2  0.9
0.3  0.6  0.5
0.5  0.5  0.2
0.9  0.1  0.1")

# creating the plot
ggplot(data=df) + 
  geom_point(aes(x=x, y=y, size=radius*2), shape=20, alpha=0.4, show_guide=FALSE) +
  scale_size_continuous(range = c(10, 500)) +
  theme_bw()

给出: enter image description here

通过改变range = c(10, 500)中的值,您可以将其更改为您想要的值。第一个值是最小点的大小,第二个值是最大点的大小。