Чередование цветов полос по группам при чередовании цвета фона и поддержании порядка меток по оси X (ggplot2) - PullRequest
1 голос
/ 05 октября 2019

Общая информация

Я использую пакет ggplot2 в R для отображения некоторых данных, в которых я заинтересован в построении каждой строки моего фрейма данных в виде отдельной панели с использованием geom_col. Каждый столбец связан с группой, которая должна быть нанесена на один и тот же цвет, и поверх этого я бы хотел чередовать цвет фона, используя geom_rect, где фон будет охватывать несколько групп.

У меня также нетвыяснили, как построить фон без отдельного вызова geom_rect для каждого фона. В моем реальном примере мне нужно было бы выполнить 24 вызова geom_rect, и, несомненно, должен быть лучший способ (см. Попытку под заголовком " Пример geom_rect за один вызов ").

Ниже приведен мой код на некоторых тестовых данных, где он почти работает.

Я на самом деле вполне доволен результатом, но у меня есть две проблемы.

  1. Должен быть лучший способ вызова вызова geom_rect без потери порядка на оси x, поэтому решение под заголовком " Пример geom_rect за один вызов"пока не подходит для цели.
  2. Я хочу иметь возможность контролировать цвет полос для каждой группы. Обычно я использовал бы scale_fill_manual (values ​​= c ("my_colors")), но это переопределяет цвет прямоугольников на заднем плане.
##Generate simul data
gene_list <- c("CHEK2", "AML", "TP53", "AKT1", "ATRX", "CDK4")
df <- data.frame(x = gene_list, y = rnorm(6))
df$grp <- c( rep(c(1),3), rep(c(2), 3) )
df$col  <- c( rep(c("grey"),3), rep(c("blue"), 3) )
df_rec <- data.frame(xmin = c("CHEK2", "AKT1"), xmax = c("TP53", "CDK4"), ymin = c(-Inf, -Inf), ymax=c(Inf, Inf), col=c("red", "blue"))

##Reformat order
my_factor <- factor(gene_list, levels = gene_list)
df$x <- my_factor

##Create barplot
ggplot() +

  geom_rect(data = df_rec, 
            aes(
              fill=df_rec$col[1],
              alpha=), 
            xmin = as.numeric(df$x[df$x == as.character(df_rec$xmin[1])]) - 0.45,
            xmax = as.numeric(df$x[df$x == as.character(df_rec$xmax[1])]) + 0.55,
            ymin = -Inf, 
            ymax = Inf)  +
  geom_rect(data = df_rec, 
            aes(
              fill=df_rec$col[2],
              alpha=1), 
            xmin = as.numeric(df$x[df$x == as.character(df_rec$xmin[2])]) - 0.45,
            xmax = as.numeric(df$x[df$x == as.character(df_rec$xmax[2])]) + 0.45,
            ymin = -Inf, 
            ymax = Inf) +

  geom_col(df, mapping = aes(x = x, y=y, fill = as.character(grp)))

enter image description here

Пример geom_rect за один вызов

Использование тех же данных, которые указаны в приведенном выше коде.

Всякий раз, когда я пытался использовать df_rec, который имеет ограничения для каждого прямоугольника, я теряю порядок моих меток на оси x, контролирую раскраску прямоугольников и не могу настроить geom_rect xmin иПоложение xmax, как я делал в приведенном выше коде, без подсказки об ошибке " Дискретное значение передано в непрерывную шкалу "

(Отредактировано) Я забыл добавить, что установка уровней факторовпорядок, который я хочу для xmin и xmax, по-прежнему неправильно упорядочивает столбцы.

##Reformat order
my_factor <- factor(gene_list, levels = gene_list)
df$x <- my_factor

ggplot() +
  geom_rect(data = df_rec, 
            aes(
              alpha=1,
              xmin = factor(df_rec$xmin, levels=levels(df$x)),
              xmax = factor(df_rec$xmax, levels=levels(df$x)),
              ymin = -Inf, 
              ymax = Inf),
            fill = df_rec$col
  ) +
  geom_col(df, mapping = aes(x = x, y=y), fill = df$col)

enter image description here

Спасибо всем, кто нашел время, чтобы посмотретьна это.

1 Ответ

0 голосов
/ 10 октября 2019

Мне удалось решить это в конце концов. Ниже приводится объяснение того, как я решил это. В конце концов, это оказалось довольно легко исправить.

Я рекомендую подробно прочитать функцию aes, используемую для отображения данных, поскольку существует явная разница в раскраске интересующих вас участков графика внутри или вне функции aes. К сожалению, я не могу дать вам точный ответ о том, как работает AES, но я могу сообщить вам, как я это исправил в моем случае.

Простой ответ -. Если вы хотите контролировать цвет каждого отдельного столбца / прямоугольника (как я это делаю в моем случае), вам лучше явно определить его как столбец в вашем фрейме данных и вызвать функцию заполнения за пределами aes.

Также, если вы хотите установить определенный порядок ваших дискретных меток на оси X. Это можно сделать с помощью функции scale_x_discrete, в которой вы можете явно указать порядок, передав вектор с порядком ограничений, как показано в приведенном ниже коде.

Успешный пример

##Generat simul data
gene_list <- c("CHEK2", "AML", "TP53", "AKT1", "ATRX", "CDK4")
df <- data.frame(x = gene_list, y = rnorm(6))
df$grp <- c( rep(c(1),3), rep(c(2), 3) )
df$col  <- c( rep(c("grey"),3), rep(c("blue"), 3) )
df_rec <- data.frame(xmin = c("CHEK2", "AKT1"), xmax = c("TP53", "CDK4"), ymin = c(-Inf, -Inf), ymax=c(Inf, Inf), col=c("red", "blue"))

##Reformat order
my_factor <- factor(gene_list, levels = gene_list)
df$x <- my_factor

##Succesful test of barplot in configurations i wanted!!!
ggplot() +
  geom_rect(data = df_rec, 
            aes(alpha=1),
            xmin = as.numeric(factor(df_rec$xmin, levels=levels(df$x))) - 0.45,
            xmax = as.numeric(factor(df_rec$xmax, levels=levels(df$x))) + 0.55,
            ymin = -Inf, 
            ymax = Inf,
            fill = df_rec$col
  ) +
  geom_col(df, mapping = aes(x = x, y=y), fill = df$col) +
  scale_x_discrete(limits=c("CHEK2","AML","TP53","AKT1","ATRX","CDK4"))

Спасибо всем, кто взглянул на это.

...