自动确定图例的位置

时间:2011-08-25 22:58:22

标签: r automation plot ggplot2 gnuplot

您可以在大多数绘图程序中手动定位关键图例。例如,在gnuplot中使用set key top right完成。在ggplot2中,它完成了like this

是否有绘图库,脚本或简单算法自动定位图例,使其与图中的数据最小重叠?

我的意思是:假设我绘制了行y=x。在这种情况下,传奇的好地方是左上角或右下角。

3 个答案:

答案 0 :(得分:6)

试试这个,

require(Hmisc)
?largest.empty

R-help档案中提出了其他讨论和功能

答案 1 :(得分:5)

require(plotrix)

?emptyspace     # Find the largest empty space on a plot

这是帮助页面中的示例:

x<-rnorm(100)
 y<-rnorm(100)
 plot(x,y,main="Find the empty space",xlab="X",ylab="Y")
 es<-plotrix::emptyspace(x,y)
 # use a transparent background so that any overplotted points are shown
 plotrix::boxed.labels(es,labels="Here is the\nempty space",bg="transparent")

答案 2 :(得分:0)

获取"topleft""topright""bottomleft""bottomright"中的一个的快速技巧:

auto.legend.pos <- function(x,y,xlim=range(x),ylim=range(y)) {
  countIt <- function(a,zero.only=TRUE) {
    tl <- sum(x <= xlim[1]*(1-a)+xlim[2]*a & y >= ylim[1]*a+ylim[2]*(1-a))
    tr <- sum(x >= xlim[1]*a+xlim[2]*(1-a) & y >= ylim[1]*a+ylim[2]*(1-a))
    bl <- sum(x <= xlim[1]*(1-a)+xlim[2]*a & y <= ylim[1]*(1-a)+ylim[2]*a)
    br <- sum(x >= xlim[1]*a+xlim[2]*(1-a) & y <= ylim[1]*(1-a)+ylim[2]*a)
    c(topleft=tl,topright=tr,bottomleft=bl,bottomright=br)
  }
  for (k in seq(0.5,0.1,by=-0.05)) {
    a <- countIt(k)
    if (sum(a==0)>0) break
  }
  names(a)[which(a==0)][1]
}

测试:

plot(Sepal.Length~Petal.Length, data=iris)
auto.legend.pos(iris$Petal.Length, iris$Sepal.Length)
# [1] "topleft"