11

R「ggplot2」で構築しているかなり密な散布図があり、「ggrepel」を使用してポイントのサブセットにラベルを付けたいと考えています。私の問題は、散布図にすべてのポイントをプロットしたいが、部分集合に ggrepel のみをラベル付けしたいということです。これを行うと、ラベルを配置する場所を計算するときに、ggrepel はプロット上の他のポイントを考慮しません。プロット上の他のポイントと重なるラベルに(ラベルを付けたくありません)。

この問題を示すプロットの例を次に示します。

# generate data:
library(data.table)
library(stringi)
set.seed(20180918)
dt = data.table(
  name = stri_rand_strings(3000,length=6),
  one = rnorm(n = 3000,mean = 0,sd = 1),
  two = rnorm(n = 3000,mean = 0,sd = 1))
dt[, diff := one -two]
dt[, diff_cat := ifelse(one > 0 & two>0 & abs(diff)>1, "type_1",
                        ifelse(one<0 & two < 0 & abs(diff)>1, "type_2",
                               ifelse(two>0 & one<0 & abs(diff)>1, "type_3",
                                      ifelse(two<0 & one>0 & abs(diff)>1, "type_4", "other"))))]

# make plot
ggplot(dt, aes(x=one,y=two,color=diff_cat))+
  geom_point()

ラベルなしのプロット

ラベル付けしたいポイントのサブセットのみをプロットすると、ggrepel はすべてのラベルを他のポイントやラベルに対して重複しないように配置できます。

ggplot(dt[abs(diff)>2 & (!diff_cat %in% c("type_3","type_4","other"))], 
  aes(x=one,y=two,color=diff_cat))+
  geom_point()+
  geom_text_repel(data = dt[abs(diff)>2 & (!diff_cat %in% c("type_3","type_4","other"))], 
                  aes(x=one,y=two,label=name))

ラベル付き点のみをプロット

ただし、このデータのサブセットと元のデータを同時にプロットしたい場合は、ラベルが重なっている点が得られます。

# now add labels to a subset of points on the plot
ggplot(dt, aes(x=one,y=two,color=diff_cat))+
  geom_point()+
  geom_text_repel(data = dt[abs(diff)>2 & (!diff_cat %in% c("type_3","type_4","other"))], 
                  aes(x=one,y=two,label=name))

ラベル付きプロット

ポイントのサブセットのラベルが元のデータのポイントと重ならないようにするにはどうすればよいですか?

4

1 に答える 1