4

私がやりたいことは次のとおりです。

a)コードによって生成されるプロットは、ggplot実行するたびに同じになります[set.seed種類の概念?]

b)同じ y 軸値を持つラベルに対してのみ、テキスト ラベルをジッタリングします。他のテキスト ラベルはそのままにしておきます。これは、ポイントの係数値に基づくある種の条件付きジッターのように見えます。

ここにいくつかのデータがあります:

dput(df)
structure(list(Firm = c("a verylongname", "b verylongname", "c verylongname", 
"d verylongname", "e verylongname", "f verylongname", "g verylongname", 
"h verylongname", "i verylongname", "j verylongname"), Sum = c(74, 
77, 79, 82, 85, 85, 88, 90, 90, 92)), .Names = c("Firm", "Sum"
), row.names = c(NA, 10L), class = "data.frame")

ggplotdf を使用したコードは次のとおりです。

ggplot(df, aes(x = reorder(Firm, Sum, mean), y = Sum)) +
  geom_text(aes(label = Firm), size = 3, show.guides = FALSE, position = position_jitter(height = .9)) +
  theme(axis.text.x = element_blank()) +
  scale_x_discrete(expand = c(-1.1, 0)) +   # to show the lower left name fully
  labs(x = "", y = "", title = "")

プロットの 1 つのバージョンがまだ h と i に重なっていることに注意してください。上記のコードを実行するたびに、テキスト ラベルの位置が変わります。

ここに画像の説明を入力

ところで、この質問の条件付きジッターは、x 軸の離散値を少しシフトしますが、y 軸のオーバーラップ ポイント (のみ) をシフトしたいと思います。

4

1 に答える 1

4

1 つのオプションは、列を追加して重複する点をマークし、それらを個別にプロットすることです。重なり合うポイントの y 値を直接シフトして、それらの配置を直接制御できるようにすることをお勧めします。以下に両方のオプションを示します。

オプション 1 (ジッター):まず、列を追加してオーバーラップをマークします。この場合、ポイントはほぼ直線上にあるため、y 値が近すぎる場合は、ポイントが重なっているとマークできます。x 値が近いかどうかを確認することが重要な場合は、より複雑な条件を含めることができます。

df$overlap = lapply(1:nrow(df), function(i) {
  if(min(abs(df[i, "Sum"] - df$Sum[-i])) <= 1) "Overlap" else "Ignore"
})

プロットでは、どのポイントが影響を受けたかを簡単に識別できるように、ジッターしたポイントを赤く着色しました。

# Add set.seed() here to make jitter reproducible
ggplot(df, aes(x = reorder(Firm, Sum, mean))) +
  geom_text(data=df[df$overlap=="Overlap",], 
            aes(label = Firm, y = Sum), size = 3,  
            position = position_jitter(width=0, height = 1), colour="red") +
  geom_text(data=df[df$overlap=="Ignore",], 
            aes(label = Firm, y = Sum), size = 3) +
  theme(axis.text.x = element_blank()) +
  scale_x_discrete(expand = c(-1.1, 0)) +   # to show the lower left name fully
  labs(x = "", y = "", title = "")

ここに画像の説明を入力

オプション 2 (直接配置):もう 1 つのオプションは、ラベルがどれだけ移動するかを直接制御するjitterことです。この場合、同じ y 値を持つポイントの各ペアをシフトしたいことがわかっています。x 値と y 値の両方を気にする必要がある場合、同じオーバーラップ内に 2 つ以上のポイントがある場合、および/または近い値であるがまったく同じではない値をシフトする必要がある場合には、より複雑なロジックが必要になります。

library(dplyr)

# Create a new column that shifts pairs of points with the same y-value by +/- 0.25
df = df %>% group_by(Sum) %>%
  mutate(SumNoOverlap = if(n()>1) Sum + c(-0.25,0.25) else Sum)

ggplot(df, aes(x = reorder(Firm, Sum, mean), y = SumNoOverlap)) +
  geom_text(aes(label = Firm), size = 3) +
  theme(axis.text.x = element_blank()) +
  scale_x_discrete(expand = c(-1.1, 0)) +   # to show the lower left name fully
  labs(x = "", y = "", title = "")

ここに画像の説明を入力

注:ジッターを再現可能にするset.seed(153)には、ジッターのあるプロット コードの前に (または任意のシード値を) 追加します。

于 2015-09-11T16:44:59.527 に答える