7

こんにちは、

風向を示す矢印と風速の強さを示す色付きの時系列プロットを作成しようとしています。最終的に、私は次のようなプロットを取得しようとしています(オンラインで見つけた写真の例にすぎません):

ここに画像の説明を入力

同様の投稿を見つけることができ(以下を参照)、フォローしようとしましたが、風向の矢印が正しく表示されません。

前の同様の投稿: 矢印/ベクトルを使用した 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()

上記のコードを使用すると、次のプロットが得られます。 ここに画像の説明を入力

ご覧のとおり、プロットは開始したい場所で矢印を開始しますが、方向と終点が長すぎて、これを速度に応じて色分けされた短い矢印にスケーリングする方法がわかりません。どうすればこれを達成できるかについて、ご指導いただければ幸いです。

どうもありがとう、アヤン

4

4 に答える 4

4

上に示したプロットは正しい方向を示していません。たとえば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") 

そして、アスペクト比の種類を変更すると、混乱します:

于 2014-02-20T16:40:49.730 に答える