R ggplot2-如何使用几何图形绘制时间长度?

R ggplot2-如何使用几何图形绘制时间长度?,r,ggplot2,time-series,timeline,R,Ggplot2,Time Series,Timeline,我试图通过显示多个地区的作物种植和收获日期来显示不同的生长季节长度 我的最终目标是绘制一个如下图: 这是从对的回答中摘取的。请注意,日期以朱利安日(一年中的一天)为单位 我第一次尝试重现类似的情节是: library(data.table) library(ggplot2) mydat <- "Region\tCrop\tPlanting.Begin\tPlanting.End\tHarvest.Begin\tHarvest.End\nCenter-West\tSoybean

我试图通过显示多个地区的作物种植和收获日期来显示不同的生长季节长度

我的最终目标是绘制一个如下图:

这是从对的回答中摘取的。请注意,日期以朱利安日(一年中的一天)为单位

我第一次尝试重现类似的情节是:

library(data.table)
library(ggplot2)

mydat <- "Region\tCrop\tPlanting.Begin\tPlanting.End\tHarvest.Begin\tHarvest.End\nCenter-West\tSoybean\t245\t275\t1\t92\nCenter-West\tCorn\t245\t336\t32\t153\nSouth\tSoybean\t245\t1\t1\t122\nSouth\tCorn\t183\t336\t1\t153\nSoutheast\tSoybean\t275\t336\t1\t122\nSoutheast\tCorn\t214\t336\t32\t122"

# read data as data table
mydat <- setDT(read.table(textConnection(mydat), sep = "\t", header=T))

# melt data table
m <- melt(mydat, id.vars=c("Region","Crop"), variable.name="Period", value.name="value")

# plot stacked bars
ggplot(m, aes(x=Crop, y=value, fill=Period, colour=Period)) + 
  geom_bar(stat="identity") +
  facet_wrap(~Region, nrow=3) +
  coord_flip() +
  theme_bw(base_size=18) +
  scale_colour_manual(values = c("Planting.Begin" = "black", "Planting.End" = "black",
                                 "Harvest.Begin" = "black", "Harvest.End" = "black"), guide = "none")

库(data.table)
图书馆(GG2)

mydat我不认为这是用
geom\u条
geom\u柱
可以做到的。更通用的方法是使用
geom\u rect
绘制矩形。要做到这一点,我们需要稍微改变数据的形状

plotdata <- mydat %>% 
  dplyr::mutate(Crop = factor(Crop)) %>% 
  tidyr::pivot_longer(Planting.Begin:Harvest.End, names_to="period") %>% 
  tidyr::separate(period, c("Type","Event")) %>% 
  tidyr::pivot_wider(names_from=Event, values_from=value)


#    Region      Crop    Type     Begin   End
#    <chr>       <fct>   <chr>    <int> <int>
#  1 Center-West Soybean Planting   245   275
#  2 Center-West Soybean Harvest      1    92
#  3 Center-West Corn    Planting   245   336
#  4 Center-West Corn    Harvest     32   153
#  5 South       Soybean Planting   245     1
#  ...

这里有点混乱的部分是,我们对
y
使用离散比例,但是
geom\u rect
更喜欢数值,因此,由于现在的值是因子,我们使用因子的数值来创建ymin和ymax位置。然后我们需要用因子级别的名称替换y轴

如果您还想在
x
轴上获取月份名称,可以执行以下操作

dateticks <- seq.Date(as.Date("2020-01-01"), as.Date("2020-12-01"),by="month")
# then add this to you plot
  ... + 
    scale_x_continuous(breaks=lubridate::yday(dateticks),
                       labels=lubridate::month(dateticks, label=TRUE, abbr=TRUE))

dateticks Hi OP-您能分享数据集吗,
m
请?如果它不是太大(@chemdork123,谢谢你的评论,但是…数据都有问题。
m
只是
mydat
的“融化”版本。你不能运行代码吗?哦,我明白了…你有
“\”
分隔数据。
dateticks <- seq.Date(as.Date("2020-01-01"), as.Date("2020-12-01"),by="month")
# then add this to you plot
  ... + 
    scale_x_continuous(breaks=lubridate::yday(dateticks),
                       labels=lubridate::month(dateticks, label=TRUE, abbr=TRUE))