将日期标签添加到条形图

Adding date labels to barplot

我正在尝试为我绘制的每个单独的条形图添加日期标签。数据如下所示:

    structure(list(lakeID = c("WE1", "WE1", "WE1", "WE1", "WE1", 
"WE1", "WE1", "WE1", "WE1", "WE1"), depth = c("hypolimnion", 
"hypolimnion", "hypolimnion", "hypolimnion", "hypolimnion", "hypolimnion", 
"hypolimnion", "hypolimnion", "hypolimnion", "hypolimnion"), 
    date = structure(c(1505779200, 1529366400, 1534723200, 1537142400, 
    1559088000, 1590624000, 1592352000, 1596153600, 1597881600, 
    1599696000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    year = c(2017L, 2018L, 2018L, 2018L, 2019L, 2020L, 2020L, 
    2020L, 2020L, 2020L), BACI = c("Control", "Control", "Control", 
    "Control", "Impact", "Impact", "Impact", "Impact", "Impact", 
    "Impact"), N = c(2L, 2L, 1L, 1L, 7L, 56L, 10L, 58L, 3L, 2L
    ), meanlengths = c(1.44092870850016, 1.90413253399558, 2.08356379729054, 
    1.24630120343851, 6.39410976055929, 6.07576588787627, 5.63215818993585, 
    6.00116183368038, 5.42957068546558, 3.62096915399567), sd = c(0.261562571663927, 
    0.237860661401758, NA, NA, 0.454442531596122, 0.703831022329251, 
    0.465831548164042, 1.1448481521142, 1.19135665831808, 1.41507359493585
    ), SE = c(0.184952668128155, 0.1681928866547, NA, NA, 0.171763131967707, 
    0.0940533765621035, 0.14730886981608, 0.150325927020161, 
    0.687830087380796, 1.00060813485716), Upper2SE = c(1.80343593803135, 
    2.23379059183879, NA, NA, 6.73076549921599, 6.26011050593799, 
    5.92088357477536, 6.2958006506399, 6.77771765673194, 5.58216109831572
    ), Lower2SE = c(1.07842147896898, 1.57447447615237, NA, NA, 
    6.05745402190258, 5.89142126981455, 5.34343280509633, 5.70652301672087, 
    4.08142371419922, 1.65977720967563)), row.names = 22:31, class = "data.frame")

我试图用这段代码绘制日期,但无法让它们显示:

xxx <- barplot(ChiSum$meanlength, axisnames=TRUE, beside = TRUE, names.arg=c(ChiSum$date), col=ifelse(ChiSum$BACI=="Control",'white','gray'), ylim = c(-0.01,8), ylab = "Mean body length",
               xlab="Date",xaxt="n")
arrows(xxx,ChiSum$Lower2SE,xxx,ChiSum$Upper2SE, code=3, length=0.02, angle = 90,
       col=ifelse(ChiSum$BACI=="Control",'black','black'))
axis(side=1,at=XXX[c(1,20)], labels=format(ChiSum$date))

这个怎么样:

bar_mids <- cumsum(c(.7, rep(1.2,9)))
par(mar=c(8,4,2,1)+.1)
xxx <- barplot(ChiSum$meanlength, axisnames=TRUE, beside = TRUE, names.arg=c(ChiSum$date), col=ifelse(ChiSum$BACI=="Control",'white','gray'), ylim = c(-0.01,8), ylab = "Mean body length",
               xlab="",xaxt="n")
arrows(xxx,ChiSum$Lower2SE,xxx,ChiSum$Upper2SE, code=3, length=0.02, angle = 90,
       col=ifelse(ChiSum$BACI=="Control",'black','black'))
axis(side=1,at=bar_mids, labels=format(ChiSum$date), las=2)

关键是要知道柱状图 mid-points 在哪里。默认设置是条形 one-unit 宽,space(每个条形之前)为 0.2。所以第一个柱的 mid-point 是 0.7。第二个柱的 mid-point 是 0.7 + 1.2,第三个柱的 mid-point 是 0.7 + 1.2*2,等等...这些 mid-points 应该指定为 at然后您可以使用日期作为标签。为了使它们更好地绘制,您可以使用 las=2 使标签垂直于轴。

你也可以用 ggplot2:

ChiSum %>% 
  arrange(date) %>% 
  mutate(obs = 1:n()) %>% 
ggplot(aes(x=obs, y=meanlengths, ymin = Lower2SE, ymax=Upper2SE, fill=BACI)) + 
  geom_bar(stat="identity", col="black") + 
  geom_errorbar(width=.15) + 
  scale_x_continuous(breaks=1:10, labels=ChiSum$date) + 
  theme_classic() + 
  theme(axis.text.x = element_text(angle=45, hjust=1), 
        legend.position = c(.15, .85)) + 
  labs(x="", y="Mean Length") + 
  scale_fill_manual(values=c("white", "gray50"))