2017-12-26 42 views
4

ggplot2でヒートマップを描画しています。 y軸上のいくつかのティックにラベルを付ける必要があります。しかし、それらのいくつかは近すぎて重複しています。私はggrepelがテキストラベルを分けることができると知っていますが、現在私は自分の問題を解決していません。ggrepelで軸ラベルの重なりを避けることはできますか?

私のコードは以下の通りです。どんな提案も大歓迎です。ありがとう。

コード:この種の問題のために

df <- data.frame() 

for (i in 1:50){ 
    tmp_df <- data.frame(cell=paste0("cell", i), 
         gene=paste0("gene", 1:100), exp = rnorm(100), ident = i %% 5) 
    df<-rbind(df, tmp_df) 
} 

labelRow=rep("", 100) 
for (i in c(2, 5, 7, 11, 19, 23)){ 
    labelRow[i] <- paste0("gene", i) 
} 

library(ggplot2) 
heatmap <- ggplot(data = df, mapping = aes(x = cell, y = gene, fill = exp)) + 
    geom_tile() + 
    scale_fill_gradient2(name = "Expression") + 
    scale_y_discrete(position = "right", labels = labelRow) + 
    facet_grid(facets = ~ident, 
      drop = TRUE, 
      space = "free", 
      scales = "free", switch = "x") + 
    scale_x_discrete(expand = c(0, 0), drop = TRUE) + 
    theme(axis.line = element_blank(), 
     axis.ticks = element_blank(), 
     axis.title.y = element_blank(), 
     axis.text.y = element_text(), 
     axis.title.x = element_blank(), 
     axis.text.x = element_blank(), 
     strip.text.x = element_text(angle = -90)) 

heatmap 

enter image description here

答えて

4

、私は別のプロットとして軸を描き、その後、結合することを好みます。それはちょっとした手間がかかりますが、あなたが望むあらゆる軸を描くことができます。

私の解決策では、私は、関数0.,align_plots()、およびplot_grid()をカウプロットパッケージから使用しています。免責事項:私はパッケージの著者です。

library(ggplot2) 
library(cowplot); theme_set(theme_gray()) # undo cowplot theme setting 
library(ggrepel) 

df<-data.frame() 
for (i in 1:50){ 
    tmp_df <- data.frame(cell=paste0("cell", i), 
         gene=paste0("gene", 1:100), exp=rnorm(100), ident=i%%5) 
    df<-rbind(df, tmp_df) 
} 


labelRow <- rep("", 100) 
genes <- c(2, 5, 7, 11, 19, 23) 
labelRow[genes] <- paste0("gene ", genes) 

# make the heatmap plot 
heatmap <- ggplot(data = df, mapping = aes(x = cell,y = gene, fill = exp)) + 
    geom_tile() + 
    scale_fill_gradient2(name = "Expression") + 
    scale_x_discrete(expand = c(0, 0), drop = TRUE) + 
    facet_grid(facets = ~ident, 
      drop = TRUE, 
      space = "free", 
      scales = "free", switch = "x") + 
    theme(axis.line = element_blank(), 
     axis.title = element_blank(), 
     axis.text = element_blank(), 
     axis.ticks = element_blank(), 
     strip.text.x = element_text(angle = -90), 
     legend.justification = "left", 
     plot.margin = margin(5.5, 0, 5.5, 5.5, "pt")) 

# make the axis plot 
axis <- ggplot(data.frame(y = 1:100, 
          gene = labelRow), 
       aes(x = 0, y = y, label = gene)) + 
    geom_text_repel(min.segment.length = grid::unit(0, "pt"), 
       color = "grey30", ## ggplot2 theme_grey() axis text 
       size = 0.8*11/.pt ## ggplot2 theme_grey() axis text 
       ) + 
    scale_x_continuous(limits = c(0, 1), expand = c(0, 0), 
        breaks = NULL, labels = NULL, name = NULL) + 
    scale_y_continuous(limits = c(0.5, 100.5), expand = c(0, 0), 
        breaks = NULL, labels = NULL, name = NULL) + 
    theme(panel.background = element_blank(), 
     plot.margin = margin(0, 0, 0, 0, "pt")) 

# align and combine 
aligned <- align_plots(heatmap + theme(legend.position = "none"), axis, align = "h", axis = "tb") 
aligned <- append(aligned, list(get_legend(heatmap))) 
plot_grid(plotlist = aligned, nrow = 1, rel_widths = c(5, .5, .7)) 

enter image description here

+0

あなたの元data.frameがrow.namesとcol.namesを持っている場合は、1が、ラベルを追加する必要は=のようなNULL:scale_x_discrete(拡大=のC(0、0)、ドロップ= TRUE、ラベル= NULL)+ scale_y_discrete(展開= c(0、0)、drop = TRUE、labels = NULL)。 – PengY

関連する問題