Назначьте цвет точки в зависимости от значения столбца 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,...!!!).

Другие вопросы по тегам