сюжет серии ggplot2 времени с цветными стрелками направлении ветра

Добрый день,

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

enter image description here

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

предыдущий аналогичный пост: ggplot2 ветер временных рядов со стрелками / векторами

коды, которые я собрал до сих пор, следующие:

require(ggplot2)
require(scales)
require(gridExtra)
require(lubridate)

dat <- data.frame(datetime = ISOdatetime(2013,08,04,0,0,0) +
                     seq(0:23)*60*60, pollutant = runif(24, 25, 75))

## create wind speed data
dat$ws <- runif(nrow(dat), 0 , 15 )

## create wind direction data
dat$wd <- runif(nrow(dat), 0 , 360 )

# define an end point for geom_segment
dat$x.end <- dat$datetime + minutes(60)

ggplot(data = dat, aes(x = datetime, y = pollutant)) +
  geom_line() +
  geom_segment(data = dat,
               size = 1,
               aes(x = datetime,
                   xend = x.end,
                   y = pollutant,
                   yend = wd),
               arrow = arrow(length = unit(0.5, "cm"))) +
  theme()

используя приведенный выше код, я получаю следующий сюжет: enter image description here

Как вы можете видеть, сюжет начинает стрелку, где я хотел бы начать, но направление и конечная точка слишком длинные, и я не уверен, как я могу масштабировать это, чтобы быть короче стрелка с цветом, закодированным для скорости. Я был бы очень признателен за любое ваше руководство относительно того, как я могу достичь этого.

большое спасибо, Аян!--2-->

3 ответов


график, который вы показываете выше, не дает правильных направлений - например dat$wd[1] составляет около 190°, поэтому, если 0° соответствует горизонтальной стрелке вправо, 190° должно дать вам стрелку, указывающую влево и немного вниз.

чтобы получить стрелки с правильным направлением, вам нужно добавить Косинус и синус направления ветра в начальную точку вашей стрелки, чтобы определить ее конечную точку (см. код ниже). Трудной проблемой здесь является масштабирование стрелки в x-и y-направлении потому что (1) эти оси находятся в совершенно разных масштабах, поэтому "длина" стрелки ничего не может означать, и (2) соотношение сторон вашего устройства построения будет искажать визуальные длины стрелок.

Я разместил эскиз решения ниже, где я масштабирую смещение стрелки в направлении x и y на 10% диапазона переменных, используемых для построения, но это не дает векторов равномерной визуальной длины. В любом случае, длина этих стрелок не вполне определена, потому что, опять же, (a) оси x и y представляют разные единицы измерения и (b) изменение соотношения сторон графика изменит длину этих стрелок.

## arrows go from  (datetime, pollutant) to
##                 (datetime, pollutant) + scaling*(sin(wd), cos(wd))
scaling <- c(as.numeric(diff(range(dat$datetime)))*60*60, # convert to seconds 
                    diff(range(dat$pollutant)))/10
dat <- within(dat, {
    x.end <- datetime  + scaling[1] * cos(wd / 180 * pi)
    y.end <- pollutant + scaling[2] * sin(wd / 180 * pi)
})


ggplot(data = dat, aes(x = datetime, y = pollutant)) +
    geom_line() +
    geom_segment(data = dat,
                 size = 1,
                 aes(x = datetime,
                     xend = x.end,
                     y = pollutant,
                     yend = y.end,
                     colour=ws),
                 arrow = arrow(length = unit(0.1, "cm"))) +
scale_colour_gradient(low="green", high="red") 

и изменение соотношения сторон приводит к путанице:


Это не завершено, но я надеюсь, что это будет началом для вас или кого-то еще. Правильно ли я понимаю следующее?

  1. начало стрелки x-это время
  2. стрелка начала y является загрязнителем
  3. длина стрелки-скорость ветра
  4. ориентация стрелки-направление
  5. цвет стрелки-скорость ветра

Если это так, одна недостающая часть преобразования из полярных координат в декартовы координирует. (например, http://www.engineeringtoolbox.com/converting-cartesian-polar-coordinates-d_1347.html)

система координат-это недостающая часть, которую я не понял. Этот график представляет собой смесь двух систем координат. Начальная точка стрелки основана на (время X загрязнитель). Но вектор-это полярная координата направления и скорости ветра. Предполагая, что соотношение сторон (время X) не равно 1, то ветерок с севера будет иметь другой длина чем 5knot ветер с юго-востока.

две вещи должны быть скорректированы для. Один из них-соотношение сторон (время X загрязнитель). Другой-физические измерения графика. Я не уверен, как справиться со вторым, поэтому я установил его на постоянное значение. Но представьте, что вам понадобится какой-то способ сделать это лучше-возможно, запросив какое-то базовое свойство сетки.

dat <- data.frame(
datetime = 0:100, 
#datetime = ISOdatetime(2013,08,04,0,0,0) + seq(0:23)*60*60, 
pollutant = 0 #Swap the next two lines for a nonuniform pollutant
#pollutant = runif(24, 25, 75)
)
## convert to a numeric variable
# dat$datetime <- 0
# dat$datetime <- as.numeric(dat$datetime)

#Adjust the aspect ratio
#   xrange <- range(dat$datetime)
xlimits <- c(-5, 100)
xrange <- diff(range(xlimits))
ylimits <- c(-5, 10)
yrange <- diff(range(ylimits))
aspectratio <- xrange/yrange

## create wind speed data
dat$ws <- 1
#   dat$ws <- runif(nrow(dat), 0, 15)

## create wind direction data
#dat$wd_degrees <- runif(nrow(dat), 0, 360)
dat$wd_degrees <- seq(from=0, to=360, length.out=nrow(dat))
dat$wd_radians <- dat$wd_degrees * (pi/180)  


## convert from polar to cartesian
dat$xend <- aspectratio * (dat$ws * sin(dat$wd_radians)) + dat$datetime
dat$yend <- aspectratio * (dat$ws * cos(dat$wd_radians)) + dat$pollutant

ggplot(data = dat, aes(x = datetime, y = pollutant)) +
geom_line() +
geom_segment(data = dat,          
             size = 1,
             aes(xend = xend,
                 yend = yend,
                 color = ws),
             arrow = arrow(length = unit(0.5, "cm"))) +
coord_fixed(xlim=xlimits, ylim=ylimits, ratio=1) +
theme()

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

ggplot(data = dat, aes(x=datetime, y=pollutant)) + 
  geom_text(aes(angle=-wd_degrees+90), label="→")