2016-08-04 15 views
2

極座標ヒストグラム(双峰性の測定値)と極点散布図(双峰値と方位値を示す)を組み合わせたプロットを描きたいと思います。たとえば、これは私が生産したいものを(source)です:極地の散布図と極ヒストグラムを結合する

enter image description here

はのは無意味ヒストグラムの棒のスケールの絶対値がそれを無視してみましょう。プロット内の比較のヒストグラムを表示しています。正確な値は表示されません(これは地質学における従来のプロットです)。ヒストグラムのy軸テキストは通常​​、これらのプロットには表示されません。

ポイントは、ベアリング(垂直からの角度)とディップ(中央からの距離)を示しています。ディップは常に0〜90度で、ベアリングは常に0〜360度です。

ヒストグラムのスケール(下の例では0-20)と散布図のスケール(常に0-90)の不一致に悩まされています。ディップ測定)。

はここに私の例です:

n <- 100 
bearing <- runif(min = 0, max = 360, n = n) 
dip <- runif(min = 0, max = 90, n = n) 

library(ggplot2) 
ggplot() + 
    geom_point(aes(bearing, 
       dip), 
      alpha = 0.4) + 
    geom_histogram(aes(bearing), 
       colour = "black", 
       fill = "grey80") + 
    coord_polar() + 
    theme(axis.text.x = element_text(size = 18)) + 
    coord_polar(start = 90 * pi/180) + 
    scale_x_continuous(limits = c(0, 360), 
        breaks = (c(0, 90, 180, 270))) + 
    theme_minimal(base_size = 14) + 
    xlab("") + 
    ylab("") + 
    theme(axis.text.y=element_blank()) 

enter image description here

よく見ると、あなたが円の中心に小さなヒストグラムを見ることができます。

ヒストグラムをプロットのように見えるようにするにはどうすればよいでしょうか?そのため、ヒストグラムは最高のバーが円の半径(つまり90)になるように自動スケーリングされますか?

+0

はたぶんggplot外のバーの高さの計算をして、その後、0にそれをrescalling -90はそのトリックを行うだろうか?ディップをリサイズするよりも音が良い。 –

+2

'geom_histogram(aes(bearing、y = ..count .. * 10)'を使って10倍にスケールアップすることができます。自動スケーリングはヒストグラム内の実際のブレークにアクセスする必要があるので少し難しいですが、 – Axeman

+2

また、 'geom_point'と' geom_histogram'の順番を入れ替えたいと思うかもしれませんので、前者が表示されます。トップ。 – Axeman

答えて

2

to_barplotは、おそらく簡単な方法で作ることができるが、ここでは、次のとおりです。

library(Hmisc) 
library(dplyr) 

set.seed(2016) 
n <- 100 
bearing <- runif(min = 0, max = 360, n = n) 
dip <- runif(min = 0, max = 90, n = n) 

rescale_prop <- function(x, a, b, min_x = min(x), max_x = max(x)) { 
    (b-a)*(x-min_x)/(max_x-min_x) + a 
} 

to_barplot <- bearing %>% 
    cut2(cuts = seq(0, 360, 20)) %>% 
    table(useNA = "no") %>% 
    as.integer() %>% 
    rescale_prop(0, 90, min_x = 0) %>% # min_x = 0 to keep min value > 0 (if higher than 0 of course) 
    data.frame(x = seq(10, 350, 20), 
      y = .) 

library(ggplot2) 
ggplot() + 
    geom_bar(data = to_barplot, 
      aes(x = x, y = y), 
      colour = "black", 
      fill = "grey80", 
      stat = "identity") + 
    geom_point(aes(bearing, 
       dip), 
      alpha = 0.4) + 
    geom_hline(aes(yintercept = 90), colour = "red") + 
    coord_polar() + 
    theme(axis.text.x = element_text(size = 18)) + 
    coord_polar(start = 90 * pi/180) + 
    scale_x_continuous(limits = c(0, 360), 
        breaks = (c(0, 90, 180, 270))) + 
    theme_minimal(base_size = 14) + 
    xlab("") + 
    ylab("") + 
    theme(axis.text.y=element_blank()) 

結果:

result

+0

Thannks、それはとても役に立ちます。奇妙なことに、私たちはプロット上の最後の円まで棒を得ることはできません。私はあなたが赤い線を90に置くのを見るので、次のラインが何のためにあるのか分かりません。 'expand = c(0,0)'でさえ、外側の行はまだそこにあります。 – Ben

+0

'panel.grid = element_blank()'を 'theme'に追加しますが、' geom_hline'sと 'geom_hline'sを使ってグリッドを再作成する必要があります。http://stackoverflow.com/questions/20808009/remove-余分なスペースとリングの極端なプロット図 –

+1

ああ、残念ですが 'table(useNA =" no ")'のために、ラッパーを持っていますので、常にNAsを出力します投稿する前に削除するのを忘れてしまった。 –

2

これは最終的な解決策ではありませんが、正しい方向に進むと思います。 ここで問題となるのは、ヒストグラムのスケールがポイントのスケールとはかなり異なることです。スケールでは、最大のy値を求めます。あなたはポイントを再スケール場合

、あなたはこれを取得することができます:

scaling <- dip/9 
ggplot() + 
    geom_point(aes(bearing, 
        scaling), 
       alpha = 0.4) + 
    geom_histogram(aes(bearing), 
        colour = "black", 
        fill = "grey80") + 
    coord_polar() + 
    theme(axis.text.x = element_text(size = 18)) + 
    coord_polar(start = 90 * pi/180) + 
    scale_x_continuous(limits = c(0, 360), 
         breaks = (c(0, 90, 180, 270))) + 
    theme_minimal(base_size = 14) + 
    xlab("") + 
    ylab("") + 
    theme(axis.text.y=element_blank()) 

enter image description here

は、ここで私は発見的に、スケーリングのため数になりました。 次のステップは、それを定義するアルゴリズム的な方法を考え出すことです。 次のようなものがあります。ポイントの最大値yをとり、 でヒストグラムの最大値を割ります。