【发布时间】:2021-07-01 14:41:44
【问题描述】:
我对 R 相当陌生,并且已经广泛搜索 StackOverflow 以寻找解决此问题的方法,但我还不够。我目前正在绘制太阳熊的估计出生日期,并且我希望我的情节在 x 轴上只有 2014 年 4 月至 2015 年 3 月这几个月。我的大部分数据都符合这个要求,但我有一个值,它有一个从 3 月开始到 5 月结束的错误栏(Figure 1)。当我绘制这个时,错误栏要么消失,要么延伸到整个情节(Figure 2)。我想把它包裹起来,这样当错误栏出现在图的右侧时,它就会出现在 2014 年 4 月所在的左侧。具体年份无关紧要(这些值来自许多不同的年份),但任意指定年份是我发现将它们全部放在 x 轴上有一年的图上的最简单方法。任何帮助将不胜感激!
我的代码如下:
##Import Excel Data
require(xlsx)
require(modeest)
require(ggplot2)
require(ggpubr)
library(scales)
BirthDates300 <- read.xlsx("C:/Users/ZackA/OneDrive - Old Dominion University/frombox/ODU/Sun Bear Weight/Data/data_zd.xlsx", 7)
#Combine Day Month and Year into Date
BirthDates300$MinDate<-as.Date(with(BirthDates300,paste(MinYear,MinMonth,MinDay,sep="-")),"%Y-%m-%d")
BirthDates300$MeanDate<-as.Date(with(BirthDates300,paste(MeanYear,MeanMonth,MeanDay,sep="-")),"%Y-%m-%d")
BirthDates300$MaxDate<-as.Date(with(BirthDates300,paste(MaxYear,MaxMonth,MaxDay,sep="-")),"%Y-%m-%d")
BirthDates300$IndDate<-as.Date(with(BirthDates300,paste(IndYear,IndMonth,IndDay,sep="-")),"%Y-%m-%d")
#Remove unnecessary row 17
BirthDates300 <- BirthDates300[-c(17), ]
#Plotting Range of Birth Dates 300
BirthDatesRange300 <- ggplot()+
geom_errorbar(data=BirthDates300, mapping=aes(x=MeanDate, xmin=MinDate, xmax=MaxDate, y=CRN),
width=0.4, size=1, color="black") +
geom_point(data=BirthDates300, mapping=aes(x=MeanDate, y=CRN, shape=Sex,), size=4,) +
geom_point(data=BirthDates300, mapping=aes(x=IndDate, y=CRN, shape=Sex), color="grey", size=4,)+
labs(title="Sun Bear Estimated Birth Date", subtitle="Assuming 300g at birth")+
scale_x_date(date_labels="%b",date_breaks ="1 month",
limits = as.Date(c('2014-03-25','2015-03-01')))+
scale_y_discrete(limits= c("060-2004", "157-2012", "158-2012", "167-2012", "169-2013",
"202-2017", "207-2019", " ", "002-1999", "058-2004", "073-2006",
"076-2006", "077-2005", "080-2006", "081-2006", "083-2006",
"088-2006", "091-2006", "107-2007", "150-2010", "152-2011",
"159-2011", "161-2012", "163-2012", "171-2013", "172-2013",
"180-2014", "181-2014", "183-2014", "186-2015", "187-2015",
"193-2016", "196-2016", "204-2018"))+
theme(plot.title = element_text(size=16, face="bold", hjust = 0.5),
plot.subtitle=element_text(size=10, hjust=0.5),
axis.ticks.y = element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
axis.text.x = element_text(face="bold", color="black", size=13, vjust=-0.01),
axis.text.y = element_text(face="bold", color="black", size=10, angle=0),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black"),
panel.border = element_rect(colour = "black", fill=NA, size=0.5),
legend.title = element_text(size=15),
plot.margin = margin(10, 10, 15, 10))+
geom_hline(yintercept=" ", linetype='dotted', col = 'grey', size=1.5)
BirthDatesRange300
【问题讨论】:
-
嗨!您能否分享您的数据集,以便我们尝试复制您的问题?我的猜测是,通过使用
scale_x_date,您将删除范围之外的点(这是此函数工作的标准方式)。如果您想限制 x 范围而不丢弃此范围之外的数据,则需要使用不同的函数,例如coord_cartesian带有一些特殊参数或tidyquant::coord_dates(这是我刚在网上找到的一个包)。 -
嗨困惑,欢迎来到 Stack Overflow。通过 1) 可重复的数据样本和 2) 注释您希望最终结果的外观,可以大大改善这个问题。对于 1,如果您的数据非常大,请edit 使用
dput(BirthDates300)或dput(head(BirthDates300))输出您的问题。请参阅How to make a great R reproducible example 了解更多信息。 -
@ConfusedPhDStudent 我认为这将极具挑战性。几天后我会提醒自己悬赏这个问题。
-
“hacky”方法是将数据集复制两次,一次加一年,一次减一年,这样你就有了三个系列的副本。然后,当您绘制所有这些时,您可以放大到所需的子集,但仍然会出现来自环绕的工件。
-
@Brian 我怀疑这与作者提出的问题一样接近。如果您不打算这样做,我可以发布一个答案。