如何在R条形图中显示所有x轴标签?

43

这是一个基础问题,但我无法找到答案。我正在一个面板中生成约9个条形图,每个条形图有大约12个条形。我在输入中提供了所有12个标签,但R仅命名交替的条形图。这显然是由于R中某些默认设置需要更改引起的,但我无法找到它。


3
扩大绘图画布。 - James
4个回答

37

如果您在plot()函数调用中使用las=2参数,可能会使所有标签都出现。这个参数以及下面提到的其他参数在?par中有描述,它设置绘图设备的图形参数。这会将文本旋转90度。否则,您需要使用xaxt="n"(关闭刻度和标签),然后使用一个单独的调用axis(1, at= <一些数字向量>, labels=<一些字符向量>)来添加标签。

#  midpts <- barplot( ... ) # assign result to named object
axis(1, at = midpts, labels=names(DD), cex.axis=0.7) # shrinks axis labels

另一种方法是先收集中点,然后使用text()函数并将 xpd 设为 TRUE 以允许文本出现在绘图区域之外,并将 srt 作为命名参数指定旋转角度以控制文本旋转的程度:

text(x=midpts, y=-2, names(DD), cex=0.8, srt=45, xpd=TRUE)

需要使用绘图区域中的坐标来选择y值。

复制一条有用的评论:对于不知道这些参数含义的未来读者,las=2将标签逆时针旋转90度。此外,如果需要缩小字体,可以使用cex.names=.5将大小缩小。


5
LAS=2运行良好,尤其在有许多栏的情况下更为实用。 - user2760
1
las=2 这个建议是可行的,但 axis(...) 不行。axis()barplot() 首先使用的函数;当它被单独调用时,它会再次“尽力不绘制重叠的刻度标签”(正如 ?axis 所述)。 - Josh O'Brien
这取决于具体情况。在您提供的情况下,此代码会在每个刻度处添加标签:axis(1, at = midpts, labels=names(DD), cex.axis=0.7) - IRTFM
1
为了澄清对于未来不知道这些参数作用的读者:las=2 将标签逆时针旋转90度。此外,如果您需要缩小字体,可以使用 cex.names=.5 来缩小大小。 - FistOfFury
有没有一种简单的方法来计算 midpts - Martin Smith
1
@ms609 barplot 函数返回的对象(如果你将其赋值而不仅仅是用于绘图的副作用),是一个具有中点值的向量或矩阵。我假设它被命名为 midpts,但任何名称都可以。如需更多信息,请阅读 ?barplot,重点关注“Value”部分。 - IRTFM

18
为了在基本的R条形图上获得旋转的标签,您可以(就像我在这里做的那样)调整gridBase包中vignette给出的示例之一:
library(grid)
library(gridBase)

## Make some data with names long enough that barplot won't print them all
DD <- table(rpois(100, lambda=5))
names(DD) <- paste("long", names(DD), sep="_")

## Plot, but suppress the labels
midpts <- barplot(DD, col=rainbow(20), names.arg="")

## Use grid to add the labels    
vps <- baseViewports()
pushViewport(vps$inner, vps$figure, vps$plot)

grid.text(names(DD),
    x = unit(midpts, "native"), y=unit(-1, "lines"),
    just="right", rot=50)

popViewport(3)

enter image description here


哦,我刚刚收到了“找不到函数'pushViewport'”的错误信息,所以我猜这可能是旧版本的问题。 - Dirk
2
@Dirk 感谢您的评论。看起来您现在需要显式加载 grid 包。我刚刚进行了编辑,现在它可以按预期工作了。 - Josh O'Brien

9

如果标签太大,R不会为每个条形图打上标签。

我建议您尝试通过在绘图函数中传递las=2参数来将标签垂直旋转。

如果标签还是太大,您可以尝试使用cex.names=.5参数来缩小字体。

绘制样本数据

sample_curve <- c(2.31,2.34,2.37,2.52,2.69,2.81,2.83,2.85,2.94, 3.03,  3.21,  3.33)   # create a sample curve
names(sample_curve)<-c("1 MO","2 MO","3 MO","6 MO","1 YR","2 YR","3 YR","5 YR","7 YR","10 YR","20 YR","30 YR") # label the curve

标签过大的绘图示例

barplot(sample_curve) # labels too big for the plot

标签过大

旋转并缩小标签的示例图

barplot(sample_curve, las=2, cex.names=.5) # lables are rotated and smaller, so they fit

rotated and smaller


2

在绘制 barplot() 之前

您可以使用 par() 并调整边距值(您的图表有 4 个边距) mar = c(v1,v2,v3,V4) 来简单地增加边距。

par(mar=c(10,4,4,4))

例如:

par(mar=c(10,4,4,4))
barplot(height=c(1,5,8,19,7),
        names.arg=c("very long label 1","very long label 2",
                    "very long label 3","very long label 4",
                    "very long label 5"), las=2 )

Very long labels Barplot


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