我正在使用ggplot中的hline为我正在寻找的数据集构建一个轴。基本上我想根据数据框选择性地为这个轴着色。该数据帧由(7684,7685,...,7853)数组组成,每个数组对应一个字母" a"," b"," c"和" d"。我想将每个字母对应的颜色用于在轴上为该间隔着色。
例如,此数据框的第1行是:(7684," c")所以我想要将轴上的间隔从7684到7685颜色为" c&#34 ;例如,这可能是红色的。我还没有想到一个直截了当的解决方案,我不确定hline是否可以解决这个问题。
> df
p nucleotide
1 c 7684
2 c 7685
3 t 7686
4 t 7687
5 a 7688
6 c 7689
7 a 7690
8 t 7691
9 a 7692
10 c 7693
我所谈论的小片段。基本上想要将df$p
与颜色相关联。并为相应的df$nucleotide
答案 0 :(得分:2)
您永远不会在for
中使用ggplot
循环,并且绝不应该在审美中使用df$..
。
library(dplyr)
library(ggplot2)
ggplot(df) +
geom_segment(aes(x = nucleotide, xend = lead(nucleotide), y = 1, yend = 1, color = p), size = 4)
#> Warning: Removed 1 rows containing missing values (geom_segment).
这让我们走了一半路。可以做的是从x
到xend
绘制一个细分。 x
映射到nucleotide
值,xend
映射到lead(nucleotide)
,表示下一个值。这当然会导致遗漏最后一行,因为它没有下一个值。
以下代码负责处理这一点,不可否认的是,在df
添加一行,然后限制scale_x
。 可能无法推广。
它还添加了一些图形装饰。
df %>%
add_row(p = '', nucleotide = max(.$nucleotide) + 1) %>%
ggplot() +
geom_segment(aes(x = nucleotide, xend = lead(nucleotide), y = 1, yend = 1, color = p), size = 4) +
geom_text(aes(x = nucleotide, y = 1, label = nucleotide), nudge_x = .5, size = 3) +
scale_x_continuous(breaks = NULL, limits = c(min(df$nucleotide), max(df$nucleotide) + 1)) +
scale_color_brewer(palette = 'Dark2', limits = c('a', 'c', 't'), direction = 1) +
theme(aspect.ratio = .2,
panel.background = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
axis.title.y = element_blank())
#> Warning: Removed 1 rows containing missing values (geom_segment).
#> Warning: Removed 1 rows containing missing values (geom_text).
df <- read.table(text = ' p nucleotide
1 c 7684
2 c 7685
3 t 7686
4 t 7687
5 a 7688
6 c 7689
7 a 7690
8 t 7691
9 a 7692
10 c 7693', header = T)