4

私は最近ggplot2を使い始めましたが、多くの困難を見つけています...現時点では、2つの異なる変数を点と線(タイプ=プロット関数の両方)で1つのプロットにプロットし、この結果のプロットを作成したいだけです同じ x 軸を共有するヒストグラムの上に配置され、整列されます。

だから私はこのdata.frameを持っています:

GO.df <- data.frame(GO.ID=paste("GO",c(1:29),sep=""),
                    occ=c(1:29),
                    pv=c(5.379594e-05, 3.052953e-03, 3.052953e-03, 3.052953e-03, 3.052953e-03, 3.052953e-03, 3.052953e-03, 3.052953e-03, 6.096906e-03, 6.096906e-03, 6.096906e-03, 6.096906e-03, 9.131884e-03, 9.131884e-03, 9.131884e-03, 9.131884e-03, 9.131884e-03, 9.131884e-03, 9.131884e-03, 1.215791e-02, 1.215791e-02, 1.215791e-02, 1.517502e-02, 1.517502e-02, 1.517502e-02, 1.517502e-02, 1.818323e-02, 1.818323e-02, 1.818323e-02),
                    adj.pv=c(0.004088492, 0.029003053, 0.029003053, 0.029003053, 0.029003053, 0.029003053, 0.029003053, 0.029003053, 0.036527537, 0.036527537, 0.036527537, 0.036527537, 0.036527537, 0.036527537, 0.036527537, 0.036527537, 0.036527537, 0.036527537, 0.036527537, 0.042000065, 0.042000065, 0.042000065, 0.044357749, 0.044357749, 0.044357749, 0.044357749, 0.047652596, 0.047652596, 0.047652596))

そしてこれを再現したい:

plot(GO.df$pv, type="b", col="red", ylim=c(0,0.05),ylab="",xlab="",xaxt="n")
lines(GO.df$adj.pv, type="b", col="blue")
axis(1, at=c(1:length(GO.df$GO.ID)), labels=GO.df$GO.ID, las=2)

(変数 "occ" の) ヒストグラムの上にあり、それに合わせて配置されます。これは私がこれまでにggplot2で持っているものです:

#install.packages("ggplot2")
library(ggplot2)
#install.packages("reshape")
library(reshape)
#install.packages("gridExtra")
library(gridExtra)

GO.df2 <- melt(GO.df, measure.vars=c("pv", "adj.pv"))
p1 <- ggplot(GO.df2, aes(x=GO.ID, y=value, colour=variable)) + geom_point() + ylab("p-values") + xlab(NULL)
p2 <- ggplot(GO.df2, aes(x=GO.ID, y=occ)) + geom_bar(stat="identity") + ylab("Num of Ocurrences")
grid.arrange(
  p1, 
  p2,
  nrow = 2,
  main = textGrob("GO!", vjust = 1, gp=gpar(fontface = "bold", cex = 1.5)))

ご覧のとおり、次のことができません。

線と点の両方を 1 プロット

2-データが散らばっているのではなく、両方のプロットで本来あるべき順序に並べ替えます (順序はプロット関数で維持されます)。

3-2つのプロットをそれらの間の最小距離で整列させ、上のプロットにx軸を配置しません。

4-プロットを揃えますが、上記の凡例を維持します。

これで私を助けてくれることを願っています。私はまだggplots2に本当に慣れていません。どうもありがとう!

4

2 に答える 2

6

私はおそらく を使用しないでしょうgrid.arrangeが、むしろ次のようなことをします:

    dat <- rbind(GO.df2,GO.df2)
    dat$grp <- factor(rep(c('p-values','Num of Ocurrences'),each = nrow(GO.df2)),
                      levels = c('p-values','Num of Ocurrences'))
    dat$GO.ID <- factor(dat$GO.ID,levels = unique(dat$GO.ID))

ggplot(dat,aes(x = GO.ID)) + 
    facet_grid(grp~.,scales = "free_y") +
    geom_point(data = subset(dat,grp == 'p-values'),
               aes(y = value,colour = variable)) + 
    geom_line(data = subset(dat,grp == 'p-values'),
              aes(y = value,colour = variable,group = variable)) + 
    geom_bar(data = subset(dat,grp == 'Num of Ocurrences'),
             aes(y = occ),stat = "identity") + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
    ylab("")

ここに画像の説明を入力

線をプロットするには、 を追加geom_lineし、グループ化が正しく設定されていることを確認するだけで済みました。

ggplot の他のすべてと同様に、x 軸を並べ替えるには、因子を作成し、レベルを適切に並べ替えるだけです。

プロットを揃えるのは確かに少しトリッキーです。ファセットをマッサージして、ほとんどの位置合わせを行うと役立ちます。そのためにrbind、データの 2 つのコピーをまとめて編集し、異なる y 軸ラベルとして機能するグループ化変数を作成しました。

次にfacet_grid、ファセット ストリップを強制的に y 軸上に配置し、自由な y スケールを許可してから、データの適切なサブセットのみを各 geom に渡すことができます。

agstudy に感謝しthemeます。

于 2013-07-11T16:20:00.987 に答える
2

各プロットを個別にさらに制御したい場合は、ダミー ファセットの代わりに、

library(gtable) ; library(grid)

p1 <- qplot(GO.ID, value, colour=variable, group = variable, 
            data = GO.df2, geom=c("point", "line")) +
  theme(plot.margin = unit(c(1, 1, -0.5, 0.5), "lines"),
        axis.title.x = element_blank(),
        axis.text.x = element_blank())

p2 <- qplot(GO.ID, occ, data = GO.df2, geom="bar", stat="identity") +
  theme(plot.margin = unit(c(0, 1, 0.5, 0.5), "lines"))

g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g2 <- gtable::gtable_add_cols(g2, widths=unit(0,"mm"))
g <- gtable:::rbind_gtable(g1, g2, "first")

grid.newpage()
grid.draw(g)

ここに画像の説明を入力

于 2013-07-11T16:51:10.257 に答える