Раскраска по коэффициенту в R

Я делаю диаграмму рассеяния двух переменных и хочу раскрасить точки факторной переменной. Вот воспроизводимый код:

data <- iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)

Это все хорошо, но как мне узнать, какой фактор был окрашен в какой цвет?


person LoveMeow    schedule 11.10.2011    source источник
comment
возможно library(ggplot2); qplot(Sepal.Length, Sepal.Width, data=iris, colour=Species) будет полезно   -  person Ben Bolker    schedule 11.10.2011
comment
упс, просто не видел вашего комментария при ответе.   -  person Matt Bannert    schedule 11.10.2011
comment
нет проблем, я поленился / поспешил правильно ответить   -  person Ben Bolker    schedule 11.10.2011


Ответы (6)


data<-iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)
legend(7,4.3,unique(data$Species),col=1:length(data$Species),pch=1)

должен сделать это за вас. Но я предпочитаю ggplot2 и предлагаю для лучшей графики в R.

person Maiasaura    schedule 11.10.2011
comment
Предлагать ggplot2 для улучшения графики в R просто неправильно. Стандартные функции построения графиков R имеют гораздо больший потенциал. - person Federico Giorgi; 20.03.2014
comment
Привет, я хотел бы отметить, что этот метод установки цветов для легенды может смешивать их. Лучше использовать метод ниже, в комментарии Джона. Назовите уровни вместо уникальных, чтобы получить возможные значения от фактора. - person eleanorahowe; 03.12.2014
comment
Ваш ответ сработал для меня, но как добиться того же результата с помощью ggplot2? - person thomasrive; 30.01.2016
comment
Будьте очень осторожны при использовании этого метода, поскольку цвета, как правило, не соответствуют цвету с этим кодом. Вам действительно нужно сначала добавить столбец для номера вида, затем отсортировать фрейм данных на основе интересующей переменной, затем построить график и указать этот номер вида для цвета. Или используйте уровни (), как упоминали другие, если это фактор. - person Adam Erickson; 19.02.2016
comment
Может ли кто-нибудь привести пример того, когда код в ответе дает такое смешение цветов для легенды, чтобы я мог лучше понять эту проблему? Я попытался создать его, но потерпел неудачу. Что я действительно хочу знать, так это то, как использование level () помогает нам в этой ситуации. Должен ли я опубликовать свой запрос как отдельный вопрос, связанный с этим? - person Anton; 15.03.2019
comment
Я разместил свои вопросы выше как отдельный вопрос здесь - person Anton; 15.03.2019

Команда palette сообщает вам цвета и их порядок, когда col = somefactor. Его также можно использовать для установки цветов.

palette()
[1] "black"   "red"     "green3"  "blue"    "cyan"    "magenta" "yellow"  "gray"   

Чтобы увидеть это на своем графике, вы можете использовать легенду.

legend('topright', legend = levels(iris$Species), col = 1:3, cex = 0.8, pch = 1)

Вы заметите, что я указал только новые цвета с тремя числами. Это будет работать как фактор. Я мог бы использовать коэффициент, который изначально использовался для окраски точек. Это заставит все логически соединиться вместе ... но я просто хотел показать, что вы можете использовать множество вещей.

Вы также можете уточнить цвета. Для начала попробуйте ?rainbow и продолжайте. Вы можете указать свое собственное или попросить R сделать это за вас. Пока вы используете один и тот же метод для каждого, все в порядке.

person John    schedule 11.10.2011

Как и Майасаура, я предпочитаю ggplot2. Прозрачный справочник - одна из причин. Однако это один из быстрых способов сделать это.

require(ggplot2)
data(diamonds)
qplot(carat, price, data = diamonds, colour = color)
# example taken from Hadley's ggplot2 book

И поскольку кто-то известный сказал, что посты, связанные с сюжетом, не будут полными без сюжета, вот результат:

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

Вот пара ссылок: пример qplot.R, обратите внимание, что в основном здесь используется тот же набор данных алмазов, который я использую , но перед этим обрезает данные, чтобы повысить производительность.

http://ggplot2.org/book/ руководство: http://docs.ggplot2.org/current/

person Matt Bannert    schedule 11.10.2011
comment
Как указано ниже, исходные данные имеют точки пересечения, поэтому удобно использовать stat_sum, например: ggplot(iris,aes(Sepal.Length,Sepal.Width,colour=Species))+ stat_sum(alpha=0.5,aes(size=factor(..n..))) - person Ben Bolker; 11.10.2011

Есть два известных мне способа покрасить точки графика по фактору, а затем автоматически создать соответствующую легенду. Я приведу примеры обоих:

  1. Использование ggplot2 (как правило, проще)
  2. Использование встроенных функций построения графиков R в сочетании с функцией colorRampPallete (сложнее, но многие люди предпочитают / нуждаются в встроенных средствах построения графиков R)

Для обоих примеров я буду использовать набор данных ggplot2 diamonds. Мы будем использовать числовые столбцы diamond$carat и diamond$price, а также факторный / категориальный столбец diamond$color. Вы можете загрузить набор данных с помощью следующего кода, если у вас установлен ggplot2:

library(ggplot2)
data(diamonds)

Использование ggplot2 и qplot

Это один лайнер. Ключевой момент здесь - указать qplot коэффициент, который вы хотите раскрасить, в качестве аргумента color. qplot по умолчанию сделает для вас легенду.

qplot(
  x = carat,
  y = price,
  data = diamonds,
  color = diamonds$color # color by factor color (I know, confusing)
)

Ваш результат должен выглядеть так:  qplot вывод, раскрашенный по коэффициенту алмаз $ color

Использование встроенных функций построения графиков R

Использование встроенных функций построения графиков R для получения графика, раскрашенного по коэффициенту и связанной с ним легенды, представляет собой четырехэтапный процесс, и он немного более технический, чем использование ggplot2.

Сначала мы создадим функцию colorRampPallete. colorRampPallete() возвращает новую функцию, которая сгенерирует список цветов. В приведенном ниже фрагменте вызов color_pallet_function(5) вернет список из 5 цветов по шкале от красного до оранжевого и синего:

color_pallete_function <- colorRampPalette(
  colors = c("red", "orange", "blue"),
  space = "Lab" # Option used when colors do not represent a quantitative scale
  )

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

num_colors <- nlevels(diamonds$color)
diamond_color_colors <- color_pallet_function(num_colors)

В-третьих, мы создаем наш сюжет. Это делается так же, как и любой другой график, который вы, вероятно, сделали, за исключением того, что мы ссылаемся на список цветов, который мы создали, как на наш col аргумент. Пока мы всегда используем один и тот же список, наше сопоставление цветов и diamond$colors будет согласованным во всем сценарии R.

plot(
  x = diamonds$carat,
  y = diamonds$price,
  xlab = "Carat",
  ylab = "Price",
  pch = 20, # solid dots increase the readability of this data plot
  col = diamond_color_colors[diamonds$color]
)

И, наконец, в-четвертых, мы добавляем легенду, чтобы кто-нибудь, читающий наш график, мог четко видеть соответствие между цветами точек графика и фактическими цветами ромбов.

legend(
  x ="topleft",
  legend = paste("Color", levels(diamonds$color)), # for readability of legend
  col = diamond_color_colors,
  pch = 19, # same as pch=20, just smaller
  cex = .7 # scale the legend to look attractively sized
)

Ваш результат должен выглядеть так:  стандартный вывод графика R, раскрашенный по коэффициенту ромбовидный $ color

Отлично, правда?

person Toby    schedule 15.10.2015

Аргумент col в функции plot автоматически назначает цвета вектору целых чисел. Если вы конвертируете iris$Species в число, обратите внимание, что у вас есть вектор 1,2 и 3s, поэтому вы можете применить это как:

plot(iris$Sepal.Length, iris$Sepal.Width, col=as.numeric(iris$Species))

Предположим, вам нужны красный, синий и зеленый вместо цветов по умолчанию, тогда вы можете просто настроить их:

plot(iris$Sepal.Length, iris$Sepal.Width, col=c('red', 'blue', 'green')[as.numeric(iris$Species)])

Вероятно, вы увидите, как дополнительно изменить приведенный выше код, чтобы получить любую уникальную комбинацию цветов.

person justin1.618    schedule 01.01.2016

Библиотека lattice - еще один хороший вариант. Здесь я добавил легенду с правой стороны и изменил точки, потому что некоторые из них перекрывались.

xyplot(Sepal.Width ~ Sepal.Length, group=Species, data=iris, 
       auto.key=list(space="right"), 
       jitter.x=TRUE, jitter.y=TRUE)

пример сюжета

person Aaron left Stack Overflow    schedule 11.10.2011
comment
+1 за lattice. Часто я слишком автоматичен, когда мне задают подобные вопросы. - person Matt Bannert; 11.10.2011