Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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.

Ответ 2

Команда 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 для вас. Пока вы используете один и тот же метод для каждого, вы в порядке.

Ответ 3

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

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

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

enter image description here

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

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

Ответ 4

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

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

В обоих примерах я буду использовать набор данных бриллиантов ggplot2. Мы будем использовать числовые столбцы 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, окрашенный по фактору

Использование функции R, построенной в режиме графика

Использование функции R, построенной на основе графика, для получения графика, окрашенного множителем, и связанная с ним легенда - это 4-шаговый процесс, и это немного более технически, чем использование 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 script.

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-графика, цветной по фактору

Ничего, правильно?

Ответ 5

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

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

example plot

Ответ 6

Аргумент 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)])

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