【问题标题】:R: How to set adjustable width in a barplot?R:如何在条形图中设置可调宽度?
【发布时间】:2016-02-23 20:57:51
【问题描述】:

我正在尝试自动创建必须在不断变化的数据集上定期使用的条形图。 这是一个演示数据格式的示例。数据集中包含的年数和月数是可变的:

plotdata<-data.frame(c(2014, 2015, 2015), c(5, 5, 6), c("example", "example", "example"), c(0.34, 0.44, 0.52))
names(plotdata)<-c('year', 'month', 'name', 'value')

我做了一个函数来创建一个标准的条形图,看起来像这样:

bar_month<-function(x){

lbls<-ifelse(plotdata$month==1, paste("January\n", plotdata$year),
      ifelse(plotdata$month==2, paste("February\n", plotdata$year),
      ifelse(plotdata$month==3, paste("March\n", plotdata$year),
      ifelse(plotdata$month==4, paste("April\n", plotdata$year),
      ifelse(plotdata$month==5, paste("May\n", plotdata$year),
      ifelse(plotdata$month==6, paste("June\n", plotdata$year),
      ifelse(plotdata$month==7, paste("July\n", plotdata$year),
      ifelse(plotdata$month==8, paste("August\n", plotdata$year),
      ifelse(plotdata$month==9, paste("September\n", plotdata$year),
      ifelse(plotdata$month==10, paste("October\n", plotdata$year),
      ifelse(plotdata$month==11, paste("November\n", plotdata$year),
      ifelse(plotdata$month==12, paste("December\n", plotdata$year),
NA))))))))))))


maxY=max(na.omit(plotdata$value))
maxX<-length(na.omit(plotdata$month))
title<-paste("Monthly Values",  as.character(unique(na.omit(x$name))))


bar<-barplot(plotdata$value,
    ylim=c(0, maxY),
    xlim=c(0, maxX),
    main=title,
    xlab="Month",
    ylab="Value",
    cex.names=2.5,
    width = c(0.5, 0.5, 0.5))
axis(side=1, labels=lbls, at=bar, las=0, pos=0)
result<-bar
return(result)
}
graph<-bar_month(x)

这很好,但有一个例外。条形的宽度随着数据集中出现的月份数而变化。如果我在给定的数据集中只有几个月的时间,那么我会得到巨大的条形图,这看起来很傻。我想根据我的数据集中值的数量定义最大宽度或可调整的条形宽度。有什么办法可以做到这一点吗?

感谢您的帮助!

【问题讨论】:

  • 我想我必须补充一点,在上面的示例中,我将宽度定义为 0.5,因为我想要它。但是,在具有不同数量值的数据集中,我每次都必须调整宽度,这是我想避免的。

标签: r width bar-chart


【解决方案1】:

如果您将xlim 设置为固定最大值,例如xlim=c(0, 10)(取决于数据集中的最大月数)并将width 设置为width = rep(0.5,10)),条形将始终具有相同的宽度。

编辑:

maxWidth <- ifelse(maxX <= 5, 0.1,0.5)
bar<-barplot(plotdata$value,
    ylim=c(0, maxY),
    xlim=c(0, maxX),
    main=title,
    xlab="Month",
    ylab="Value",
    cex.names=2.5,
    width = rep(maxWidth,maxX))

ifelse(maxX &lt;= 5, 0.1,0.5) 中找到最佳阈值。这可能会更好。

【讨论】:

  • 确实有效。不幸的是,我实际上并不知道最大月数。有时一项调查只持续几个月,有时甚至几年。一个更通用的解决方案会很棒。