【问题标题】:"axis" won't add x-axis to boxplot“轴”不会将 x 轴添加到箱线图
【发布时间】:2017-01-24 19:47:50
【问题描述】:

我正在尝试使用自定义轴标签制作箱线图,但我似乎无法在图中添加 x 轴。

例如:

test <- data.frame(year=as.integer(rep(1963:2014, each=10)),
       response=rnorm(520))
boxplot(response~year, data=test, ylim=c(-3,3), xlab="", ylab="", 
    range=0, xaxt="n", yaxt="n")
responselabs <- as.numeric(c(-3:3, by=1))
yearlabs <- as.integer(seq(1965,2015, by=5))
axis(2, at=responselabs, tck=0.03, las=1)
axis(1, at=yearlabs, tck=0.03)

返回箱线图,但没有 x 轴标签:

尝试通过先制作一个空图来以另一种方式破解它,我可以获得轴,但它不会添加箱线图:

plot(NA, ylim=c(-3, 3), xlim=c(1962, 2015), xaxt="n", yaxt="n", ylab="", xlab="")
axis(2, at=responselabs, tck=0.03, las=1)
axis(1, at=yearlabs, tck=0.03)
boxplot(response~year, data=test, ylim=c(-3,3), xlab="", ylab="", 
    range=0, xaxt="n", yaxt="n", add=T)

这是怎么回事?

【问题讨论】:

  • boxplot 可能会将year 转换为一个因子。试试这个:axis(1, at = 1:length(unique(test$year)), labels = unique(test$year))

标签: r plot axis boxplot labels


【解决方案1】:

我认为正在发生的事情是 boxplotyear 转换为 factor。我们可以通过使用axis 中的labels 参数来解决这个问题:

boxplot(response~year, data=test, ylim=c(-3,3), xlab="", ylab="", 
    range=0, xaxt="n", yaxt="n")
responselabs <- as.numeric(c(-3:3, by=1))
yearlabs <- as.integer(seq(1965,2015, by=5))
axis(2, at=responselabs, tck=0.03, las=1)
axis(1, at = yearlabs - 1962, labels = yearlabs)

【讨论】:

  • 但这会将标签放在不应该出现的位置...... test$year 范围从 1963 年到 2014 年,但根据您的建议,数据扩展到 2017 年
  • 我不明白,在我看来,箱线图上的数据延伸到 2015 年(2014 年方框右侧的一个)
  • 抱歉,原来的代码好像不能正常工作。真的像减1962那么简单吗?
  • 关键是轴标签的位置是整数。因此,您需要根据年份的数值放置标签 no,而是沿seq_along(years)。因此,如果第一年是 1950 年,那么您应该减去 1949 年。
【解决方案2】:

为什么不使用 ggplot2?

library(ggplot2)
p<-ggplot(test,aes(x=year,y=response,group=year))+
geom_boxplot()+
scale_x_continuous(breaks=round(seq(min(test$year),max(test$year),by=5),1))

如果您想四舍五入到最接近的 5,那么代码很容易在 scale_x_continuous() 参数中进行调整。

p<-ggplot(test,aes(x=year,y=response,group=year))+
   geom_boxplot()+
   scale_x_continuous(breaks = round(seq(round(min(test$year)/5,0)*5,round(max(test$year)/5,0)*5, by = 5),1))

【讨论】:

  • 您的答案没有提供 OP 要求的 x 轴标签中的间隔
  • 感谢您的回答。我确实喜欢 ggplot,我只是想将其保留在基本绘图函数中以节省时间。
  • 没问题@Patrick,我个人更喜欢 ggplot 来满足我几乎所有的绘图需求......尽管为了探索性目的,有时很难抗拒调用 hist() 或 boxplot() !
【解决方案3】:

正如其他人所说,您可能混淆了 x 轴下的值。玩弄abline() 会发现abline(v=2010) 不会出现,但会出现abline(v=50) 之类的东西。

这是你所追求的情节,我相信(有一些额外的修改):

year_vals <- as.integer(rep(1963:2014, each=10)) # pulling out of next line for easy reference
test <- data.frame(year=year_vals,response=rnorm(520))
boxplot(response~year, data=test, ylim=c(-3,3), xlab="", ylab="", range=0, xaxt="n", yaxt="n")
responselabs <- as.numeric(c(-3:3, by=1))
yearlabs <- year_vals[year_vals%%5==0] # alternate, more general definition; note that 2015 wasn't in the original 'test' data.frame #as.integer(seq(1965,2015, by=5))
axis(2, at=responselabs, tck=0.03, las=1)
# axis(1, at=1:length(yearlabs), tck=0.03)
axis(1, at=which(unique(year_vals)%in%yearlabs), labels=unique(yearlabs), tck=0.03)

【讨论】:

  • 这似乎比它需要的要复杂得多。
猜你喜欢
  • 2016-06-22
  • 2022-01-23
  • 2021-07-13
  • 1970-01-01
  • 2020-11-05
  • 2019-10-08
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多