Ответ 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.
Я делаю график рассеяния двух переменных и хотел бы покрасить точки с помощью фактор-переменной. Вот некоторый воспроизводимый код:
data <- iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)
Это все хорошо и хорошо, но как я узнаю, какой фактор был окрашен в какой цвет?
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.
Команда 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 для вас. Пока вы используете один и тот же метод для каждого, вы в порядке.
Как Майасаура, я предпочитаю ggplot2
. Прозрачное справочное руководство является одной из причин.
Тем не менее, это один быстрый способ сделать это.
require(ggplot2)
data(diamonds)
qplot(carat, price, data = diamonds, colour = color)
# example taken from Hadley ggplot2 book
И заставьте кого-то знаменитого сказанного, сюжетные сообщения не полны без сюжета, вот результат:
Вот несколько ссылок: Пример qplot.R, обратите внимание, в основном это использует тот же набор данных алмаза, который я использую, но урожай данных прежде, чем получить лучшую производительность.
http://ggplot2.org/book/ руководство: http://docs.ggplot2.org/current/
Есть два способа, которыми я знаю, чтобы указать цветные точки по фактору, а затем также автоматически создать соответствующую легенду. Я приведу примеры обоих:
colorRampPallete
(сложнее, но многие предпочитают/нуждаются в встроенных средствах построения R)В обоих примерах я буду использовать набор данных бриллиантов ggplot2. Мы будем использовать числовые столбцы diamond$carat
и diamond$price
, а также фактор/категориальный столбец diamond$color
. Вы можете загрузить набор данных с помощью следующего кода, если у вас установлен ggplot2:
library(ggplot2)
data(diamonds)
Это один лайнер. Основной пункт здесь - дать qplot
коэффициент, который вы хотите пометить, как аргумент color
. qplot
по умолчанию сделает легенду.
qplot(
x = carat,
y = price,
data = diamonds,
color = diamonds$color # color by factor color (I know, confusing)
)
Ваш вывод должен выглядеть следующим образом:
Использование функции 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
)
Ваш вывод должен выглядеть следующим образом:
Ничего, правильно?
Библиотека lattice
- еще один хороший вариант. Здесь я добавил легенду с правой стороны и дрожал точки, потому что некоторые из них перекрывались.
xyplot(Sepal.Width ~ Sepal.Length, group=Species, data=iris,
auto.key=list(space="right"),
jitter.x=TRUE, jitter.y=TRUE)
Аргумент 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)])
Возможно, вы увидите, как изменить код выше, чтобы получить уникальную комбинацию цветов.