我一直在浏览+搜索一段时间,无法弄清楚我是否做错了。
我有一个简单的数据框,包含一些因素和数字。有一个时间变量,我只使用年份,我想在不同的图中绘制这些数据的子集。
我已经编写了一个简单的函数来对数据进行子集化和绘图,但是我注意到当我的数据位于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")
现在考虑多年的不同范围。
minYear <- 2005
maxYear <- 2009
doPlot(data,minYear,maxYear)
doPlot(data,minYear,maxYear,"Bob")
以下是结果:请注意左侧和右侧的条形图未绘制,但数字为。
数据显然是假的,但结构与我的相似。我想要条形图上的数字,因为最终我会为不同的类别堆叠条形图。我还需要确保这些图是可比较的,即所有图的覆盖相同的X范围,即使数据的某些子集具有不同的范围。
代码正在运行,我用它来编写一些报告,直到我找到了这个事情发生的子集。问题是:
感谢