こにしき(言葉・日本社会・教育)

関西学院大学(2016.04~)の寺沢拓敬のブログです(専門:言語社会学)。

ラベルが重ならないよう自動的に調整してプロットする関数

表題の通り。


次の「スイスデータ」のように各ケース自体に重要な意味があり、かつ、ケース数がけっこう多いデータを、Rのデフォ関数でプロットすると、図のように文字が重なってしまうことがあります。

> data(swiss) #スイスデータをロード
> 
> # デフォルト関数でのやり方
> plot(swiss[,1:2],col=2,type="n",main="デフォルトの text()関数を使用")
>  text(swiss[,1:2],labels=rownames(swiss))

f:id:TerasawaT:20210715220242p:plain

解決方法

これを解決する方法が library(maptools) パッケージの pointLabel() 関数。


ここで教えてもらいました。
http://www.okada.jp.org/RWiki/?%BD%E9%B5%E9%A3%D1%A1%F5%A3%C1%20%A5%A2%A1%BC%A5%AB%A5%A4%A5%D6(9)#s45c066f


> # pointLabel 関数利用
> library(maptools) #パッケージ読み込み(最初はインストールが必要)
> 
> plot(swiss[,1:2],pch=20,col=2,main="pointLabel関数を使用")
>   pointLabel(swiss[,1:2],labels=rownames(swiss))


もともとケース数が47もあるので、一目瞭然とはいきませんが、ラベルの文字の視認性はぐっとあがっています
f:id:TerasawaT:20210715220234p:plain

(12月29日追記)別解「引き出し線を使う方法」


library(wordcloud) に入っている textplot()を使う方法を立命館大学の樋口耕一先生([twitter:@khcoder])に教えていただきました*1


ただし、textplot()が備わっているwordcloudパッケージは R.14以降しか対応していないようなので、古いバージョンで以下のコードを走らせてもエラーがでますのでご注意(私も最初それで手間取りました)


wordcloudパッケージの(見るだけでも楽しい)かんたんな解説はここにあります。
wordcloud makes words less cloudy « Fells Stats
(日本語のページは未発見)

library(wordcloud)
library(tm)

textplot(swiss[,1],swiss[,2]
  ,words=rownames(swiss)
  ,main = "textplot() 使用"
  ,xlim=c(30,100),ylim=c(0,90) ) # 文字がすべておさまるように調整

f:id:TerasawaT:20210715220238p:plain


2013年11月30日追記

points()のように重ね書き関数として使いたい場合は、

textplot(x,y, new=FALSA)

のように new パラメータをいじる。