R ggplot中具有连续字符值的X限制

X limits with continuous character values in R ggplot

我正在创建一个带有 'Fiscal Years' 连续 x 标签的条形图,例如“2009/10”、“2010/11”等。我的数据集中有一列包含特定的财政年度我希望 x 标签开始的年份(参见下面的示例图片)。然后,我希望 x 标签是每个连续的财政年度,直到现在。最后一个 x-label 应该是“2018/19”。当我尝试使用 scale_x_continuous 设置限制时,我收到 Error: Discrete value supplied to continuous scale 错误。但是,如果我使用 'scale_x_discrete',我得到的图表只有两个条:我选择的 "Start" 日期和 2018/19 的 "End"。

Start<-Project_x$Start[c(1)]
End<-"2018/2019"

ggplot(Project_x, (aes(x=`FY`, y=Amount)), na.rm=TRUE)+
geom_bar(stat="identity", position="stack")+
scale_x_continuous(limits = c(Start,End))

` Error: Discrete value supplied to continuous scale `

谢谢。

我的数据是:

df <- data.frame(Project = c(5, 6, 5, 5, 9, 5), 
             FY = c("2010/11","2017/18","2012/13","2011/12","2003/04","2000/01"),
             Start=c("2010/11", "2011/12", "2010/11", "2010/11", "2001/02", "2010/11"),
             Amount = c(500,502,788,100,78,NA))

要使用下面答案中的代码,我需要将我的 Start_Year 基于我的 Start 列而不是 FY 列,并且图表应该仅用于项目#5。

as.tibble(df) %>% 
mutate(Start_Year = as.numeric(sub("/\d{2}","",Start)))
xlabel_start<-subset(df$Start_Year, Project == 5)
xlabel_end<-2018
filter(between(Start_Year,xlabel_start,xlabel_end)) %>%
  ggplot(aes(x = FY, y = Amount))+
  geom_col()

当运行这个的时候,我的xlabel_startNULL

ggplot中,continuous专用于数值。在这里,您的财政年度是字符(或因子)格式,因此它们被视为 discrete 值,并按 ggplot2.

的字母顺序排序

获得预期图表的一种可能解决方案是创建一个包含会计年度起始年份的新变量,并筛选 2010 年至 2018 年之间的值。

但首先,我们要通过创建一个新的数据框来隔离项目和感兴趣的起始年份:

library(dplyr)

xlabel_start <- as.tibble(df) %>% 
  mutate(Start_Year = as.numeric(sub("/\d{2}","",Start))) %>%
  distinct(Project, Start_Year) %>%
  filter(Project == 5)

# A tibble: 1 x 2
  Project Start_Year
    <dbl>      <dbl>
1       5       2010

现在,使用几乎相同的管道,我们可以通过以下方式隔离感兴趣的值 正在做:

library(tidyverse)

as.tibble(df) %>% 
  mutate(Year = as.numeric(sub("/\d{2}","",FY))) %>%
  filter(Project == 5 & between(Year,xlabel_start$Start_Year,xlabel_end))

# A tibble: 3 x 5
  Project FY      Start   Amount  Year
    <dbl> <fct>   <fct>    <dbl> <dbl>
1       5 2010/11 2010/11    500  2010
2       5 2012/13 2010/11    788  2012
3       5 2011/12 2010/11    100  2011

完成此操作后,您可以简单地在此管道序列的末尾添加 ggplot 绘图部分:

library(tidyverse)

as.tibble(df) %>% 
  mutate(Year = as.numeric(sub("/\d{2}","",FY))) %>%
  filter(Project == 5 & between(Year,xlabel_start$Start_Year,xlabel_end)) #%>%
  ggplot(aes(x = FY, y = Amount))+
  geom_col()

它能回答您的问题吗?