2013-07-23 39 views
5

我有一个csv文件(crop_calendar.csv),其中包含特定区域中作物开发阶段的信息。基本上每一行具有以下结构:绘制作物日历

crop_name sowing_dat emergence_date flowering_date maturity_date harvest_date 

它例如得出:

Winter_wheat 18.08 28.08 24.06 30.07 3.08 
Winter_rye  18.08 28.08 15.06 23.07 29.07 
Spring_wheat 27.04 10.05 1.07 4.08 7.08 
Spring_barley 27.04 12.05 27.06 1.08 5.08 

现在,我想将这些信息以图形,看起来像: crop calendar example

任何想法如何做到与大量的作物(行)和在不同的位置?

+3

请提供您尝试过什么是[重复的例子(http://stackoverflow.com/a/5963610/1412059)。 – Roland

+0

将其作为data.frame读取,按位置分割,为每个子集创建图形 – Dennis

+0

有了一个问题和半个答案,这也可能是一个问题,很难分辨您的问题现在是什么以及这个赏金是什么对于。也许如果答案没有包含足够的细节,请将自己的答案移到问题中,以便人们可以看到目前为止所拥有的答案。然后问非常具体的问题? –

回答

5

这里是假设你有播种的每个作物和每个国家的三个时期的day.of.year()和持续时间(天)的例子。

The crop calendar

#making random numbers reproducible 
set.seed(12345) 
rawdata <- expand.grid(
    Crop = paste("Crop", LETTERS[1:8]), 
    Country = paste("Country", letters[10:13]) 
) 
#day.of.year of sowing 
rawdata$Sowing <- runif(nrow(rawdata), min = 0, max = 365) 
#number of days until mid season 
rawdata$Midseason <- runif(nrow(rawdata), min = 10, max = 30) 
#number of days until harvest 
rawdata$Harvest <- runif(nrow(rawdata), min = 20, max = 150) 
#number of days until end of harvest 
rawdata$Harvest.end <- runif(nrow(rawdata), min = 10, max = 40) 

dataset <- data.frame(Crop = character(0), Country = character(0), Period = character(0), Duration = numeric(0)) 

#sowing around new year 
last.day <- rowSums(rawdata[, c("Sowing", "Midseason")]) 
if(any(last.day >= 365)){ 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Sowing", 
     Duration = last.day[last.day >= 365] - 365 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Mid-season", 
     Duration = rawdata$Harvest[last.day >= 365] 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Harvest", 
     Duration = rawdata$Harvest.end[last.day >= 365] 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = NA, 
     Duration = 365 - rowSums(rawdata[last.day >= 365, c("Midseason", "Harvest", "Harvest.end")]) 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Sowing", 
     Duration = 365 - rawdata$Sowing[last.day >= 365] 
    ) 
) 
    rawdata <- rawdata[last.day < 365, ] 
} 

#mid-season around new year 
last.day <- rowSums(rawdata[, c("Sowing", "Midseason", "Harvest")]) 
if(any(last.day >= 365)){ 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Mid-season", 
     Duration = last.day[last.day >= 365] - 365 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Harvest", 
     Duration = rawdata$Harvest.end[last.day >= 365] 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = NA, 
     Duration = 365 - rowSums(rawdata[last.day >= 365, c("Midseason", "Harvest", "Harvest.end")]) 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Sowing", 
     Duration = rawdata$Midseason[last.day >= 365] 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Mid-season", 
     Duration = 365 - rowSums(rawdata[last.day >= 365, c("Sowing", "Midseason")]) 
    ) 
) 
    rawdata <- rawdata[last.day < 365, ] 
} 


#harvest around new year 
last.day <- rowSums(rawdata[, c("Sowing", "Midseason", "Harvest", "Harvest.end")]) 
if(any(last.day >= 365)){ 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Harvest", 
     Duration = last.day[last.day >= 365] - 365 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = NA, 
     Duration = 365 - rowSums(rawdata[last.day >= 365, c("Midseason", "Harvest", "Harvest.end")]) 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Sowing", 
     Duration = rawdata$Midseason[last.day >= 365] 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Mid-season", 
     Duration = rawdata$Harvest[last.day >= 365] 
    ) 
) 
    dataset <- rbind(
    dataset, 
    cbind(
     rawdata[last.day >= 365, c("Crop", "Country")], 
     Period = "Harvest", 
     Duration = 365 - rowSums(rawdata[last.day >= 365, c("Sowing", "Midseason", "Harvest")]) 
    ) 
) 
    rawdata <- rawdata[last.day < 365, ] 
} 


#no crop around new year 
dataset <- rbind(
    dataset, 
    cbind(
    rawdata[, c("Crop", "Country")], 
    Period = NA, 
    Duration = rawdata$Sowing 
) 
) 
dataset <- rbind(
    dataset, 
    cbind(
    rawdata[, c("Crop", "Country")], 
    Period = "Sowing", 
    Duration = rawdata$Midseason 
) 
) 
dataset <- rbind(
    dataset, 
    cbind(
    rawdata[, c("Crop", "Country")], 
    Period = "Mid-season", 
    Duration = rawdata$Harvest 
) 
) 
dataset <- rbind(
    dataset, 
    cbind(
    rawdata[, c("Crop", "Country")], 
    Period = "Harvest", 
    Duration = rawdata$Harvest.end 
) 
) 
dataset <- rbind(
    dataset, 
    cbind(
    rawdata[, c("Crop", "Country")], 
    Period = NA, 
    Duration = 365 - rowSums(rawdata[, c("Sowing", "Midseason", "Harvest")]) 
) 
) 

Labels <- c("", "Jan.", "Feb.", "Mar.", "Apr.", "May", "Jun.", "Jul.", "Aug.", "Sep.", "Okt.", "Nov.", "Dec.") 
Breaks <- cumsum(c(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)) 
ggplot(dataset, aes(x = Crop, y = Duration, colour = Period, fill = Period)) + geom_bar(stat = "identity") + facet_wrap(~Country) + coord_flip() + scale_fill_manual(values = c("Sowing" = "darkgreen", "Mid-season" = "grey", "Harvest" = "yellow")) + scale_colour_manual(values = c("Sowing" = "black", "Mid-season" = "black", "Harvest" = "black"), guide = "none") + scale_y_continuous("", breaks = Breaks, labels = Labels, limits = c(0, 365)) + theme_bw() + theme(axis.text.x = element_text(hjust = 1)) 
1

猜测你想要做什么有点困难。只有3个日期,你不能复制你显示的图表(每个作物需要4个日期)。数字代表什么(大概几周?)也不清楚。如果这只是一个关于阴谋的问题,这会让你开始。否则,请澄清问题。

df <- read.table(text="crop_name emergence_date maturity_date harvest_date 
       wheat  13.04   25.05   30.06 
       corn   12.02   21.30   23.11", header=TRUE) 
require(ggplot2) 
ggplot(df, aes(x=crop_name)) + 
    geom_linerange(aes(ymin=emergence_date, ymax=maturity_date), color="green3", size=5) + 
    geom_linerange(aes(ymin=maturity_date, ymax=harvest_date), color="yellow", size=5) + 
    coord_flip() + ylim(0, 52) 
+0

谢谢!请注意,日期以day.month格式显示。现在的问题是如何处理x轴的日期格式... – WAF

1

好了,所以编制的解答和更多的研究,这里是我结束了解决方案:

inDf <- read.table(text="crop  sowing emergence flowering maturity harvesting 
         Spring barley 27/04/2013 12/05/2013 27/06/2013 1/08/2013 5/08/2013 
         Oats 27/04/2013 10/05/2013 29/06/2013 6/08/2013 8/08/2013 
         Maize 25/05/2013 6/06/2013 18/08/2013 10/09/2013 12/09/2013", header=TRUE) 

inDf[, "sowing"]  <- as.Date(inDf[, "sowing"], format = '%d/%m/%Y') 
inDf[, "emergence"] <- as.Date(inDf[, "emergence"], format = '%d/%m/%Y') 
inDf[, "flowering"] <- as.Date(inDf[, "flowering"], format = '%d/%m/%Y') 
inDf[, "maturity"] <- as.Date(inDf[, "maturity"], format = '%d/%m/%Y') 
inDf[, "harvesting"] <- as.Date(inDf[, "harvesting"], format = '%d/%m/%Y') 

ggplot(inDf, aes(x=crop)) + 
geom_linerange(aes(ymin=sowing, ymax=emergence), color="green", size=5) + 
geom_linerange(aes(ymin=emergence, ymax=flowering), color="green3", size=5) + 
geom_linerange(aes(ymin=flowering, ymax=maturity), color="yellow", size=5) + 
geom_linerange(aes(ymin=maturity, ymax=harvesting), color="red", size=5) + 
coord_flip() + scale_y_date(lim = c(as.Date("2012-08-15"), as.Date("2013-09-01")),breaks=date_breaks(width = "1 month"), labels = date_format("%b"))+ 
ggtitle('Crop Calendar')+ xlab("")+ylab("") 

这给: enter image description here

我想现在添加图例并删除每个月之间的所有白线。有任何想法吗?由于

2

在每个geom_linerange()添加传说的地方"color=.."aes()调用内部,然后用参数guide="legend"添加scale_color_identity() - 这将使用颜色名称作为实际颜色。使用labels=您可以更改图例中的标签。要删除几个月之间的行,请在scale_y_date()内添加minor_breaks=NULL

ggplot(inDf, aes(x=crop)) + 
    geom_linerange(aes(ymin=sowing, ymax=emergence, color="green"), size=5) + 
    geom_linerange(aes(ymin=emergence, ymax=flowering, color="green3"), size=5) + 
    geom_linerange(aes(ymin=flowering, ymax=maturity, color="yellow"), size=5) + 
    geom_linerange(aes(ymin=maturity, ymax=harvesting, color="red"), size=5) + 
    coord_flip() + 
    scale_y_date(lim = c(as.Date("2012-08-15"), as.Date("2013-09-01")), 
       breaks=date_breaks(width = "1 month"), labels = date_format("%b"), 
       minor_breaks=NULL)+ 
    ggtitle('Crop Calendar')+ xlab("")+ylab("")+ 
    scale_color_identity("",guide="legend", 
         labels=c("emergence","flowering","maturity","harvesting")) 

enter image description here