首页 > 解决方案 > R ggplot2:将列的值放在堆叠条的顶部

问题描述

可能有重复,但我找不到适用于我的特定情况的答案......

我只有一个非常简单的数据框,如下图所示,我想在堆积条形图中显示两列 ( Number_NonHit_Cells, ) 中的计数,另一列 ( ) 的值放在堆积条形图的顶部。Number_Hit_CellsFreq

下面的 MWE 是迄今为止我能得到的最好的,但我只需要Freq一次的值,并且在条形图的最顶部组合......

如果Freq可以在ggplot2调用中计算就更好了。

这是我的 MWE:

  clono_df_long <- data.frame(Clonotype=LETTERS[1:5], Number_Hit_Cells=c(234,56,568,34,46),
                              Number_NonHit_Cells=c(c(52,12,234,21,31)))
  clono_df_long$Clonotype_Size <- clono_df_long$Number_Hit_Cells+clono_df_long$Number_NonHit_Cells
  clono_df_long$Freq <- round(clono_df_long$Number_Hit_Cells/clono_df_long$Clonotype_Size,4)*100
  clono_df_long <- as.data.frame(tidyr::pivot_longer(clono_df_long,
                                                     -c(Clonotype,Clonotype_Size,Freq),
                                                     names_to = "Cells", values_to = "Value"))
  clono_df_long$Clonotype <- factor(clono_df_long$Clonotype, levels=unique(clono_df_long$Clonotype))
  clono_df_long$Cells <- factor(clono_df_long$Cells, levels=c('Number_NonHit_Cells','Number_Hit_Cells'))
  P <- ggplot2::ggplot(clono_df_long, ggplot2::aes(x=Clonotype, y=Value, fill=Cells)) +
    ggplot2::geom_bar(stat="identity") +
    ggplot2::scale_fill_manual(values=c('gray70', 'gray40')) +
    ggplot2::geom_text(ggplot2::aes(label=paste0(Freq,'%')), vjust=-1) +
    ggplot2::theme_light()
  grDevices::pdf(file='test.pdf', height=6, width=6)
  print(P)
  grDevices::dev.off()

产生这个:

测试

标签: rggplot2labelbar-chartstacked-chart

解决方案


你可以试试

clono_df_long$Freq <- ifelse(clono_df_long$Cells == "Number_NonHit_Cells", clono_df_long$Freq, NA)

ggplot2::ggplot(clono_df_long, ggplot2::aes(x=Clonotype, y=Value, fill=Cells)) +
  ggplot2::geom_bar(stat="identity") +
  ggplot2::scale_fill_manual(values=c('gray70', 'gray40')) +
  #ggplot2::geom_text(ggplot2::aes(label=paste0(Freq,'%')), vjust=-1) +
  ggplot2::theme_light() +
  ggplot2::geom_text(aes(label = scales::percent(Freq/100) ),position = "stack") 
  

在此处输入图像描述


推荐阅读