Раскраска по коэффициенту в R - PullRequest
25 голосов
/ 11 октября 2011

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

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

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

Ответы [ 6 ]

49 голосов
/ 11 октября 2011
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.

37 голосов
/ 11 октября 2011

Команда 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)

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

19 голосов
/ 11 октября 2011

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

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

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

enter image description here

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

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

16 голосов
/ 15 октября 2015

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

  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 output colored by factor

Использование встроенных в 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
)

Ваш вывод должен выглядеть следующим образом: standard R plot output colored by factor

Изящно, верно?

11 голосов
/ 11 октября 2011

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

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

example plot

8 голосов
/ 01 января 2016

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

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)])

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

...