设置边距以迎合大型传奇

时间:2014-05-13 09:58:19

标签: r plot legend legend-properties

在设置绘图的边距之前,我正试图找出一种计算图表图例高度的方法。我打算将图例放在x轴标签和标题下面的图下方。

因为它是绘制一系列事物的函数的一部分,所以图例可以增大和缩小以适应2个项目,最多15个或更多,所以我需要弄清楚我如何能够动态地做到这一点而不是硬编码。所以,最后我需要动态设置边距和其他一些零碎。

关键的挑战是在绘制绘图之前计算出要传递到par(mar)的图例的高度,但是在解剖了图例的基本代码之后,似乎无法得到高度的可靠估计除非情节实际绘制(鸡和蛋有人吗?)

以下是我已经尝试过的内容:

  1. 使用基础图例函数的legend$rect$h输出获得高度(除非实际绘制了图表,否则它似乎会给出一个不正确的高度值)

  2. 计算图例中的行数(简单)并将其乘以行高(为了做到这一点,似乎你需要翻译成英寸(基本图例代码使用yinch和我'我们也试过grconvertY,但除非绘制了一个情节,否则这些都不起作用。

  3. 另一个挑战是找出正确的y值来放置图例 - 我想,一旦我解决了第一个挑战,第二个就很容易了。

    修改

    经过一天的冒汗,这是怎么回事()。我有几个见解和几个问题。为了清楚起见,这是我的功能基本上做的:

    步骤1)设置边距

    步骤2)在左轴上创建条形图

    步骤3)重新设置usr坐标 - 这是确保右轴对齐所必需的,否则它将与x轴刻度相对应。当它们明显不同时不好。

    步骤4)创建右轴

    步骤5)在右轴上创建一系列折线图

    步骤6)对两个轴和x轴进行一些标记

    步骤7)添加图例

    以下是问题

    Q1)报道的内容是什么?我对边缘线和坐标(用户坐标)感兴趣,英寸是自我解释的。 - 我可以使用grconvertY()做一些转换,但我不确定我在看什么以及我应该转换到什么 - 文档不是那么好。

    Q2)我需要在步骤1中设置边距,以便图表底部有足够的空间用于图例。我认为我做对了,但是我需要在设置右轴和折线图后设置图例,这意味着用户坐标(和一英寸的像素值已经改变。因为上面的Q1我'我不确定如何将一个系统翻译成另一个系统。这方面的任何想法都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

经过另一天的汗水之后,这对我来说主要解决了这个问题。

我拆开了核心图例功能的代码并编译了这个:

#calculate legend buffer
cin <- par("cin")
Cex <- par("cex")
yc <- Cex * cin[2L] #cin(inches) * maginfication
yextra <- 0
ymax <- yc * max(1, strheight("Example", units = "inches", cex = Cex)/yc)
ychar <- yextra + ymax #coordinates
legendHeight <- (legendLines * ychar) + yc # in

这实际上模仿核心函数计算图例高度的方式,但以英寸而不是用户坐标返回高度。 legendLines是图例中的行数。

之后,了解如何放置图例并正确设置下边距是一件轻而易举的事。我正在使用:

#calculate inches per margin line
inchesPerMarLine<-par("mai")[1]/par("mar")[1]

计算每个边距线的英寸数,以及以下设置缓冲区(用于轴标签和标题,以及图表的底部)以及绘图的边距。

#set buffers
bottomBuffer = 1
buffer=2

#calculate legend buffer
legBuffer <- legendHeight/inchesPerMarLine

#start the new plot
plot.new()

# set margin
bottomMargin <- buffer + legBuffer + bottomBuffer
par(mar=c(bottomMargin,8,3,5))

情节

barplot(data, width=1, col=barCol, names.arg=names,  ylab="", las=1 ,axes=F, ylim=c(0,maxL), axis.lty=1)

然后放置传说。我使用了一种不同的方法来提取图例宽度,当存在1点的图例时,它确实存在一些挑战,但是,它现在可以正常工作了。将图例放入变量可让您像l$rect$w一样访问框的宽度。 trace=TRUEplot=FALSE阻止了正在写入情节的传奇。

ycoord <- -1*(yinch(inchesPerMarLine*buffer)*1.8)
l<-legend(x=par("usr")[1], y=ycoord, inset=c(0,-0.25), legendText, fill=legendColour, horiz=FALSE, bty = "n", ncol=3, trace=TRUE,plot=FALSE)
lx <- mean(par("usr")[1:2]-(l$rect$w/2))
legend(x=lx, y=ycoord, legendText, fill=legendColour, horiz=FALSE, bty = "n", ncol=3)

为了完整性,这是我计算图例中的行数的方法。注意 - 图例中的列数为3. labelSeries是图例标签的列表。

legendLines <- ceiling(nrow(labelSeries)/3)