选择性地着色geom_hline

时间:2017-04-06 19:15:13

标签: r ggplot2 graphics

我正在使用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

的间隔着色

1 个答案:

答案 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).

这让我们走了一半路。可以做的是从xxend绘制一个细分。 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).

enter image description here

数据

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)