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

廿TT

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

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

R 生存時間分析

質問編

生存時間のデータはおおむねこのような形で与えられます。

> library(MASS) 
> head(gehan)
  pair time cens   treat
1    1    1    1 control
2    1   10    1    6-MP
3    2   22    1 control
4    2    7    1    6-MP
5    3    3    1 control
6    3   32    0    6-MP

time が生存時間の観測値、cens の 0, 1 が打ち切りの有無、treat は処理を表す列で、6-MP というのは白血病の薬、 control というのが対照群です。

これをこんな感じで図示したいのです。

f:id:abrahamcow:20140502015420p:plain

●は死亡、×は打ち切りを表して、treat を色違いにしている。
しかしこのグラフだと縦軸の番号がソートされていないので、ちょっといやなのです。

グラフのコードは下記の通りです。

library(MASS) #Gehanデータを使うため
library(ggplot2)
pch1 <- ifelse(gehan$cens==0,4,16) #4が×、16が●なので
plt1 <- ggplot(gehan,aes(x =time, y =rownames(gehan)))
plt1 + 
  scale_shape_identity() + #よくわからないけどこれがないとエラーでる
  geom_point(size=3,aes(colour=treat, shape=pch1))+
  geom_segment(aes(yend=rownames(gehan), colour=treat),xend=0)+
  labs(y="") #縦軸のラベルを消してる
#ggsave("~/Desktop/fig1.png")

これを縦軸の番号とか、時間 time とかでソートして表示する方法をご存知の方、いらっしゃいましらご教示願えませんでしょうか。


別のデータでやっても同様に、縦軸の番号がバラバラになってしまいます。

f:id:abrahamcow:20140502020922p:plain

Rのコード:

library(survival) #kidneyデータを使うため
pch2 <- ifelse(kidney$status==0,4,16)
plt2 <- ggplot(kidney,aes(x =time, y =rownames(kidney)))
plt2 + 
  scale_shape_identity() + #よくわからないけどこれがないとエラーでる
  geom_point(size=3,aes(colour=disease, shape=pch2))+
  geom_segment(aes(yend=rownames(kidney), colour=disease),xend=0)+
  labs(y="") 
#ggsave("~/Desktop/fig2.png")

なぜでしょうか。


参考:

解答編

要は rownames で取ってきた値が文字列型なので、文字列順でソートされてしまったようです。

factor にしてやるとOK。

library(MASS) #Gehanデータを使うため
library(ggplot2)


theme_set(theme_bw())

gehan$number <- factor(as.numeric(rownames(gehan)))
pch1 <- ifelse(gehan$cens==0,4,16)

ggplot(gehan,aes(x =time, y =number,time))+ 
  scale_shape_identity() + 
  geom_point(size=3,aes(colour=treat, shape=pch1))+
  geom_segment(aes(yend=rownames(gehan), colour=treat),xend=0)+
  labs(y="") +
  scale_colour_manual(values=c("red2","royalblue")) 

f:id:abrahamcow:20150320120037p:plain

reorder 関数で並べ替えもできます。

ggplot(gehan,aes(x =time, y =reorder(number,time)))+ 
  scale_shape_identity() + 
  geom_point(size=3,aes(colour=treat, shape=pch1))+
  geom_segment(aes(yend=rownames(gehan), colour=treat),xend=0)+
  labs(y="") +
  scale_colour_manual(values=c("red2","royalblue"))

f:id:abrahamcow:20150320120121p:plain

最後になりましたが r-de-r 様、ありがとうございます。