6

我想用一些 x 轴标签绘制一些数据的条形图,但到目前为止,我一直遇到同样的问题,因为轴缩放完全不受限制,因此我的标签错误地位于条形下方。我能想到的最简单的例子:

x = c(1:81)
barplot(x)
axis(side=1,at=c(0,20,40,60,80),labels=c(20,40,60,80,100))

如您所见,x 轴并没有沿着整个图延伸,而是停在两者之间的某个位置。在我看来,问题似乎很简单,但不知何故我无法修复它,到目前为止我找不到任何解决方案:(

任何帮助是极大的赞赏。

4

3 回答 3

13

问题是它barplot实际上是为绘制分类数据而不是数字数据而设计的,因此它在设置水平轴刻度方面几乎做了自己的事情。解决此问题的主要方法是通过将结果保存barplot到变量来恢复条形中点的实际 x 位置,但正如您在下面看到的,我还没有想出一种优雅的方式来做您想做的事情基础图形。也许别人可以做得更好。

x = c(1:81)
b <- barplot(x)
## axis(side=1,at=c(0,20,40,60,80),labels=c(20,40,60,80,100))
head(b)

您可以在此处看到实际的中点位置是 0.7、1.9、3.1、...——而不是 1、2、3 ...

如果您不想将轴从 0 扩展到 100 ,这非常快:

b <- barplot(x)
axis(side=1,at=b[c(20,40,60,80)],labels=seq(20,80,by=20))

这是我在基本图形中最好的方法:

b <- barplot(x,xlim=c(0,120))
bdiff <- diff(b)[1]
axis(side=1,at=c(b[1]-bdiff,b[c(20,40,60,80)],b[81]+19*bdiff),
              labels=seq(0,100,by=20))

你可以试试这个,但条形图没有那么漂亮:

plot(x,type="h",lwd=4,col="gray",xlim=c(0,100))

或在ggplot

library(ggplot2)
d <- data.frame(x=1:81)
ggplot(d,aes(x=x,y=x))+geom_bar(stat="identity",fill="lightblue",
                   colour="gray")+xlim(c(0,100))

大多数统计图形书呆子会告诉您,用点或线而不是条形图更好地绘制定量(x,y)数据(非数据墨水,Tufte,等等等等 :-))

于 2011-11-27T14:45:05.070 回答
2

不确定您到底想要什么,但是如果要让标签从一端均匀地运行到另一端(但不一定准确),那么:

x = c(1:81)
bp <- barplot(x)
axis(side=1,at=bp[1+c(0,20,40,60,80)],labels=c(20,40,60,80,100))

对我来说,困惑是为什么你想将“20”标记为 0。但这是一种方法。

于 2011-11-27T16:18:40.363 回答
0

我遇到了同样令人讨厌的 batplots 属性——x 坐标变得疯狂。我会添加另一种方式来显示问题,那就是在情节中添加更多线条。

x = c(1:81)
barplot(x)
axis(side=1,at=c(0,20,40,60,80),labels=c(20,40,60,80,100))
lines(c(81,81), c(0, 100)) # this should cross the last bar, but it does not

我带来的最好的方法是定义一个新的 barplot 函数,该函数还将采用参数“at”来绘制条形的位置。

barplot_xscaled <- function(bar_heights, at = NA, width = 0.5, col = 'grey'){
  if ( is.na(at) ){
    at <- c(1:length(bar_heights))
  }

  plot(bar_heights, type="n", xlab="", ylab="",
       ylim=c(0, max(bar_heights)), xlim=range(at), bty = 'n')
  for ( i in 1:length(bar_heights)){
    rect(at[i] - width, 0, at[i] + width, bar_heights[i], col = col)
  }
}

barplot_xscaled(x)
lines(c(81, 81), c(0, 100))

在此处输入图像描述

lines 命令穿过最后一个条 - x 比例的工作方式与天真的预期一样,但您现在也可以定义您想要的条的任何位置(您可以更多地使用该函数以具有与其他 R 绘图相同的属性职能)。

于 2022-02-10T12:30:04.767 回答