R条形图轴缩放

9lowa7mx  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(97)

我想用一些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轴并没有沿着整个图延伸,而是在两者之间的某个地方停止。在我看来,这个问题似乎很简单,但我不知何故,我无法解决它,我无法找到任何解决方案:(
任何帮助都非常感谢。

webghufk

webghufk1#

问题是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,等等等等:-)

i7uq4tfw

i7uq4tfw2#

不确定你到底想要什么,但如果它是有标签运行从一端到另一端均匀放置(但不一定准确),然后:

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轴的值是分类的。

vddsk6oq

vddsk6oq3#

我遇到了 bat 图同样恼人的特性-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

字符串
我最好的办法是定义一个新的条形图函数,它也将接受参数“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))


x1c 0d1x的数据
lines命令穿过最后一个条形图-x刻度的工作原理和我们天真地预期的一样,但是现在你也可以定义你想要的任何条形图的位置(你可以对这个函数进行更多的操作,以获得与其他R绘图函数相同的属性)。

相关问题