如何在R Barplot中显示x轴标签?

5

可能很简单,但我是R(和stack)的新手...

似乎无法在我的条形图的x轴上显示汽车名称。

我尝试粘贴“How to display all x labels in R barplot?”问题中给出的示例,但那并没有起作用

我的代码如下。那个代码对其他人有用吗?

#plot of efficiency of 4 cylinder cars
#get 4cylinder cars seperate
fourcyl <- subset(mtcars, cyl == "4")
#barplot in descending order... need to add in car names.
barplot(fourcyl$mpg[order(fourcyl$mpg, decreasing = TRUE)], 
        horiz=FALSE,
        ylab = "Miles per Gallon",
        main = "Efficiency for 4 cylinder vehicles",
        ylim = c(0,35))

我复制了他提供的代码,但是当我运行它时,即使那个箱线图也没有任何x轴标签... - Julian Tagell
1个回答

2

@Pascal的评论提供了两种可能的解决方案,但关键是您需要手动添加汽车名称。

要知道使用哪些汽车名称需要迈出第一步:如果您查看mtcars,您会发现它们不会出现在列标题下面,这意味着它们是行名称。要获取它们,只需:

carnames <- rownames(fourcyl)[ order(fourcyl$mpg, decreasing=TRUE) ]

从这里开始,你需要知道在哪里以及如何添加它们。也许很多人首先看的地方是axis,你可以像这样操作:

axis(side=1, at=1:length(carnames), labels=carnames)

但至少有两点会让您失望:首先,您无法看到所有的名称,因为axis非常细心地确保它们不重叠,并省略了一些名称;其次,显示出来的名称没有在相应的垂直线下正确对齐。
要解决第一个问题,可以尝试旋转文本。您可以使用las(请参阅help(par)),并进行如下操作:
axis(side=1, at=1:length(carnames), labels=carnames, las=2)

但是,你会发现很多名称会超出默认的底部边距(并且消失),这可能会让你有点失望。你可以通过在前面加上 par(mar=...) 来解决这个问题(同样,请参考帮助文档并尝试一些参数来找到正确的设置)。但是,还有一些提供稍微更好方法(美学上)的解决方案,其中两个在 @Pascal 的链接中提到(真的,请去那里看看)。
另一个问题——标签放在哪里——通过阅读 help(barplot) 并注意到从 barplot(...) 返回的值是一个矩阵,提供了每个条形图的中点来解决。可能有点奇怪,但它就是这样(而且它有一个很好的理由,在某个地方)。因此,捕获这个返回值,你就几乎完成了。
bp <- barplot(fourcyl$mpg[order(fourcyl$mpg, decreasing = TRUE)], 
              horiz=FALSE, ylab = "Miles per Gallon",
              main = "Efficiency for 4 cylinder vehicles",
              ylim = c(0,35))

现在,要复制一个链接的建议,请尝试:
text(x=bp[,1], y=-1, adj=c(1, 1), carnames, cex=0.8, srt=45, xpd=TRUE)

(不需要使用axis命令,只需使用bp <- barplot(...)carnames <- ...text(...)。)

非常感谢您详尽的回答。它起作用了。我为此苦苦挣扎了大部分时间。非常感激您的回复。 - Julian Tagell
有时人们希望比 barplot 提供更多的控制,因此他们需要手动制作条形图。如果您感兴趣,我在这里提出了一个(具有更多功能)不同问题的答案,使用 plotrect,链接为 SO#30794373 - r2evans

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