我想用条形图的形式用重复的x轴标签绘制数据,而不必将值与重复的标签合并。
在示例中,我有一个表de
:
de <- data.frame(mean=c(10, 2, 3, 1, 4, 5, 3, 9),
base=c('A','A','C','G','T','T','T','A'))
我想要一个这样的情节:
但是当我在R中运行它时
ggplot(de, aes( y = mean, x =base))+
geom_bar(stat = 'identity')
这就是我得到的:
它将相同的碱基合并为一列,而我想要每个base
值(甚至是重复的值)都单独列,如上表所示。
答案 0 :(得分:1)
简单的方法是:
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())
答案 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)
对于一个均匀的DRY-er答案,我们可以像这样传递数据(注意花括号:有关详细信息,请参见this answer)
de2 %>% {
ggplot(., aes( y = mean, x =unique_base))+
geom_bar(stat = 'identity') +
scale_x_discrete(labels=.$base)
}
这使我们可以使用de2
从ggplot
调用中访问.
数据帧,从而使我们可以使用labels=.$base
指定标签,而不必指定数据帧de2
两次。