#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. То, как я сконструировал метки категорий, относится только к вашему примеру.