我有一个名为plot_df in R的数据帧,其 struct 如下:

# Import the library
library(ggplot2)

# Create a sample data
set.seed(123)
plot_df <- data.frame(gene = rep(paste0("ENSG", 1:10, ".17"), each = 2),
                      mean = rnorm(20, 0.5, 0.1),
                      sd = rnorm(20, 0.02, 0.01),
                      group = rep(c("group_a", "group_b"), 10))

我试图创建一个带有点和误差条的ggplot,其中y轴代表基因名称(作为离散标签),x轴代表平均值, colored颜色 代表组("group_a"或"group_b").下面是我使用的代码:

ggplot(plot_df, aes(y=gene)) + 
    geom_point(aes(x=mean, color = group), position = position_dodge(width=0.9)) + 
    geom_errorbar(aes(xmin=mean-sd, xmax=mean+sd, color = group), width=.2,
                 position=position_dodge(.9)) + 
    geom_vline(aes(xintercept=0.5), linetype=2, color = 'gray') + 
    theme_bw() + 
    theme(panel.background = element_blank(),
          panel.grid.major = element_blank(), 
          panel.grid.minor = element_blank())

enter image description here

但是,我想根据y轴上的基因名称更改面板的背景 colored颜色 (每个基因具有不同的 colored颜色 或相邻基因具有不同的 colored颜色 ).由于我的y轴标签是离散的,我不确定如何实现这一点.任何帮助都将不胜感激.谢谢!

我试过了:

Change background colour between day and night in ggplot2 in R

推荐答案

这是一个使用geom_tile()的解决方案,

  1. 我们为背景 colored颜色 创建了一个数据框
  2. 当我们使用geom_tile()时,我们将设置x美学,以便覆盖整个地块的宽度,并相应地调整每个平铺的宽度.
  3. geom_tile()使用x = sum(x_limits) / 2将切片定位在地块中心,使用width = diff(x_limits)将切片定位在地块的整个宽度上

library(ggplot2)
library(dplyr)

set.seed(123)
plot_df <- data.frame(
  gene = rep(paste0("ENSG", 1:10, ".17"), each = 2),
  mean = rnorm(20, 0.5, 0.1),
  sd = rnorm(20, 0.02, 0.01),
  group = rep(c("group_a", "group_b"), 10)
)

# df for background colors
bg_df <- plot_df %>%
  distinct(gene) %>%
  arrange(gene) %>% 
  mutate(color = ifelse(row_number() %% 2 == 1, "gold", "lightgrey"))

# x axis limts based on data 
x_limits <- range(plot_df$mean - plot_df$sd, plot_df$mean + plot_df$sd, na.rm = TRUE)

# the plot
ggplot(plot_df, aes(y = gene, x = mean)) +
  geom_tile(data = bg_df, aes(y = gene, x = sum(x_limits) / 2, width = diff(x_limits), fill = color), 
            alpha = 0.3, inherit.aes = FALSE) +
  geom_point(aes(color = group), position = position_dodge(width = 0.9)) +
  geom_errorbar(aes(xmin = mean - sd, xmax = mean + sd, color = group), 
                width = 0.2, position = position_dodge(.9)) +
  scale_color_manual(values = c("steelblue3", "red3"))+
  geom_vline(xintercept = 0.5, linetype = 2, color = 'gray80') +
  theme_bw() +
  theme(panel.background = element_blank(),
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        legend.position = "right") +
  scale_fill_identity()

enter image description here

R相关问答推荐

如何从其他前面列中减go 特定列的平均值?

从R中的另一个包扩展S3类的正确方法是什么

判断字符串中数字的连续性

R Highcharts与两个位置关联的注释

在RStudio中堆叠条形图和折线图

如何在R forestplot中为多条垂直线分配唯一的 colored颜色 ?

R spatstat Minkowski Sum()返回多个边界

用约翰逊分布进行均值比较

基于R中的间隔扩展数据集行

您是否可以将组添加到堆叠的柱状图

列名具有特殊字符时的循环回归

如何阻止围堵地理密度图?

错误包arrowR:READ_PARQUET/OPEN_DATASET&QOT;无法反序列化SARIFT:TProtocolException:超出大小限制&Quot;

如何显示准确的p值而不是<;0.001*?

对R中的列表列执行ROW Mean操作

如何获取R chromote中的当前URL?

将美学添加到ggploy中的文本标签

我怎么才能把一盘棋变成一盘棋呢?

如何根据顺序/序列从数据框中排除值

使用循环改进功能( struct 简单)