R条形图轴缩放

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轴并没有伸展到整个图表的范围内,而是在中途停止。看起来问题很简单,但我却无法解决它,迄今为止也找不到任何解决方案:(希望能得到您的帮助,非常感谢。

正如@DWin所提出的那样:您的“at”和“labels”参数之间的不匹配是有意还是打字错误? - Ben Bolker
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))

大多数统计图形专家会告诉你,用点或线而不是条形图(非数据墨迹,Tufte等等)来绘制定量(x,y)数据更好。


3
不确定你具体想要什么,但如果你希望标签从一端到另一端均匀分布(不一定准确),那么:
x = c(1:81)
bp <- barplot(x)  # returns centered x axis positions as matrix
axis(side=1,
     at=bp[1+c(0,20,40,60,80)],  # Need to increment, R uses 1-based indices
     labels=c(20,40,60,80,100))

对我来说,困惑的是你为什么要在0处标记“20”。但这是一种方法。
我认为Ben关于x轴是用于(有序)类别的观点大致正确,但我并不完全同意y值应该被视为分类变量。

-1
我会再加一种方法来展示这个问题,那就是在图表中添加更多的线条。
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

我想到的最好的方法是定义一个新的条形图函数,该函数还将接受参数"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))

enter image description here

lines命令穿过了最后一个柱子 - x轴的刻度与预期一样简单,但你现在也可以定义任意位置的柱子(你可以稍微调整函数以具有其他R绘图函数的相同属性)。

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