Stick Plot для данных о скорости и направлении ветра в ggplot - PullRequest
0 голосов
/ 19 октября 2018

Я бы хотел построить график для данных скорости / направления ветра, подобный этому:

https://www.researchgate.net/figure/Stick-plot-of-mean-daily-wind-speed-and-direction-measured-at-Valentia-Island-from_fig5_226577448

enter image description here

Я нашел хороший график в превосходном пакете oce, но я бы хотел сделать такой же график, используя ggplot (или plotley).

WindSpeed<-c(1,2,3,5,7,2,3,4,5,6,7,8)
WindDir<-c(180,90,320,200,350,10,270,50,9,100,110,129)
TimeStamp<-c("2018-01-02 01:00","2018-01-02 02:00","2018-01-02 03:00","2018-01-02 04:00","2018-01-02 05:00","2018-01-02 06:00","2018-01-02 07:00","2018-01-02 08:00","2018-01-02 09:00","2018-01-02 10:00","2018-01-02 11:00","2018-01-02 12:00")

DF<-data.frame(TimeStamp,WindSpeed, WindDir)

Приведенные выше данные о направлении ветра находятся вединицы направления компаса (направление компаса, из которого дует ветер), поэтому я хотел бы, чтобы данные 180 указывали прямо вверх, а данные 270 указывали прямо вправо (AKA, приходящий с запада и дующий с востока).

1 Ответ

0 голосов
/ 26 октября 2018

Код Джона Спринга работает.Я проверю (с немного другими данными) и покажу вывод с его кодом.

Немного другие данные, с разными WindDir, чтобы выделить диагонали (и 30 с):

WindSpeed<-c(1,2,3,5,7,2,3,4,5,6,7,8)
WindDir <- c(0, 30, 45, 60, 90, 120, 135, 150, 180, 225, 270, 315)
TimeStamp<-c("2018-01-02 01:00","2018-01-02 02:00","2018-01-02 03:00","2018-01-02 04:00","2018-01-02 05:00","2018-01-02 06:00","2018-01-02 07:00","2018-01-02 08:00","2018-01-02 09:00","2018-01-02 10:00","2018-01-02 11:00","2018-01-02 12:00")
DF<-data.frame(TimeStamp,WindSpeed, WindDir)
DF$TimeStamp <- as.POSIXct(DF$TimeStamp)

Для большей ясности я дополнил код Джона для концов стрелок, начальных точек и цвета (сгруппированы наивно).

ggplot(DF) +
  geom_segment(aes(x = TimeStamp,
                   y = 0,
                   xend = TimeStamp + lubridate::dhours(WindSpeed * 1 * -cos((90-WindDir) / 360 * 2 * pi)),
                   yend = WindSpeed * 1 * -sin((90-WindDir) / 360 * 2 * pi),
                   col = factor(TimeStamp)
                   ),
               arrow = arrow(length = unit(0.5, "cm")) ) +
  geom_point(aes(TimeStamp, 0), size = 1) +
  coord_fixed(3600) +
  theme(legend.position = "none")

sample wind-dir plot with modified wind direction

Iдумаю, что это ясно показывает 45-е как хорошие, особенно последние, попавшие в линии сетки.

Используя ваши данные и этот код:

WindSpeed<-c(1,2,3,5,7,2,3,4,5,6,7,8)
WindDir<-c(180,90,320,200,350,10,270,50,9,100,110,129)
TimeStamp<-c("2018-01-02 01:00","2018-01-02 02:00","2018-01-02 03:00","2018-01-02 04:00","2018-01-02 05:00","2018-01-02 06:00","2018-01-02 07:00","2018-01-02 08:00","2018-01-02 09:00","2018-01-02 10:00","2018-01-02 11:00","2018-01-02 12:00")
DF<-data.frame(TimeStamp,WindSpeed, WindDir)
DF$TimeStamp <- as.POSIXct(DF$TimeStamp)

представляет:

sample windplot with original data

...