сюжет серии ggplot2 времени с цветными стрелками направлении ветра
Добрый день,
Я пытаюсь создать график временных рядов со стрелками, показывающими направление ветра и окрашенными, чтобы показать силу скорости ветра. В конечном счете, я пытаюсь получить сюжет что-то вроде этого (просто пример картины, которую я нашел в интернете):
мне удалось найти аналогичный пост (см. ниже), и я попытался следовать, но я застрял с отображением стрелок направления ветра правильно.
предыдущий аналогичный пост: 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()
используя приведенный выше код, я получаю следующий сюжет:
Как вы можете видеть, сюжет начинает стрелку, где я хотел бы начать, но направление и конечная точка слишком длинные, и я не уверен, как я могу масштабировать это, чтобы быть короче стрелка с цветом, закодированным для скорости. Я был бы очень признателен за любое ваше руководство относительно того, как я могу достичь этого.
большое спасибо, Аян!--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")
Это не завершено, но я надеюсь, что это будет началом для вас или кого-то еще. Правильно ли я понимаю следующее?
- начало стрелки x-это время
- стрелка начала y является загрязнителем
- длина стрелки-скорость ветра
- ориентация стрелки-направление
- цвет стрелки-скорость ветра
Если это так, одна недостающая часть преобразования из полярных координат в декартовы координирует. (например, 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="→")