首先,我想在没有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)
产生下图:
我对这浪费的空白数量感到恼火。我一直试图减少空间的一种方法是通过使用“asp”将离散的x轴值更接近,但它不会改变任何东西。我怎么能这样做,以减少盒子之间的巨大差距?
此外,如果还有其他方法可以减少此图片中的空白,请分享您的想法。
答案 0 :(得分:4)
选项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)
看到代码也大大简化了。您可以进一步使用xlim
参数boxplot
来减少绘图的内边距。试试xlim=c(0.8,3.2)
。结果:
选项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?那就是在那里浪费了很多空间。另外,为什么删除异常值?只是自己问一下IR研究员: - )
答案 1 :(得分: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),这将绘制更宽的数据范围,btu您的数据将移动到更靠近中心。如果你这样做,你也会想要注释axis(side=1, lwd=0, labels=FALSE, at=c(1:5), cex.axis=1)
,因为这可能会产生额外的刻度线(我不知道为什么它会在那里出现)。
答案 2 :(得分:1)
预先做好两件事:
boxwex=0.4
正在水平缩小方框。
ylim=c(0,1)
垂直打开空间(我不认为是垂直的
空白本身就是一个问题。
boxwex
的水平空白量是成比例的
如果您创建640像素或6400像素宽的图像,则boxwex
为
仍然给你40%的横向覆盖率(默认为80%)。
无论如何,boxplot
将扩展到整个宽度
这个数字。
jpeg()
(和png()
,
pdf()
和svg()
),您可以指定捕获的维度
图片。对于jpeg
和png
,width
和height
的单位都在
像素;我发现72 dpi的默认分辨率有点棘手,
所以知道你可以改变res
。请注意,这将影响如何
字体也适合,而不仅仅是使线条看起来不那么棘手。
(顺便说一句:除非你包括在内,否则我通常建议反对jpeg()
大量的颜色和/或覆盖实际图像,但YMMV。)
除非您确实需要设置特定的宽高比,否则请使用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-ian。 (我还会考虑其他的事情
正在col
调用boxplot
的方框中添加颜色
他们从白色背景中脱颖而出。)