Почему выполнение той же функции аннотации в ggplot2 работает для других, но выдает ошибку для меня (эстетическая длина)? - PullRequest
1 голос
/ 26 сентября 2019

Я создал график, используя ggplot2, который работал изначально.Ничего не меняя, он перестал работать для меня, выдав ошибку: «Эстетика должна быть либо длины 1, либо такой же, как data (9): label».Тем не менее, мои коллеги запускают мой код в своих системах, и он работает отлично.Что может вызвать это?У всех нас установлена ​​почти одинаковая версия или R, RStudio, ggplot2 и tidyverse.

Я попытался вызвать библиотеку ggplot2 до и после вызова библиотеки tidyverse, чтобы выяснить, возможно, это было несовпадение версий,Я удалил все свои пакеты и переустановил их.Я удалил R и переустановил R. Он никогда не работает для меня и всегда работает для них.

У меня ggplot2 версии 3.2.0 и у них ggplot2 версии 3.1.1.Сайт https://github.com/tidyverse/ggplot2/releases говорит, что версия 3.2.0 «исправила» проблему, которая, возможно, позволила сотрудникам с 3.1.1 запускать код, даже если он не должен был выполняться;это подразумевает, что в моем коде есть что-то неправильное, что каким-то образом предыдущие версии 3.1.1 могли работать случайно.Вот строка в версии 3.2.0, которая выглядела релевантной:

"В некоторых случаях ggplot2 теперь выдает предупреждение или ошибка для кода, который ранее производил вывод графика .Во всех этих случаях предыдущий вывод графика был случайным, и код построения использовал API ggplot2 таким образом, что это привело бы к неопределенному поведению. Примеры включают ... аннотации для нескольких аспектов (# 3305) ... ")

Так что это либо проблема с настройками моего программного обеспечения или пакета, либо мой код неверен.Есть мысли?

Это все библиотеки, которые я называю:

library(tidyverse)
library(lubridate)
library(readxl)
library(reshape2)
library(scales)
library(plotly)
library(extrafont)

Вот что печатает консоль, когда я запускаю библиотеку (tidyverse):

library(tidyverse)
Registered S3 methods overwritten by 'ggplot2':
  method         from 
  [.quosures     rlang
  c.quosures     rlang
  print.quosures rlang
-- Attaching packages --------------------------------------- tidyverse 1.2.1 --
v ggplot2 3.2.0       v purrr   0.3.2  
v tibble  2.1.1       v dplyr   0.8.0.1
v tidyr   0.8.3       v stringr 1.4.0  
v readr   1.3.1       v forcats 0.4.0  
-- Conflicts ------------------------------------------ 
tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()

Здесьвся таблица, которую я превращаю в график:

  Component_ProgramItem    task        ProjectedEndDate_6_30_18    date.type  task.date
1 Citywide Programs        Original    2019-12-31                  end        2012-08-30
2 Neighborhood Parks       Original    2016-01-27                  end        2013-03-31
3 Waterfront Parks         Original    2019-12-31                  end        2015-02-28
4 Neighborhood Parks       Updated     2016-01-27                  end        2016-01-27
5 Citywide Programs        Updated     2019-12-31                  end 2020-03-31
6 Waterfront Parks         Updated     2019-12-31                  end 2020-04-30
7 Citywide Programs        Original    2019-12-31                  start      2008-08-28
8 Neighborhood Parks       Original    2016-01-27                  start      2008-08-28
9 Waterfront Parks         Original    2019-12-31                  start        2008-08-28
10 Citywide Programs       Updated     2019-12-31                  start        2012-08-30
11 Neighborhood Parks      Updated     2016-01-27                  start        2013-03-31
12 Waterfront Parks        Updated     2019-12-31                  start        2015-02-28

Вот код, который я использую, чтобы превратить его в график:

#6 Create ggplot schedule
#order of "label=c("label name...", Label name 2...", ) is alphabetical
ggplot(csnp2008.sched.long, aes(x=task, y=task.date, colour=task)) + 
  geom_line(size=70, show.legend = FALSE) + 
  scale_color_manual(values = c("#fadd9d", "#ffc000")) +
  scale_fill_manual(values = c("#fadd9d", "#ffc000")) +
  labs(x=NULL, y=NULL) + 
  scale_y_date(breaks = "1 year", date_minor_breaks = "1 year", date_labels = "%b-%Y") +
  #guides(fill=guide_legend(title=NULL, reverse=TRUE)) +
  geom_hline(data = csnp2008.sched.long, aes(yintercept=ProjectedEndDate_6_30_18), 
             color = "#7f7f7f", size = 1, linetype = "dashed") +
  annotate("text", x="task", y=as.Date("2008-10-30"),
          label=c("Citywide Programs",
                   "Neighborhood Parks",
                  "Waterfront Parks"),
          size = 3.75, hjust = "left", family = "Segoe UI Semilight") +
  #facet_grid(Component~., switch = "y", labeller = labeller(Component = label_wrap_gen(10))) + 
  facet_grid(Component_ProgramItem~., switch = "y", scales = "free", space = "free") +
  theme_gantt() + theme(axis.text.x=element_text(angle=45, hjust=1, size = 9, 
                        family = "Segoe UI Semilight"),
                        axis.line.x = element_line(color= "#e7e5e6"),
                        axis.ticks.x = element_line (color = "#7f7f7f"),
                        axis.title=element_blank(),
                        axis.text.y = element_blank(),
                        strip.text = element_blank())+
  coord_flip() 

Этот раздел не будет запускатьсякода для меня, выбрасывая ошибку после функции аннотации: «Эстетика должна быть либо длина 1 или совпадает с data (9): label».Тем не менее, он отлично работает для всех остальных и возвращает правильный график для них без сообщений об ошибках.

Это проблема программного обеспечения?Или проблема с кодом?

PS Я не буду прикреплять изображение окончательного графика, потому что это не очень важно, я не думаю.Но если вам это нужно, я могу.

PPS вот код для воссоздания:

df2 <- structure(
                list(
                    Component_ProgramItem = c("Citywide Programs","Citywide Programs","Citywide Programs","Citywide Programs", "Neighborhood Parks","Neighborhood Parks","Neighborhood Parks","Neighborhood Parks","Waterfront Parks","Waterfront Parks","Waterfront Parks","Waterfront Parks"), 
                    task = c("Original Schedule","Updated Schedule","Original Schedule","Updated Schedule","Original Schedule","Updated Schedule","Original Schedule","Updated Schedule","Original Schedule","Updated Schedule","Original Schedule","Updated Schedule"),
                    ProjectedEndDate_6_30_18 = c("2019-12-31","2019-12-31","2019-12-31","2019-12-31","2016-01-27","2016-01-27","2016-01-27","2016-01-27","2019-12-31","2019-12-31","2019-12-31","2019-12-31"),
                    data.type = c("end", "end", "start", "start","end", "end", "start", "start","end", "end", "start", "start"),
                    task.date = c("2012-08-30","2020-03-31","2008-08-28","2012-08-30","2013-03-31","2016-01-27","2008-08-28","2013-03-31","2015-02-28","2020-04-30","2008-08-28","2015-02-28")), 
                    .Names = c("Component_ProgramItem", "task", "ProjectedEndDate_6_30_18", "data.type", "task.date"), 
                    row.names = c(NA, 12L), 
                    class = "data.frame")

1 Ответ

0 голосов
/ 26 сентября 2019

Функция аннотирования должна быть снабжена векторами входных данных (x, y, метка), и эти векторы должны иметь ту же длину, что и данные (т. Е. 9 строк).Я думаю, что было бы лучше использовать geom_text, поместив аннотации в ваш фрейм данных.

library(tidyverse)
library(lubridate)
library(readxl)
library(reshape2)
library(scales)
library(plotly)
library(extrafont)

csnp2008.sched.long <- structure(list(
        Component_ProgramItem = c("Citywide Programs","Citywide Programs","Citywide Programs","Citywide Programs", "Neighborhood Parks","Neighborhood Parks","Neighborhood Parks","Neighborhood Parks","Waterfront Parks","Waterfront Parks","Waterfront Parks","Waterfront Parks"),
        task = c("Original Schedule","Updated Schedule","Original Schedule","Updated Schedule","Original Schedule","Updated Schedule","Original Schedule","Updated Schedule","Original Schedule","Updated Schedule","Original Schedule","Updated Schedule"),
        ProjectedEndDate_6_30_18 = c("2019-12-31","2019-12-31","2019-12-31","2019-12-31","2016-01-27","2016-01-27","2016-01-27","2016-01-27","2019-12-31","2019-12-31","2019-12-31","2019-12-31"),
        data.type = c("end", "end", "start", "start","end", "end", "start", "start","end", "end", "start", "start"),
        task.date = c("2012-08-30","2020-03-31","2008-08-28","2012-08-30","2013-03-31","2016-01-27","2008-08-28","2013-03-31","2015-02-28","2020-04-30","2008-08-28","2015-02-28")),
    .Names = c("Component_ProgramItem", "task", "ProjectedEndDate_6_30_18", "data.type", "task.date"),
    row.names = c(NA, 12L),
    class = "data.frame")

# convert strings to dates
csnp2008.sched.long <- csnp2008.sched.long %>%
    mutate(
        ProjectedEndDate_6_30_18 = as.Date(ProjectedEndDate_6_30_18, "%Y-%m-%d"),
        task.date = as.Date(task.date, "%Y-%m-%d")
    )

#6 Create ggplot schedule
#order of "label=c("label name...", Label name 2...", ) is alphabetical
ggplot(csnp2008.sched.long, aes(x=task, y=task.date, colour=task)) +
    geom_line(size=70, show.legend = FALSE) +
    scale_color_manual(values = c("#fadd9d", "#ffc000")) +
    scale_fill_manual(values = c("#fadd9d", "#ffc000")) +
    labs(x=NULL, y=NULL) +
    scale_y_date(breaks = "1 year", date_minor_breaks = "1 year", date_labels = "%b-%Y") +
    #guides(fill=guide_legend(title=NULL, reverse=TRUE)) +
    geom_hline(data = csnp2008.sched.long, aes(yintercept=ProjectedEndDate_6_30_18),
               color = "#7f7f7f", size = 1, linetype = "dashed") +
    # annotate("text",
    #        x=c("task","task","task"),
    #        y=as.Date(c("2008-10-30","2008-11-30","2008-12-30"), "%Y-%m-%d"),
    #        label=c("Citywide Programs",
    #               "Neighborhood Parks",
    #               "Waterfront Parks"),
    #        size = 3.75, hjust = "left", family = "Segoe UI Semilight") +
    #facet_grid(Component~., switch = "y", labeller = labeller(Component = label_wrap_gen(10))) +
    facet_grid(Component_ProgramItem~., switch = "y", scales = "free", space = "free") +
    # theme_gantt() + theme(axis.text.x=element_text(angle=45, hjust=1, size = 9,
    #                                              family = "Segoe UI Semilight"),
    #                     axis.line.x = element_line(color= "#e7e5e6"),
    #                     axis.ticks.x = element_line (color = "#7f7f7f"),
    #                     axis.title=element_blank(),
    #                     axis.text.y = element_blank(),
    #                     strip.text = element_blank())+
    coord_flip()

Создано в 2019-09-26 Представить пакет (v0.3.0)

...