我有一个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
现在,我想将这些信息放在一个看起来像这样的图形中:
知道如何使用大量裁剪(行)和不同位置吗?
答案 0 :(得分:5)
这是一个例子,假设你有播种的day.of.year()和每个作物和每个国家的三个时期的持续时间(以天为单位)。
#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 :(得分:2)
要在每个"color=.."
的{{1}}来电中添加图例广告aes()
,然后使用参数geom_linerange()
添加scale_color_identity()
- 这将使用颜色名称作为实际颜色。使用guide="legend"
,您可以更改图例中的标签。要删除月份之间的行,请在labels=
内添加minor_breaks=NULL
。
scale_y_date()
答案 2 :(得分: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)
答案 3 :(得分: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("")
给出:
BUT
我现在要添加图例并删除每个月之间的所有白线。有任何想法吗?感谢