Назначьте цвет точки в зависимости от значения столбца data.frame R
Это мой первый вопрос о SO, я надеюсь, что кто-то может помочь мне ответить на него.
Я читаю данные из CSV с R
с data<-read.csv("/data.csv")
и получить что-то вроде:
Group x y size Color
Medium 1 2 2000 yellow
Small -1 2 1000 red
Large 2 -1 4000 green
Other -1 -1 2500 blue
Цвет каждой группы может отличаться, они назначаются по формуле, когда csv
файл генерируется, но это все возможные цвета (количество групп также может варьироваться).
Я пытался использовать ggplot()
вот так:
data<-read.csv("data.csv")
xlim<-max(c(abs(min(data$x)),abs(max(data$x))))
ylim<-max(c(abs(min(data$y)),abs(max(data$y))))
data$Color<-as.character(data$Color)
print(data)
ggplot(data, aes(x = x, y = y, label = Group)) +
geom_point(aes(size = size, colour = Group), show.legend = TRUE) +
scale_color_manual(values=c(data$Color)) +
geom_text(size = 4) +
scale_size(range = c(5,15)) +
scale_x_continuous(name="x", limits=c(xlim*-1-1,xlim+1))+
scale_y_continuous(name="y", limits=c(ylim*-1-1,ylim+1))+
theme_bw()
Все правильно кроме цветов
- маленький нарисован синим
- Средний нарисован красным
- Другое нарисовано зеленым
- Большой нарисован желтый
Я заметил легенду в правильном порядке Групп по алфавиту (Большой, Средний, Другой, Маленький), но цвета остаются в csv
порядок файлов.
Вот скриншот сюжета.
Может кто-нибудь сказать мне, что отсутствует в моем коде, чтобы это исправить? другие подходы для достижения того же результата приветствуются.
2 ответа
Один из способов сделать это, как предложено help("scale_colour_manual")
использовать именованный символьный вектор:
col <- as.character(data$Color)
names(col) <- as.character(data$Group)
А затем карту values
аргумент шкалы к этому вектору
# just showing the relevant line
scale_color_manual(values=col) +
полный код
xlim<-max(c(abs(min(data$x)),abs(max(data$x))))
ylim<-max(c(abs(min(data$y)),abs(max(data$y))))
col <- as.character(data$Color)
names(col) <- as.character(data$Group)
ggplot(data, aes(x = x, y = y, label = Group)) +
geom_point(aes(size = size, colour = Group), show.legend = TRUE) +
scale_color_manual(values=col) +
geom_text(size = 4) +
scale_size(range = c(5,15)) +
scale_x_continuous(name="x", limits=c(xlim*-1-1,xlim+1))+
scale_y_continuous(name="y", limits=c(ylim*-1-1,ylim+1))+
theme_bw()
Ouput:
Данные
data <- read.table("Group x y size Color
Medium 1 2 2000 yellow
Small -1 2 1000 red
Large 2 -1 4000 green
Other -1 -1 2500 blue",head=TRUE)
Немного лучшее решение...
Я никогда не слышал о R, когда @scoa ответил на этот вопрос, и я не знаю, было ли доступно мое решение, но вы можете делать то, что просит OP, с немного меньшими усилиями, используя .
library(tidyverse)
data <- tribble(
~Group,~x,~y,~size,~Color,
"Medium",1,2,2000,"yellow",
"Small",-1, 2,1000,"red",
"Large",2,-1,4000,"green",
"Other",-1,-1,2500,"blue")
xlim<-max(c(abs(min(data$x)),abs(max(data$x))))
ylim<-max(c(abs(min(data$y)),abs(max(data$y))))
ggplot(data, aes(x = x, y = y, label = Group)) +
geom_point(aes(size = size, colour = Color), show.legend = TRUE) + # Set aes(colour = Color) (the column in the dataframe)
scale_color_identity() + # This tells ggplot to use the values explicit in the 'Color' column
geom_text(size = 4) +
scale_size(range = c(5,15)) +
scale_x_continuous(name="x", limits=c(xlim*-1-1,xlim+1))+
scale_y_continuous(name="y", limits=c(ylim*-1-1,ylim+1))+
theme_bw()
scale_color_identity()
Используя это, вам не нужно создавать отдельный именованный вектор, который вы делаете сscale_color_manual()
и вы можете напрямую использовать столбец «Цвет» (обратите внимание на изменение вgeom_point(aes(colour = Group,...
кgeom_point(aes(colour = Color,...
!!!).