R + ggplot + geom_bar + scale_x_continuous + limits:最左边和最右边的条没有显示在地块上

时间:2016-02-23 18:33:10

标签: r ggplot2

我一直在浏览+搜索一段时间,无法弄清楚我是否做错了。

我有一个简单的数据框,包含一些因素和数字。有一个时间变量,我只使用年份,我想在不同的图中绘制这些数据的子集。

我已经编写了一个简单的函数来对数据进行子集化和绘图,但是我注意到当我的数据位于scale_x_continuous定义的范围内时,不会绘制条形图,而是值。真的很奇怪,请看下面的示例代码再现问题(我不能称之为错误)。

首先,用绘图创建PNG的功能。它的参数是数据框,最小和最大年份以及可选的用作过滤器的名称(如果名称作为参数传递,它也将用于PNG文件名和图标题。)

library(ggplot2)
library(plyr)


doPlot <- function(data,minYear,maxYear,name=character(0)) {
  # If we pass a name as parameter we need to change the output file name, the plot title
  # and subset the data.
  fname = sprintf("Performance-%d-%d.png",minYear,maxYear)
  title = "Performance (Sheared Sheeps)"
  mysubset <- subset(data, Category == "SHEEP")
  mysubset <- subset(mysubset, Year <= maxYear & Year >= minYear)
  if(length(name)!=0) {
    fname = sprintf("Performance-%d-%d-%s.png",minYear,maxYear,name)
    title = sprintf("Performance (Sheared Sheeps) - %s",name)
    mysubset <- subset(mysubset,Name == name)
  }
  byYear <- aggregate(Quantity ~ Year, mysubset, sum)
  png(filename=fname,width = 960, height = 640)
  g <- ggplot(byYear, aes(x=Year,y=Quantity))
  print(g + geom_bar(stat="identity",fill=goodBlue, colour="black") + 
    ggtitle(title) +
    scale_x_continuous(name="Year", limits=c(minYear,maxYear), breaks=seq(minYear,maxYear,1)) +
    mytheme+
    geom_text(aes(label=Quantity), vjust=1.3,size=6))
  dev.off()
}

一些常量(情节的数据框和主题)

consts = paste('"Category","Year","Name","Quantity"\n',
               'SHEEP,2003,Alice,10\n',
               'SHEEP,2005,Alice,3\n',
               'SHEEP,2008,Alice,2\n',
               'SHEEP,2009,Alice,1\n',
               'SHEEP,2012,Alice,3\n',
               'CACTUS,1997,Bob,45\n',
               'CHICKEN,1997,Bob,6\n',
               'SHEEP,1998,Bob,2\n',
               'SHEEP,2005,Bob,5\n',sep = "")
data <- read.csv(text=consts,header = TRUE)

# Colors and themes for the plot
goodBlue <- "#7fbfff"
darkBlue <- "#3f5f7f"
mytheme <- theme(plot.title = element_text(color=darkBlue,face="bold",size=20),
                   axis.title.x = element_text(color=darkBlue,face="bold",size=16),
                   axis.title.y = element_text(color=darkBlue,face="bold",size=16),
                   axis.text.x = element_text(color=darkBlue,face="bold",size=14),
                   axis.text.y = element_text(color=darkBlue,face="bold",size=12),
                   legend.title = element_text(color=darkBlue,face="bold",size=18),
                   legend.text = element_text(color=darkBlue,face="bold",size=12))

主要代码。我将创建四个地块,一个考虑2000年至2010年的数据,适用于所有采煤机和仅鲍勃。

# Consider only this range.
minYear <- 2000
maxYear <- 2010
doPlot(data,minYear,maxYear)
doPlot(data,minYear,maxYear,"Bob")

这很好用。 All sheared sheep, from 2000 to 2010 Sheared by Bob the Near-Sighted Shearer, 2000-2010

现在考虑多年的不同范围。

minYear <- 2005
maxYear <- 2009
doPlot(data,minYear,maxYear)
doPlot(data,minYear,maxYear,"Bob")

以下是结果:请注意左侧和右侧的条形图未绘制,但数字为。

All sheared sheep, from 2005 to 2009 Sheared by Bob the Near-Sighted Shearer, 2005-2009

数据显然是假的,但结构与我的相似。我想要条形图上的数字,因为最终我会为不同的类别堆叠条形图。我还需要确保这些图是可比较的,即所有图的覆盖相同的X范围,即使数据的某些子集具有不同的范围。

代码正在运行,我用它来编写一些报告,直到我找到了这个事情发生的子集。问题是:

  • 如果您尝试重现此问题,是否也会在您的设置中发生?我使用的是Mac,3.2.3,RStudio 0.99.879
  • 关于使用geom_bar和/或scale_x_continuous,我做错了什么?
  • 是图形问题(看起来左边距和右边距不足以绘制条形图)或概念问题(使用限制时不会绘制极限条?)
  • 如果最好的选择是使用geom_histogram我怎样才能确保这些箱子完全等于一年,考虑到我指定的范围?

感谢

0 个答案:

没有答案