2017-09-13 1 views
3

`に渡す前に、私は、x、y座標とIが算出するために、2Dビンに分割したい見出し角度からなるデータごとに見出しを意味有しますビンとggplotgeom_spokeとプロット。集計X、Y、2Dビンにおけるシータデータgeom_spoke`

ここで私は手動で作成したビンに、何をしたいの例です:

# data 
set.seed(1) 
dat <- data.frame(x = runif(100,0,100), y = runif(100,0,100), angle = runif(100, 0, 2*pi)) 

# manual binning 
bins <- rbind(
    #bottom left 
    dat %>% 
    filter(x < 50 & y < 50) %>% 
    summarise(x = 25, y = 25, angle = mean(angle), n = n()), 
    #bottom right 
    dat %>% 
    filter(x > 50 & y < 50) %>% 
    summarise(x = 75, y = 25, angle = mean(angle), n = n()), 
    #top left 
    dat %>% 
    filter(x < 50 & y > 50) %>% 
    summarise(x = 25, y = 75, angle = mean(angle), n = n()), 
    #top right 
    dat %>% 
    filter(x > 50 & y > 50) %>% 
    summarise(x = 75, y = 75, angle = mean(angle), n = n()) 
) 

# plot 
ggplot(bins, aes(x, y)) + 
    geom_point() + 
    coord_equal() + 
    scale_x_continuous(limits = c(0,100)) + 
    scale_y_continuous(limits = c(0,100)) + 
    geom_spoke(aes(angle = angle, radius = n/2), arrow=arrow(length = unit(0.2,"cm"))) 

Desired geom_spoke plot 私は例えば、各ビンのカウントデータを含む2Dビンを作成する方法を知っている:

# heatmap of x,y counts 
p <- ggplot(dat, aes(x, y)) + 
    geom_bin2d(binwidth = c(50, 50)) + 
    coord_equal() 
#ggplot_build(p)$data[[1]] #access binned data 

しかし、私はgeom_spokeに渡す前に各ビンの見出しのような他の変数を要約する方法を見つけることができないようです。最初のビンニングがなければ、私のプロットは次のようになります。 Bad geom_spoke plot

答えて

3

これは1つのアプローチです。あなたは一度、他の&すべてはコードによってカバーされるべきである(& Y x)の各次元におけるビンの数/範囲を決定する必要があります:

# adjust range & number of bins here 
x.range <- pretty(dat$x, n = 3) 
y.range <- pretty(dat$y, n = 3) 

> x.range 
[1] 0 50 100 
> y.range 
[1] 0 50 100 

自動的&をX上で基づいて、ビンに各行を割り当てますそれが該当するyの間隔:

dat <- dat %>% 
    group_by(bin) %>% 
    mutate(x.mean = mean(x), 
     y.mean = mean(y), 
     angle.mean = mean(angle), 
     n = n()) %>% 
    ungroup() 

> head(dat) 
# A tibble: 6 x 10 
     x  y angle x.bin y.bin bin x.mean y.mean angle.mean  n 
    <dbl> <dbl> <dbl> <int> <int> <chr> <dbl> <dbl>  <dbl> <int> 
1 26.55087 65.47239 1.680804  1  2 1_2 26.66662 68.56461 2.672454 29 
2 37.21239 35.31973 1.373789  1  1 1_1 33.05887 28.86027 2.173177 23 
3 57.28534 27.02601 3.247130  2  1 2_1 74.71214 24.99131 3.071629 23 
4 90.82078 99.26841 1.689866  2  2 2_2 77.05622 77.91031 3.007859 25 
5 20.16819 63.34933 1.138314  1  2 1_2 26.66662 68.56461 2.672454 29 
6 89.83897 21.32081 3.258310  2  1 2_1 74.71214 24.99131 3.071629 23 

プロットwitho:

dat <- dat %>% 
    rowwise() %>% 
    mutate(x.bin = max(which(x > x.range)), 
     y.bin = max(which(y > y.range)), 
     bin = paste(x.bin, y.bin, sep = "_")) %>% 
    ungroup() 

> head(dat) 
# A tibble: 6 x 6 
     x  y angle x.bin y.bin bin 
    <dbl> <dbl> <dbl> <int> <int> <chr> 
1 26.55087 65.47239 1.680804  1  2 1_2 
2 37.21239 35.31973 1.373789  1  1 1_1 
3 57.28534 27.02601 3.247130  2  1 2_1 
4 90.82078 99.26841 1.689866  2  2 2_2 
5 20.16819 63.34933 1.138314  1  2 1_2 
6 89.83897 21.32081 3.258310  2  1 2_1 

は、各ビンの平均値を計算しますUTは、任意のビンの数/ビン幅をハードコード:などなど塗りつぶしパレット、凡例ラベル、プロットのタイトル、の選択肢として

ggplot(dat, 
     aes(x, y, fill = bin)) + 
    geom_bin2d(binwidth = c(diff(x.range)[1], 
          diff(y.range)[1])) + 
    geom_point(aes(x = x.mean, y = y.mean)) + 
    geom_spoke(aes(x = x.mean, y = y.mean, angle = angle.mean, radius = n/2), 
      arrow=arrow(length = unit(0.2,"cm"))) + 
    coord_equal() 

ggplot

その他の詳細は後に微調整することができます。

+0

これはZ.Lin @素晴らしいです、どうもありがとうございました!前に使わなかった 'rowwise()'関数の素晴らしい例です:) – jogall

0

だけZ.Linの答え@上の拡大に、ここでは各ビンの中央ではなく、平均のx、y座標に一つのプロット点をすることができます修正です。 left_joinを使用するよりも雄弁な解決策がある場合は、私は聞いて嬉しいです。

# data 
set.seed(1) 
dat <- data.frame(x = runif(100,0,100), 
        y = runif(100,0,100), 
        angle = runif(100, 0, 2*pi)) 

# set parameters 
n <- 2 #n bins 
x.max #maximum x value 
y.max #maximum y value 

x.range <- seq(0, x.max, length.out = n+1) 
y.range <- seq(0, y.max, length.out = n+1) 

# bin data 
dat <- dat %>% 
    rowwise() %>% 
    mutate(x.bin = max(which(x > x.range)), 
     y.bin = max(which(y > y.range)), 
     bin = paste(x.bin, y.bin, sep = "_")) %>% 
    ungroup() 

# summarise values for each bin 
dat <- dat %>% 
    group_by(bin) %>% 
    select(bin, x.bin, y.bin, x, y, angle) %>% 
    mutate(angle.mean = mean(angle), 
     n = n()) %>% 
    ungroup() 

# add x,y-coords for centre points of each bin 
x.bin.coords <- data.frame(x.bin = 1:n, 
          x.bin.coord = (x.range + (x.max/n/2))[1:n]) 
y.bin.coords <- data.frame(y.bin = 1:n, 
          y.bin.coord = (y.range + (y.max/n/2))[1:n]) 

dat <- left_join(dat, x.bin.coords, by = "x.bin") 
dat <- left_join(dat, y.bin.coords, by = "y.bin") 

# plot 
ggplot(data = dat, aes(x, y)) + 
    geom_bin2d(binwidth = c(diff(x.range)[1], diff(y.range)[1])) + 
    geom_point(data = dat, aes(x = x.bin.coord, y = y.bin.coord)) + 
    geom_spoke(data = dat, aes(x = x.bin.coord, y = y.bin.coord, angle = angle.mean, radius = n/2), arrow=arrow(length = unit(0.2,"cm"))) + 
    coord_equal() 

plot

関連する問題