如何减小x轴上两个离散值之间的间距?

3
首先,我希望不使用ggplot来完成这个任务。
以下是制作箱线图的脚本:
data <- data.frame(
  u    = c(0.522, 0.488, 0.474, 0.443, 0.510, 0.443, 0.420, 0.554, 0.333, 0.414,
           0.467, 0.606, 0.588),
  ub   = c(0.594, 0.568, 0.578, 0.523, 0.577, 0.501, 0.522, 0.623, 0.498, 0.511,
           0.544, 0.654, 0.639),
  nu   = c(0.646, 0.620, 0.644, 0.607, 0.667, 0.614, 0.631, 0.701, 0.586, 0.589,
           0.664, 0.739, 0.744),
  nub  = c(0.733, 0.701, 0.700, 0.698, 0.724, 0.701, 0.722, 0.777, 0.630, 0.663,
           0.703, 0.78, 0.787),
  wnub = c(0.815, 0.782, 0.757, 0.764, 0.792, 0.771, 0.838, 0.860, 0.700, 0.703,
           0.774, 0.837, 0.863))
boxplot(data, las=1, par(mar=c(7.5, 4.2, 0.25, 0.15)), axes=FALSE, xlab=NA,
        ylab=NA, boxwex=.4, outline=FALSE, ylim=c(0:1))
box()
labnames = c("Unigrams",
             "Unigrams\n& Bigrams",
             "Noun Unigrams",
             "Noun Unigrams\n& Noun Bigrams",
             "Noun Unigrams\n& Noun Bigrams\n(positional weights)")
axis(side=1, tck=-0.025, labels=FALSE)
axis(side=1, lwd=0, labels=FALSE, at=c(1:5), cex.axis=1)
text(seq(1, 5, by=1), par("usr")[3]-.2, labels=labnames, srt=-90,
     xpd=TRUE, adj=.25)
axis(side=2, tck=-0.02, labels=NA)
axis(side=2, lwd=0, cex.axis=1, las=1)
mtext(side=1, "Feature Sets", line=6.5, cex=1.5)
mtext(side=2, "F-Score", line=3, cex=1.5)

以下是产生的图形:

boxplot

我很烦恼这里浪费了太多的空白。我一直试图通过使用“asp”将离散的x轴值更紧密地靠在一起来减少空间,但它并没有改变任何东西。如何才能做到这一点,以减少盒子之间的巨大间隙?

此外,如果有其他减少此图片空白的方法,请分享您的想法。


1
这是一个有趣的方法...我没有想到过。不幸的是,我不能走这条路,因为我必须在latex文档中包含R图,而编译(我使用pdflatex)总是会导致jpg和png图像的质量损失。恐怕我必须坚持pdf输出。 - Chthonic Project
3个回答

8
选项1:如果您将图像保存为用于Latex的PDF文件,可以使用pdf(file=file, width=width, height=height)来设置宽度和高度。然后您可以完全忽略boxwex参数。 选项2:或者,您可以使用at参数告诉boxplot在X轴上应该放置箱线图的位置:
at.x <- seq(1,by=.5,length.out=5) # set here the X-axis positions
boxplot(data, par(mar=c(8.5, 4.2, 0.25, 0.15)), outline=FALSE,
        cex.lab=1.5, ylab="F-score", xlab=NA, las=3, names=labnames,
        boxwex=.4, ylim=c(0:1),
        at=at.x)
# display the X-axis name
mtext(side=1, "Feature Sets", line=7.2, cex=1.5)

请注意代码也被大大简化了。你可以进一步通过调整boxplotxlim参数来减少图像内部的边距。例如尝试使用xlim=c(0.8,3.2)。结果如下:

enter image description here

选项 3:如果您真的想节省空间,可以使用颜色和图例:
cols <- c("white","red","yellow","green","blue")
boxplot(data, par(mar=c(0.2, 3.2, 0.25, 0.15)), outline=FALSE,
        axes=F, ylab=NA, xlab=NA, names=NA, col=cols)
box()
axis(2)
mtext(side=2,"F-score",line=2.2)
legend("bottomright", cex=.8, fill=cols,
       c("Unigrams", "Unigrams & Bigrams", "Noun Unigrams",
         "Noun Unigrams & Noun Bigrams",
         "Noun Unigrams & Noun Bigrams (positional weights)"))

最后,为什么将Y轴的限制设置为0和1?这样浪费了很多空间。另外,为什么要移除异常值?作为一名信息检索研究人员,只是好奇问问:-)

ggplot2 有没有类似选项 2 的东西? - NickJ

2

首先需要说明的两件事情:

  • boxwex=0.4 是水平缩小箱线图。

  • ylim=c(0,1)是在垂直方向上打开空间(我认为垂直空白本质上不是问题)。

boxwex 水平空白的量是成比例的,所以无论你创建一个640像素或6400像素宽的图像,boxwex 仍然给出了40%的水平覆盖率(80%是默认值)。不管怎样, boxplot 将扩展到整个图形的宽度。

@AndreSilva 开始使用一种技术。使用 jpeg()(和 png()pdf()svg()),您可以指定捕获图像的尺寸。对于 jpegpngwidthheight 的单位为像素;我发现默认分辨率为72 dpi有点粗糙,因此请注意您可以更改 res。请注意,这也会影响字体的适合度,而不仅仅是使线条显得不太平滑。(顺便说一下:我通常建议除非您包含高数量的颜色和/或叠加实际图像,否则不要使用 jpeg(),但您的情况可能有所不同。)

除非您真正需要设置特定的纵横比,否则在我的经验中,使用 asp 只是给您一个关于宽度和高度之间使用的比率的概念。但是,即使在 R-studio 中,您也可以更改图表的外观尺寸,以更好地了解渲染/捕获的图像的外观。

如果您真的想更有效地利用空间,可以将 x 轴标签靠近箱线图。您可以(如此处所示)将它们排成一行(我首选),也可以选择(使用我下面注释的行)将每个文本放在其各自的框下面。

par(mar=c(3,4.5,0,0)+0.1)
bp <- boxplot(data, names=NA, ylim=c(0,1), axes=FALSE,
              outline=FALSE, cex.lab=1.5, col='#55ff55')
axis(2, las=1)
#text(1:5, bp$stats[1,] - 0.05, labnames, srt=-90, xpd=TRUE, adj=c(0,0.5))
text(1:5, rep(0.3,5), labnames, srt=-90, xpd=TRUE, adj=c(0,0.5))
mtext('Feature Sets', side=1, line=2, at=0.5, adj=0, cex=1.5)
mtext('F-Score', side=2, line=2.5, at=0, adj=0, cex=1.5)
savePlot(file='Rplot.png', type='png', res=150)

目前为止,许多微调点都是个人偏好和Tufte的建议一样重要。(我认为还可以在boxplot函数中添加col参数为盒图中的方框添加颜色,以使它们从白色背景中脱颖而出。)

Rplot, 625x357


1

现在设置boxwex=.4参数可以增加盒子之间的间距。将其设置为boxwex=.8将使箱型图变宽并减少空白处。

或者,如果您希望将空白区域“移动”到图的边缘而不是盒子之间,您可以显式地设置xlim=参数。默认情况下,由于您有5个组,它们分别在1,2,3,4,5处绘制,默认值为xlim=c(.5,5.5)。您可以设置xlim=c(0,6)或xlim=c(-1,7),这将绘制更宽的数据范围,但数据将更靠近中心。如果您这样做,还想注释掉axis(side=1, lwd=0, labels=FALSE, at=c(1:5), cex.axis=1),因为它可能会绘制额外的刻度线(我也不确定它最初为什么出现)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接