5

R でラベル付きのバブル プロットを作成しようとしていますggplot2。簡略化されたシナリオは次のとおりです。

4 つの変数を持つデータ フレームxyありzますlab

xと で位置を決定し、yでポイントのサイズを決定する散布図を作成したいと考えていzます。次に、ポイントの上にテキストを重ねることなく、ポイントの横(たとえば、ポイントの右側) にテキスト ラベルを配置します。

ポイントのサイズが変わらない場合はgeom_text、スケーリング定数 ( などaes(x=x+1, y=y+1)) を追加して、レイヤーの美しさを単純に変更することができます。ただし、この単純なケースでも、ポイントがプロットの出力次元に合わせてスケーリングされないため、テキストを正しく配置するのに問題があります。つまり、ポイントのサイズは 500x500 プロットと 1000x1000 プロットで一定のままです。出力されたプロットのサイズで拡大しません。

したがって、出力プロットのサイズ (寸法など) でラベルの位置をスケーリングするか、ggplot何らかの方法でポイントの半径を取得してテキスト ラベルをシフトする必要があると思います。でこれを行う方法はありggplot2ますか?

ここにいくつかのコードがあります:

# Stupid data
df <- data.frame(x=c(1,2,3), 
                 y=c(1,2,3), 
                 z=c(1,2,1),
                 lab=c("a","b","c"), stringsAsFactors=FALSE)

# Plot with bad label placement
ggplot(aes(x=x, y=y), data=df) + 
  geom_point(aes(size=z)) + 
  geom_text(aes(label=lab), 
            colour="red") +
  scale_size_continuous(range=c(5, 50), guide="none")

編集:私は言及する必要があります、私はgeom_textの中で試しhjustてみvjustましたが、それは望ましい効果を生み出しません.

# Trying hjust and vjust, but it doesn't look nice
ggplot(aes(x=x, y=y), data=df) + 
  geom_point(aes(size=z)) + 
  geom_text(aes(label=lab), hjust=0, vjust=0.5, 
            colour="red") +
  scale_size_continuous(range=c(5, 50), guide="none")

編集: Henrik と shujaa のおかげで、今のところ機能するものを手に入れることができました。誰かがより一般的な解決策を共有する場合に備えて、質問を開いたままにします。

私がこれを使用していることの単なる宣伝文句: 私は地図をプロットしており、観察された降水量に比例してサイズが決められたポイントで特定のステーションでの降水量を示しています. 各ポイントの横に駅のラベルを美的に美しい方法で追加したかったのです。さまざまな地域でこれらのプロットをさらに作成しますが、出力プロットはプロットごとに異なる解像度またはスケール (たとえば、投影法が異なるため) になる可能性があるため、一般的な解決策が必要です。position_jitter週末に時間があれば、バティストが提案したように、カスタムを作成してみるかもしれません.

4

3 に答える 3

3

position_*** は他のレイヤーで使用されているスケールにアクセスできないようです。マッピングされたサイズに応じてラベルをシフトする GeomText のクローンを作成することもできますが、非常に厄介で壊れやすいソリューションには多大な労力がかかります。

ここに画像の説明を入力

geom_shiftedtext <- function (mapping = NULL, data = NULL, stat = "identity", 
                       position = "identity", 
                       parse = FALSE, ...) { 
  GeomShiftedtext$new(mapping = mapping, data = data, stat = stat, position = position, 
               parse = parse, ...)
}
require(proto)
GeomShiftedtext <- proto(ggplot2:::GeomText, {
  objname <- "shiftedtext"
  draw <- function(., data, scales, coordinates, ..., parse = FALSE, na.rm = FALSE) {
    data <- remove_missing(data, na.rm, 
                           c("x", "y", "label"), name = "geom_shiftedtext")

    lab <- data$label
    if (parse) {
      lab <- parse(text = lab)
    }

    with(coord_transform(coordinates, data, scales),
         textGrob(lab, unit(x, "native") + unit(0.375* size, "mm"), 
                  unit(y, "native"), 
                  hjust=hjust, vjust=vjust, rot=angle, 
                  gp = gpar(col = alpha(colour, alpha), 
                            fontfamily = family, fontface = fontface, lineheight = lineheight))

         )
  }

})


df <- data.frame(x=c(1,2,3), 
                 y=c(1,2,3), 
                 z=c(1.2,2,1),
                 lab=c("a","b","c"), stringsAsFactors=FALSE)

ggplot(aes(x=x, y=y), data=df) + 
  geom_point(aes(size=z), shape=1) + 
  geom_shiftedtext(aes(label=lab, size=z),
            hjust=0, colour="red") +
  scale_size_continuous(range=c(5, 100), guide="none")
于 2013-10-31T00:28:41.387 に答える
1

別の選択肢。テストデータでは問題ないように見えますが、それがどれほど一般的かを確認する必要があります。

dodge <- abs(scale(df$z))/4

ggplot(data = df, aes(x = x, y = y)) + 
  geom_point(aes(size = z)) +
  geom_text(aes(x = x + dodge), label = df$lab, colour = "red") +
  scale_size_continuous(range = c(5, 50), guide = "none")

更新を 試してみposition_jitterましたが、width引数は 1 つの値しか取りません。そのため、現時点では、その関数がどれほど役立つかわかりません。しかし、私が間違っていることがわかってうれしいです。別の小さなデータ セットの例:

df3 <- mtcars[1:10, ]
ggplot(data = df3, aes(x = wt, y = mpg)) +
  geom_point(aes(size = qsec), alpha = 0.1) +
  geom_text(label = df3$carb, position = position_jitter(width = 0.1, height = 0)) +
  scale_size_continuous(range = c(5, 50), guide = "none")
于 2013-10-30T22:57:05.530 に答える
1

x毎回微調整する必要があるため、これは非常に一般的な解決策ではありませんが、に応じて線形の値をテキストの値に追加できるはずですz

運が良かった

ggplot(aes(x=x, y=y), data=df) + 
    geom_point(aes(size=z)) + 
    geom_text(aes(label=lab, x = x + .06 + .14 * (z - min(z))), 
              colour="red") +
    scale_size_continuous(range=c(5, 50), guide="none")

ただし、フォント サイズはウィンドウ サイズに依存するため、出力サイズを決定し、それに応じて微調整する必要があります。x = x + .05 + 0 * (z-min(z))最小点に基づいてインターセプトを調整し、それで満足したら、最大点の線形項を調整しました。

于 2013-10-30T22:09:27.223 に答える