X ограничивает непрерывными символьными значениями в R ggplot - PullRequest
0 голосов
/ 27 марта 2020

Я создаю гистограмму с непрерывными x-метками «Финансовые годы», например «2009/10», «2010/11» и др. c. В моем наборе данных есть столбец с указанным c финансовым годом, с которого я хотел бы начать метки x (см. Пример изображения ниже). Затем я хотел бы, чтобы x-метки были в каждом непрерывном финансовом году до настоящего времени. Последний x-label должен быть «2018/19». Когда я пытаюсь установить пределы с помощью scale_x_continuous, я получаю сообщение об ошибке Error: Discrete value supplied to continuous scale. Однако, если я использую «scale_x_discrete», я получаю график только с двумя барами: выбранная дата «Начало» и «Конец» 2018/19.

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_start равен NULL.

enter image description here

1 Ответ

1 голос
/ 27 марта 2020

В 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()

enter image description here

Отвечает ли он на ваш вопрос?

...