2013-07-23 9 views
5

Ich habe eine CSV-Datei (crop_calendar.csv) mit Informationen über Entwicklungsstadien der Ernte in einer bestimmten Region. Im Grunde genommen jede Zeile die folgende Struktur:Plotten Erntekalender

crop_name sowing_dat emergence_date flowering_date maturity_date harvest_date 

, die zum Beispiel gibt:

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 

Nun, würde Ich mag, dass die Informationen in einer Grafik setzen, die so aussieht: crop calendar example

Irgendeine Idee, wie man es mit viel Ernte (Reihen) und an verschiedenen Standorten macht?

+3

Bitte geben Sie ein [reproduzierbares Beispiel] (http://stackoverflow.com/a/5963610/1412059) von dem, was Sie versucht haben. – Roland

+0

lesen Sie es als data.frame, aufgeteilt nach Ort, erstellen Sie die Handlung für jede Teilmenge – Dennis

+0

Mit einer Frage und einer halben Antwort, die auch eine Frage sein könnte, ist es ziemlich schwer zu sagen, was Ihre Frage jetzt ist und was das Kopfgeld ist zum. Vielleicht, wenn die Antworten nicht genug Details enthalten, verschiebe deine eigene Antwort in deine Frage, damit die Leute sehen können, was du bisher hast. Dann stellen Sie sehr spezifische Fragen? –

Antwort

5

Hier ist ein Beispiel, das Sie die day.of.year haben unter der Annahme() von Aussaat und die Dauer (in Tagen) der drei Perioden für jede Kultur und jedes Land.

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

Es ist ein bisschen schwierig zu erraten, was Sie tun möchten. Mit nur 3 Daten können Sie die angezeigte Grafik nicht reproduzieren (benötigt 4 Daten für jede Ernte). Es ist auch nicht klar, was die Zahlen darstellen (vermutlich Wochen?). Wenn es nur eine Frage zum Plotten ist, wird dir das helfen. Ansonsten, bitte klären Sie die Frage.

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

Danke! Beachten Sie, dass die Daten im Format "Tag.Monat" vorliegen. Die Frage ist nun, wie man mit dem Datumsformat mit der X-Achse umgehen soll ... – WAF

1

Ok so Antworten zusammenzustellen und mit zusätzlicher Forschung, hier ist die Lösung, die ich am Ende mit:

enter image description here

ABER

Ich mag:

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("") 

die gibt Jetzt um die Legende hinzuzufügen und alle weißen Linien zwischen den einzelnen Monaten zu entfernen. Irgendwelche Ideen? Dank

2

Legende Ort "color=.." innerhalb des aes() Anruf in jedem geom_linerange() hinzufügen und fügen Sie dann scale_color_identity() mit dem Argument guide="legend" - dies wird Farbnamen als den tatsächlichen Farben verwenden. Mit labels= können Sie Beschriftungen in der Legende ändern. Um Linien zwischen den Monaten zu entfernen, fügen Sie minor_breaks=NULL innerhalb der hinzu.

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