読者です 読者をやめる 読者になる 読者になる

廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

ggplot2 の凡例を並べ替える

R

折れ線グラフ

RPubs - ggplot2メモ:水準を形で分ける では下のようなグラフを描いています。

f:id:abrahamcow:20141104032452p:plain

R のコード:

#library
library(rdatamarket)
library(reshape2)
library(ggplot2)

#データ取得
dat1 <- dmseries("http://datamarket.com/data/set/15n6/health-expenditure-public-of-gdp#display=line&ds=15n6|hnt")

#目的の国を抽出
cntry <- c("Sudan", "Mexico", "Kuwait", "Germany", 
           "Finland", "France", "Canada", "Japan", "United.States")
smp <- dat1[,colnames(dat1) %in% cntry]

#データ整形
smp <- data.frame(year = index(smp), as.data.frame(smp))
dim1 <- dim(smp)
smp_m <- melt(smp, id.vars = "year")
colnames(smp_m) <- c("year", "country", "value")

#描画
theme_set(theme_bw(15))
p1 <- ggplot(smp_m, aes(x = year, y = value, group = country)) +
  geom_line(aes(color = country)) + 
  geom_point(aes(color = country, shape = country)) + 
  scale_shape_manual(values = 0:length(cntry))
#manual で shape 指定

p1


このように系列が多い場合、色分けだけだと区別がしづらいので、ポイントの形も変えて見やすいように工夫されています。

しかし、やはり凡例と見比べるのは大変で、たとえば Japan がどの線に対応するのか、ぱっと見ではわからないと思います。

そこで、凡例と系列をあわせて並べてやることを考えます。

下図は最後の時点での value の大きさ順に凡例を並べ替えています。

「一番上がフランス、三番目がジャパンだな」とより読みやすくなったかと思います。

f:id:abrahamcow:20141104032418p:plain

R のコード:

#データを降順に並べ替え
smp2 <-smp[,order(smp[dim1[1],], decreasing = TRUE)]
smp2_m <- melt(smp2, id.vars = "year")
colnames(smp2_m) <- c("year", "country", "value")

#描画
p2 <- ggplot(smp2_m, aes(x = year, y = value, group = country)) +
  geom_line(aes(color = country)) + 
  geom_point(aes(color = country, shape = country)) + 
  scale_shape_manual(values = 0:length(cntry))
p2


また、下図のようにグラフ内にテキストを書き込んじゃう方法もあります。
しかしこのやり方だと、グラフと文字、あるいは文字どうしが重なってしまうことがあるので、積極的におすすめはしません。

f:id:abrahamcow:20141104032510p:plain

R のコード:

p1 + geom_text(data = smp_m[smp_m$year == max(smp_m$year),], aes(label = country, colour = country),
            hjust = 0.7,vjust = 1)+
   theme(legend.position="none")

より詳しくは ggplot2: Labelling Data Series and Adding a Data Table | Learning R を参照してください。

また、r - ggplot2 - annotate outside of plot - Stack Overflow のように座標平面の外側にアノテーションを書き込む方法あるようです。

積み上げ棒グラフ

ggplot2 の積み上げ棒グラフはデフォルトだと、グラフの積み上げと凡例の上下が入れ替わっています。

f:id:abrahamcow:20141104035134p:plain

R のコード:

p3 <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
p3


これも、グラフと凡例の順番を並べてやったほうが見やすいでしょう。

f:id:abrahamcow:20141104035324p:plain

R のコード:

p3 + guides(fill = guide_legend(reverse = TRUE))

積み上げ折れ線(面グラフ)については、
ggplot2 で積み上げ折れ線グラフ(エリアプロット)を作成する方法 - ill-identified diary
を参照してください。

関連エントリ

ggplot2 の自分用小技メモ。


ggplot2 で散布図に曲線を重ねて描いてグラデーションで色分けする方法 - 廿TT


生存時間のデータを ggplot2 のエノキタケみたいな棒グラフで示したい - 廿TT