箱线图:倾斜标签的x轴

8

如何在R中为盒式图的x轴标签进行旋转?我知道要使用的代码,但无法应用:

text(**????**, par("usr")[3] - 0.25, srt = 45, adj = 1, labels = labels, xpd = TRUE)

在我用问号标示的地方应该填什么变量?我创建了这个箱线图:

enter image description here

使用下列代码:

soil=read.csv("soil_temp_boxplot.csv", header=TRUE, sep=";")    
tiff("soil_boxplot.tiff")
par(mar=c(5.5,3.5,0.5,0.5))
labels<-paste(c("RB-GL830-[16]-10","RB-GL830-[16]-30", "SB-GL834-[11]-10","SB-GL834-[11]-30", "RB-GL843-[17]-10","RB-GL843-[17]-30","SB-GL864-[12]-10","SB-GL864-[12]-30","SB-GL989-[10]-30", "RB-F844-[18]-10", "RB-F844-[18]-30", "SBB-F-864-[14]-10","SB-F991-[13]-10", "SB-F991-[13]-30"))
boxplot(soil$rb.gl.10.830.16, soil$rb.gl.30.830.16, soil$sb.gl.10.834.11, soil$sb.gl.30.834.11, soil$rb.gl.10.843.17, soil$rb.gl.30.843.17, soil$sb.gl.10.864.12, soil$sb.gl.30.864.12, soil$sb.gl.30.989.10, soil$rb.f.10.844.18, soil$rb.f.30.844.18, soil$sbb.f.10.864.14, soil$sb.f.10.991.13, soil$sb.f.30.991.13, yaxt="n", col=c("darkolivegreen1","darkolivegreen4","darkolivegreen1","darkolivegreen4","darkolivegreen1","darkolivegreen4","darkolivegreen1","darkolivegreen4","darkolivegreen1","burlywood2","burlywood4","burlywood2","burlywood2", "burlywood4"))
axis(1, labels = TRUE)
axis(2, c(0, 8, c(1, 2, 3, 4, 5,6,7)), las=1)
text(labels, par("usr")[3] - 0.25, srt = 45, adj = 1, labels = labels, xpd = TRUE)
mtext(2, text="Soil Temperature [°C]", line=2.2)
mtext(1, text="Location", line=4.5)
dev.off()
2个回答

14

您原来的 text 表达式的另一种选择:

par(mar=c(6, 4.1, 4.1, 2.1))

labels <- paste(c("RB-GL830-[16]-10", 
                  "RB-GL830-[16]-30",
                  "SB-GL834-[11]-10",
                  "SB-GL834-[11]-30",
                  "RB-GL843-[17]-10",
                  "RB-GL843-[17]-30"))

boxplot(count ~ spray, data = InsectSprays,
        col = "lightgray", xaxt = "n",  xlab = "")

# x axis with ticks but without labels
axis(1, labels = FALSE)

# Plot x labs at default x position
text(x =  seq_along(labels), y = par("usr")[3] - 1, srt = 45, adj = 1,
     labels = labels, xpd = TRUE)

为什么要使用x = seq_along(labels)来标记位置?在text中的x是一个坐标向量,用于放置标签。如果查看?boxplot,你会发现at参数是一个“数字向量,给出箱线图应绘制的位置[...]; 默认为1:n,其中n是箱子数量。”因为我们在boxplot调用中没有指定at参数,所以将使用默认的“1:n位置”。箱子的数量当然是解释变量级别的数量,这是@Josh O'Brien在他的回答中使用的。为了向你展示另一种选择,我使用了你的自定义标签向量(当然必须与因子水平的数量相同)。seq_along从1到length的参数生成一个常规序列,对应于“默认为1:n” at位置。

一个副注:你的数据似乎是以“宽”格式呈现的。在R中的许多情况下,将数据呈现为“长”格式更加方便。在plot函数中,您只需要指定x变量(例如位置)和y变量(例如土壤温度),而不是为每个x级别指定数据。 enter image description here


很高兴听到这个好消息 @samjam!请在我的更新答案中查看有关您数据格式的小侧记。 - Henrik
2
这很好!但是在不同的比例尺下,y = par("usr")[3] - 1 的效果不佳。更好的方法是使用 y = par("usr")[3] - (par("usr")[4] - par("usr")[3])/30,其中 30 是要用作标签和轴之间空间的高度比例。在任何比例尺下都可以正常工作 :) - Tomas

2

查看plotrix包中的staxlab函数,它使得这个过程(以及另一种替代方法)变得相当简单。


@Henrik,我相信我的答案解决了OP的“主要问题”,但我不同意主要问题与如何指定标签的x坐标的具体问题相同(我承认我的答案没有回答这个问题)。这样的论坛之美在于多个答案可以回答主要问题以及其他相关问题,这些问题可能对OP和未来搜索者感兴趣。我也不会看着手表说“是的”,当被问到“你知道现在几点了吗?” - Greg Snow

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