绘制带有重复标签的条形图

时间:2019-03-13 12:48:34

标签: r ggplot2

我想用条形图的形式用重复的x轴标签绘制数据,而不必将值与重复的标签合并。

在示例中,我有一个表de

Table with data

de <- data.frame(mean=c(10, 2, 3, 1, 4, 5, 3, 9),
                 base=c('A','A','C','G','T','T','T','A'))

我想要一个这样的情节:

correct plot

但是当我在R中运行它时

ggplot(de, aes( y = mean, x =base))+
    geom_bar(stat = 'identity')

这就是我得到的:

wrong plot

它将相同的碱基合并为一列,而我想要每个base值(甚至是重复的值)都单独列,如上表所示。

3 个答案:

答案 0 :(得分:1)

简单的方法是:

  • 在“基本”列中为As和Ts设置非唯一标签;例如Ax,Ay,Tx,Ty等:
de <- data.frame(mean=c(10, 2, 3, 1, 4, 5, 3, 9), 
  base=c("Ax", "Ay", "C", "G", "Tx","Ty", "Tz", "A"))

然后更改x轴标签:

ggplot(de, aes( y = mean, x =base))+ 
  geom_bar(stat = 'identity') + 
  scale_x_discrete(labels=c("A", "A", "C", "G", "T","T", "T", "A"))

答案 1 :(得分:0)

尽管已经有一个公认的解决方案,但我将发布另一个解决方案,从原始数据集中创建所需的标签。

首先,是一个示例数据集创建代码。

set.seed(1234)
values <- sample(20, 8)
base <- c('A', 'A', 'C', 'G', 'T', 'T', 'T', 'A')
de <- data.frame(base, values)

现在使用代码绘制图形。

library(tidyverse)

de %>%
  mutate(base1 = paste0(seq_along(base), base)) %>%
  ggplot(aes(x = base1, y = values)) +
  geom_bar(stat = 'identity') +
  geom_text(aes(x = base1, y = -1,
                 label = base)) +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank())

enter image description here

答案 2 :(得分:0)

基于@sargg的出色答案,我们可以通过使用dplyr自动生成唯一的基本名称和ggplot标签来防止人为错误的可能性:

library(dplyr)
de2 <- de %>%
    group_by(base) %>%
    mutate(unique_base = paste0(base, row_number()))

# A tibble: 8 x 3
# Groups:   base [4]
   mean base  unique_base
  <dbl> <fct> <chr>      
1    10 A     A1         
2     2 A     A2         
3     3 C     C1         
4     1 G     G1         
5     4 T     T1         
6     5 T     T2         
7     3 T     T3         
8     9 A     A3 

ggplot(de2, aes(y = mean, x =unique_base))+ 
    geom_bar(stat = 'identity') + 
    scale_x_discrete(labels=de2$base)

enter image description here

对于一个均匀的DRY-er答案,我们可以像这样传递数据(注意花括号:有关详细信息,请参见this answer

de2 %>% {
    ggplot(., aes( y = mean, x =unique_base))+ 
        geom_bar(stat = 'identity') + 
        scale_x_discrete(labels=.$base)
}

这使我们可以使用de2ggplot调用中访问.数据帧,从而使我们可以使用labels=.$base指定标签,而不必指定数据帧de2两次。