R ggplot2 исправляет текст условных обозначений на значение и цвет

#r #ggplot2 #colors

#r #ggplot2 #Цвет

Вопрос:

У меня есть список l чисел (в моем случае 3600, представляющих разные категории (0,2,3,4,5,6,7,8), которые я вычислил ранее). Теперь я хочу построить сетку, где каждое число в списке представляет определенный цвет (т. е. 0 -> всегда черный, 3 -> всегда оранжевый …).

Но вместо цифр я хочу объяснение категорий в легенде. И мой код отлично работает, когда все категории есть в моем списке. В некоторых случаях не каждая категория отображается в моем списке (зависит от данных).

Как я могу связать метку с категорией (номером), чтобы в любом случае был представлен правильный цвет или, скорее, правильное описание для цвета?

 # example list
l <- list(sample(c(0,2:8), 3600, replace = TRUE))

# building a data.frame for the grid
C <- as.data.frame(unlist(l))
colnames(C) <- c("category")

y.df <- rep(1:60, each = 60)
x.df <- rep(1:60, times = 60)
z.df <- rep(1:3600, times = 1)

C <- cbind(C, x = x.df, y = y.df, node_chem = z.df)

myColors <- c("black", "darkorchid1", "orange", "red",
              "springgreen", "darkgreen", "cyan", "white")
names(myColors) <- c ("0", "2", "3", "4", "5", "6", "7", "8")

ggplot(data=C, aes(x = x, y = y,  color = factor(C$category)))      
  geom_point()  

  # background = white
  theme_bw()  

  scale_color_manual(name= "category",
                     values= myColors,
                     labels = c("category 0", "category 2", "category 3", "category 4", 
                                "icategory 5", "category 6", "category 7", "category 8"))  

  #scale_colour_gradientn(colours=rainbow(4))  
  ggtitle("my map")
  

Здесь выводится результат, когда все категории были рассчитаны ранее:

введите описание изображения здесь

Комментарии:

1. Вы уже знаете, как использовать именованный вектор для значений в scale_color_manual . Почему бы не использовать другой именованный вектор для меток? Также рассмотрите возможность замены color = factor(C$category) на color = factor(category) . Нет необходимости использовать знак доллара внутри aes() .

2. Я не понимаю проблем. Не могли бы вы (a) использовать set.seed перед sample , чтобы ваши смоделированные данные были точно воспроизводимы? (b) Использовать пример меньшего размера, которому, возможно, будет легче следовать? 3600 точек может быть вашим реальным размером данных, но это может быть проще понять, если вы покажете нам, скажем, 36 точек. (c) Объясните немного больше, что вам нужно? Что не так с отображаемым вами графиком?

3. @Z.Лин: Спасибо … Я решил это с помощью второго именованного вектора…

Ответ №1:

Создайте столбец, содержащий метки категорий, затем вы можете добавить их в цветовую палитру.

 # example list
l <- list(sample(c(0,2:8), 3600, replace = TRUE))

# building a data.frame for the grid
C <- as.data.frame(unlist(l))
colnames(C) <- c("category")

y.df <- rep(1:60, each = 60)
x.df <- rep(1:60, times = 60)
z.df <- rep(1:3600, times = 1)

C <- cbind(C, x = x.df, y = y.df, node_chem = z.df)

myColors <- c("black", "darkorchid1", "orange", "red",
              "springgreen", "darkgreen", "cyan", "white")

# change the named vector to match the category labels
names(myColors) <- paste("category", c("0", "2", "3", "4", "5", "6", "7", "8"), sep = " ")

# make a new column containing the desired category labels
C$category2 <-  paste("category", C$category, sep = " ")

ggplot(data = C, aes(x = x, y = y,  color = factor(category2)))      
  geom_point()  

  # background = white
  theme_bw()  

  scale_color_manual(name= "category",
                     values= myColors)  

  ggtitle("my map")
  

Теперь, если вы удалите одну из категорий, она все равно будет работать, потому что ваш именованный вектор в scale_color_manual правильно отобразит цвет:

 ggplot(data = C[C$category != 0,], aes(x = x, y = y,  color = factor(category2)))      
geom_point()  

  # background = white
  theme_bw()  

  scale_color_manual(name= "category",
                     values= myColors)  

  ggtitle("my map")
  

введите описание изображения здесь

Комментарии:

1. Спасибо… но это сработало бы только тогда, когда я хотел бы использовать ярлыки типа «категория 0» и так далее … Но у меня есть такие названия, как «масло», «рыба» и так далее… Я действительно не знаю, как установить метки, когда в моих данных представлены не все категории

2. То, как я сконструировал метки категорий, относится только к вашему примеру.