2017-01-16 12 views
2

私はちょうど2回の観測で非常に単純なバブルチャートを作成しています。 後でラベルを追加するために、各バブルにタンジェントを追加したいと思います。接触のポイントは、各バブルの上部または下部になければなりません。バブルに接線を追加する方法

例:

library("ggplot2") 
df <- data.frame(group=c(FALSE,TRUE), 
       value=c(5,30)) 

ggplot(df) + 
    geom_point(aes(x=group, 
       y=0, 
       size=value, 
       fill=group), 
      shape=21) + 
    scale_size_area(max_size=25) + 
    theme_void() + 
    theme(legend.position = "none") 

without tangents

私は何を達成したいことはこれです:

with tangents

これを行うにはどのように私の最高の推測のようなものを追加することになります。

... 
annotate("segment", 
      x = 0.2, xend = 1, 
      y = pointOfContact_1, yend = pointOfContact_1) + 
annotate("segment", 
      x = 2.8, xend = 2, 
      y = pointOfContact_2, yend = pointOfContact_2) 

しかし、接触点(y値)の計算方法はわかりません。 ggplot_build()にお会いになったこともありませんでした...

アイデアをお持ちですか?

+0

プロットサイズの変更 'geom_point'がスケールしますを提供します。 1つの解決策は、代わりに 'geom_polygon'を使ってサークルをプロットすることです。次に接触点(center + - radius)を確実に計算できます。 – Axeman

+0

mh ... 'geom_point'で行えない場合は、' geom_polygon'よりも 'ggforce :: geom_circle()'が簡単な方法です。 –

+0

確かに確かです。スケーリングの変更などを処理するよりもずっと痛いことはありません。 – Axeman

答えて

0

私はあなたが正しいと思うのはggforce::geom_circleです。私はいくつかのラベリング手法を含むいくつかの選択肢を試しましたが、進歩を遂げることはできませんでした。しかし、geom_circleは非常に滑らかでした。あなたは半径の大きさを設定すると、ケアのビットを取る必要があり、そしてあなたは、x座標を置くが、これはスムーズに動作しているようですどのようにして:

ggplot(df) + 
    geom_circle(aes(x0=as.numeric(group), 
        y0=0, 
        r=value/100, 
        fill=group)) + 
    coord_fixed() + 
    geom_segment(aes(x = as.numeric(group), 
        xend = as.numeric(group) + ifelse(as.numeric(group) == 1, 0.5, -0.5), 
        y = 0 + value/100, 
        yend = 0 + value/100 
        )) + 
    theme_void() + 
    theme(legend.position = "none") 

はあなたが持っている場合は

enter image description here

を与えます2つ以上のポイントがある場合は、xendggplotの外に設定したい場合は、その位置を示す列を追加します。同様に、データ内で半径と位置を直接指定することもできます。

ここでは、データをggplotに渡す前にこれらのメトリックを計算する例を示します。私ができただけで物事を移動し、あなたが設定できるものの種類を示しました。

data.frame(xloc = c(1, 2, 1, 2) 
      , yloc = c(1, 1, 2, 2) 
      , value = 1:4) %>% 
    mutate(radius = value/10 
     , xend = ifelse(xloc < 1.5, xloc - 0.5, xloc + 0.5) 
     , ystart = ifelse(yloc < 1.5, yloc - radius, yloc + radius) 
     , yend = ifelse(yloc < 1.5 
         , ystart - 0.25 
         , ystart + 0.25)) %>% 
    ggplot() + 
    geom_circle(aes(x0=xloc, 
        y0=yloc, 
        r=radius, 
        fill= paste(xloc, yloc))) + 
    coord_fixed() + 
    geom_segment(aes(x = xloc, 
        xend = xend, 
        y = ystart, 
        yend = yend 
)) + 
    theme_void() + 
    theme(legend.position = "none") 

enter image description here

関連する問題