我有一个带有水平图例的图:
legend("bottomleft", inset = c(0, -0.3), bty = "n",
x.intersp=0, xjust=0,yjust=0,
legend=c("AAPL", "Information Technology",
"Technology Hardware and Equipment", "S&P 500"),
col=c("black", "red", "blue3", "olivedrab3"),
lwd=2, cex = 0.5, xpd = TRUE, ncol = 4)
问题是,图例的第一项"AAPL"和第二项"信息技术"之间存在巨大的间隔。
我试着用txt.width()
来调整间距,但是根本不起作用。或者我没有按照指示使用这个选项。下面是我在legend()
中引入txt.width
选项的方法:
txt.width = c(2,1,1)
我不知道是否有必要提及,但我的x轴是一个日期轴!
有没有一种简单的方法可以自定义图例中文本之间的空格?
谢谢!
7条答案
按热度按时间2jcobegt1#
text.width
可以给予您控制图例中每列的宽度,但这并不简单。text.width
是一个向量,它将乘以另一个向量,该向量的长度与图例字符串向量的长度相同。第二个向量的元素是从0
到length(legend)-1
的整数。有关详细信息,请参阅code tolegend()
。重要的是,您可以将text.width
与第二个向量的乘积近似地看作图例元素的x坐标,然后,如果您知道需要哪个x坐标,就可以计算需要在text.width
参数中传递什么。然后你的最终代码可能看起来像这样(除了我们不知道你的原始绘图数据或参数):
正如Andre Silva所提到的,
xcoords
和textwidths
中所需的值取决于绘图的当前大小、为x轴指定的值的范围等。此外,如果每列有多个元素,则上面的
secondvector
看起来会有所不同。例如,对于各有两个图例元素的两列,secondvector == c(0,0,1,1)
。tf7tbtn22#
我使用
text.width
和四个参数来设置图例中字符串之间的间距,第二个参数在text.width中设置了“AAPL”和“Information technology”之间的距离,第三和第四个参数也是如此。不幸的是,每次更改绘图大小时,我都需要重置
text.width
内部的值。jobtbby33#
在我的系统(平台:x86_64-w 64-明w32,R版本:3.4.1(2017-06-30))Andre Silva和pangja目前提供的解决方案并不令人满意,这两种解决方案都需要用户输入,并且依赖于设备大小,由于我从来不习惯
text.width
命令,总是要通过试错来调整值,我编写了函数(f.horlegend
)。该函数与函数legend
具有相似的参数,并且基于here发布的思想。该函数创建一个水平(一行)图例,可通过函数
legend
中已知的命令(例如"bottomleft"
)定位参数
pos
图例的位置(c(“左下”、“下”、“右下”、“左”、“中”、“右”、“上”、“上”))legend
图例文本xoff
在x方向上的位置调整。注:图例绘制在极限= c(0,1)的图上yoff
与xoff相同,但在y方向lty
线型。线型只能指定为整数(0=空白,1=实线(默认值),2=虚线,3=点线,4=点划线,5=长划线,6=双划线)lwd
线宽,正数,默认为1ln.col
线条颜色seg.len
线的长度,默认为0.04pch
指定符号的整数。pt.col
符号颜色。pt.bg
符号的背景颜色。pt.cex
符号的扩展因子pt.lwd
符号的线宽text.cex
文本的扩展因子text.col
文本颜色text.font
文本字体text.vfont
参见文本帮助中的vfontbty
在图例周围绘制的框的类型。允许的值为“o”(默认值)和“n”bbord
图例框边框的颜色bbg
背景色blty
边框样式blwd
边框线宽度bdens
线密度,参见线段帮助bbx.adj
增加文本和水平框线之间间距的相对值bby.adj
与bbx.adj相同,但用于垂直boc线很遗憾,我现在没有时间创建一个软件包。但是请随意使用这个功能。欢迎任何改进功能的意见和想法。
部分示例
rmbxnbpk4#
对于我的情况,有5个图例在水平的方式。我必须自定义每个图例之间的间距。以下是为此目的的代码片段。
正是
text.width
函数发挥了神奇的作用8tntrjer5#
如果7年后有人遇到同样的问题,我发现一个有用的技巧是通过调用每段图例文本的字符串宽度(strwidth)来设置text.width。这会产生(在我看来)看起来“自然”的间距,并且可以通过向strwidth参数添加空格来修改。对于提出的问题,它看起来如下所示:
这基本上就是Andre所建议的,但是比手动通过数字定义文本宽度参数更加用户友好。
kqqjbcuj6#
基于pangia的解和
strwidth
的帮助,可以从图例文本计算x坐标:4ioopgfo7#
在
legend()
中设置textwidth = NA
将生成strwidth的适当的列方向最大值(图例))。
(引用自R手册中的
legend()
。)在处理类似情况时帮了我的忙。