Как получить вертикальную линию на графике точечных полярных координат в R с помощью ggplot2

У меня два вопроса:

  1. Надеюсь, это простой вопрос, но я хочу провести вертикальную линию на моем графике полярных координат, обозначающую начало данных. У меня есть набор данных, который собирает почасовые показания в течение года, и мне удалось (с помощью) получить полярный график, который я хотел. Мои данные находятся в формате (x = yyyy-mm-dd HH:MM:SS и y = числовое значение). Я повернул начало координат так, чтобы начало не было вертикальным (мне нужно сохранить это вращение). Итак, чтобы обозначить, где данные начинаются и заканчиваются в течение года, я хотел бы добавить вертикальную линию (см. Изображение ниже).

  2. Если это невозможно, можно ли вставить пустое пространство между датами начала и окончания, чтобы оставить пробел в данных, как визуальное представление времени начала и окончания?

Вот мой текущий пример набора данных и кода:

library(lubridate) #make an example dataset
NoOfHours <- as.numeric(ymd_hms("2019-6-1 17:00:00") - ymd_hms("2018-3-01 8:00:00"))*24 
data <- as.data.frame(ymd_hms("2018-3-01 8:00:00") + hours(0:NoOfHours))
colnames(data) <- 'date' 
set.seed(10)
data$level <- runif(nrow(data), min = 0, max = 250)

library(openair)
yeardata <- selectByDate(data, start = "2018-3-1", end = "2019-2-28", year = 2018:2019)

library(ggplot2)

plot <- ggplot(yeardata, aes(x=date, y=level, color = level)) +
  geom_hline(yintercept = seq(0, 300, by = 50), colour = "black", size = 0.75, alpha = 0.3)+ #make my own gridlines so that when on a white background, the gridlines wont cross the text.
  geom_vline(xintercept = as.POSIXct(data$date[1], origin = "1970-01-01 00:00:00 UTC"), colour = "black", size = 0.75, alpha = 0.3, )+
  scale_color_gradient(limits = c(0,200), low="green", high="red", oob = scales::squish)+ #need oob = scales::squish to get values over 200 to be red.
    geom_jitter(alpha = 0.2, size = 2) +# Use a slightly darker palette than normal
 theme(axis.title=element_text(size=16,face="bold"), axis.text.x = element_text(size = 16), axis.text.y = element_text(size = 12))+
   labs(x = NULL, y = bquote('Levels '~(m^2)), color = "Level")+ #bquote to allow superscripts
  scale_y_continuous(breaks = seq(0, 300, 50),
                     limits = c(-100,310))
plot
plot + coord_polar(start = ((2*60/365)*pi))+ #need to have the number of radians to get my start position. If march 1st is the start date, then 60 days have past since Jan 1.
  theme(legend.title = element_text(color = "black", size = 14, face = "bold"), panel.background = element_rect(fill = "white"), panel.grid  = element_blank())

Я могу получить нормальный график рассеяния с вертикальной линией там, где я хочу (в начале набора данных), которая выглядит следующим образом: диаграмма рассеяния

но когда я пытаюсь поместить это в полярные координаты, я получаю эту ошибку:

"Ошибка в as.POSIXct.numeric(значение): необходимо указать origin" "

Я попытался предоставить источник в нескольких форматах, последний из которых показан в приведенном выше коде. В идеале график должен выглядеть примерно так:идеальный сюжет

Любая помощь будет оценена.

Благодарность

2 ответа

Решение

Вот способ добавления строковых и текстовых меток. Похоже, что непреднамеренное последствие добавления первой текстовой аннотации с x до первой даты создает пробел, как вы просили в #2. Но недостатком является то, что он немного изменяет вращение разрывов, что может потребовать дополнительной регулировкиcoord_polar(start = срок.

 ggplot(yeardata, aes(x=date, y=level, color = level)) +
   geom_hline(yintercept = seq(0, 300, by = 50), colour = "black", size = 0.75, alpha = 0.3)+ 
   # this annotation layer is drawn over the gridlines, but under the points
   annotate("segment",x = ymd_hms(data$date[1]), xend = ymd_hms(data$date[1]),
                      y = 0, yend = 310, colour = "black", size = 0.75, alpha = 0.3) +


  scale_color_gradient(limits = c(0,200), low="green", high="red", oob = scales::squish)+       
  geom_jitter(alpha = 0.2, size = 2) +# Use a slightly darker palette than normal

  # this text is prior to existing x data and creates a gap
  annotate("text", label = "my text", x = ymd_hms(data$date[1]) - ddays(5), 
            y = 300, angle = 0) +
  annotate("text", label = "my text2", x = ymd_hms(data$date[1]) + ddays(5), 
            y = 300, angle = 0) +
  theme(axis.title=element_text(size=16,face="bold"), axis.text.x = element_text(size = 16), axis.text.y = element_text(size = 12))+
  labs(x = NULL, y = bquote('Levels '~(m^2)), color = "Level")+ #bquote to allow superscripts
  scale_y_continuous(breaks = seq(0, 300, 50),
                     limits = c(-100,310))+
  coord_polar(start = ((2*60/365)*pi))+      
  theme(legend.title = element_text(color = "black", size = 14, face = "bold"),   
        panel.background = element_rect(fill = "white"), 
        panel.grid  = element_blank())

Я не могу опубликовать исправленный код, потому что библиотека openair не загружается в моей системе, но причина, по которой вы получили эту ошибку:

"Ошибка в as.POSIXct.numeric(значение): необходимо указать origin" "

это потому, что вы пытаетесь использовать vlines перед добавлением данных. Без данных, которые уже есть на графике, система не может понять, как провести на нем линии. В большинстве случаев это не имеет значения, и я изо всех сил пытаюсь найти ссылку, которая объясняет мне это, но ggplot2 имеет некоторую зависимость от порядка, в котором объекты добавляются к графику, особенно для использования vline с датой на ось x.

Другие вопросы по тегам