Отдельный цвет шкалы для оси Y и точек данных - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь построить график, который имеет две разные цветовые шкалы. Первый предназначен для меток оси Y, а второй - для точек geom_points. Вот пример моих данных и кода, над которым я работаю.

library(tidyverse)
library(readxl)
library(scales)
library(ggplot2)

variable <- c("Var1","Var1","Var1","Var1","Var1","Var1","Var1","Var1","Var1","Var1","Var18","Var18","Var18","Var18","Var18","Var18","Var18","Var18","Var18","Var30","Var30","Var30","Var30","Var30","Var4","Var4","Var4","Var4","Var4","Var4","Var4","Var4","Var4","Var4","Var63","Var63","Var63","Var63","Var63")
Type <- c("Type1","Type1","Type1","Type1","Type1","Type1","Type1","Type1","Type1","Type1","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type3","Type3","Type3","Type3","Type3","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type2","Type2")
value <- c(8422,6795,5845,7348,5184,1035,481,401,873,1616,7.39099,9.913625,25.8478505,6.2130315,1.3530115,0.2089435,0.041442,5.855607,0.5863545,0.058472901,0.063211708,0.282500045,0.340304871,0.101131024,104,283,136,148,326,65,63,77,71,92,0.001131,9.20E-05,0.000267,0.000284,3.50E-05)
Class <- c("Class1","Class1","Class1","Class1","Class1","Class2","Class2","Class2","Class2","Class2","Class1","Class1","Class1","Class1","Class2","Class2","Class2","Class2","Class2","Class2","Class2","Class2","Class2","Class2","Class1","Class1","Class1","Class1","Class1","Class2","Class2","Class2","Class2","Class2","Class3","Class3","Class3","Class3","Class3")

dat <- data.frame(variable, Type, value, Class)
dat<- dat %>% group_by(variable) %>% mutate(upper = max(value))
dat.col <- dat %>% group_by(variable, Type) %>% summarise(upper = max(value)) %>% arrange(desc(upper))

type_filter <- ifelse(dat.col$Type == "Type1", "blue", ifelse(dat.col$Type == "Type2", "purple", "black"))
names(type_filter) <- as.character(dat.col$variable)

p1 <- ggplot(dat, aes(value, reorder(variable, upper)))+
  geom_point(aes(color=Class), size = 1, show.legend = TRUE)+
  geom_text(aes(label = Type, color = Type), alpha = 0)+
  scale_color_manual(values = c("Class3" = "grey40", "Class2" = "red", "Class1" = "chartreuse4",
                                "Type1" ="blue", "Type2"="purple", "Type3" = "black"),
                     guide = guide_legend((override.aes = list(alpha = 1))))+
  scale_x_log10(breaks = c(1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1, 1e+1, 1e+2, 1e+3, 1e+4, 1e+5),
                labels = trans_format("log10", math_format(10^.x)))+
  labs(x="xlab", y = "ylab", face = "bold")+
  guides(colour = guide_legend(override.aes = list(size=3)))+
  theme_bw(base_family = "serif", base_size = 12)+
  theme(legend.position = c(0.20, 0.90),
        legend.title = element_blank(),
        legend.background = element_blank(),
        legend.box.background = element_rect(colour = "black"),
        panel.grid.minor=element_blank(),
        panel.grid.major.y = element_blank(),
        panel.grid.major.x = element_line(linetype = "dotted", color = "black", size = 0.4),
        axis.text.y = element_text(face = "bold", color = type_filter),
        axis.text.x = element_text(face = "bold"))
print(p1)

При выводе этого кода не удается назначить правильные цветовые шкалы для меток оси y. Как вы можете видеть из изображения ниже, Var1, Var4 и Var63 имеют неправильные цвета. Var18 и Var30 верны, но я думаю, что это совпадение. Это лучшее, что я могу сделать. Даже если я удалю geom_plots и его цветовые шкалы, ось у все равно назначит неправильные цвета.

Как я могу это исправить? Plot p1

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Ваши цвета поменялись местами - ggplot предполагает, что Var63 является самым низким значением y, а Var1 самым высоким. Изменение порядка type_filter должно сработать, например:

axis.text.y = element_text(face = "bold", color = rev(type_filter)),
1 голос
/ 08 января 2020

Просто нужно отменить свой заказ по телефону axis.text.y:

p1 <- ggplot(dat, aes(value, reorder(variable, upper)))+
    geom_point(aes(color=Class), size = 1, show.legend = TRUE)+
    geom_text(aes(label = Type, color = Type), alpha = 0)+
    scale_color_manual(values = c("Class3" = "grey40", "Class2" = "red", "Class1" = "chartreuse4",
                                  "Type1" ="blue", "Type2"="purple", "Type3" = "black"),
                       guide = guide_legend((override.aes = list(alpha = 1))))+
    scale_x_log10(breaks = c(1e-6, 1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1, 1e+1, 1e+2, 1e+3, 1e+4, 1e+5),
                  labels = trans_format("log10", math_format(10^.x)))+
    labs(x="xlab", y = "ylab", face = "bold")+
    guides(colour = guide_legend(override.aes = list(size=3)))+
    theme_bw(base_family = "serif", base_size = 12)+
    theme(legend.position = c(0.20, 0.90),
          legend.title = element_blank(),
          legend.background = element_blank(),
          legend.box.background = element_rect(colour = "black"),
          panel.grid.minor=element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.major.x = element_line(linetype = "dotted", color = "black", size = 0.4),
          axis.text.y = element_text(face = "bold", color = rev(type_filter)), ## REVERSE ORDER ##
          axis.text.x = element_text(face = "bold"))
print(p1)

enter image description here

...