Постройте несколько строк (ряды данных), каждый из которых имеет уникальный цвет в R

Я довольно новичок в R, и у меня есть следующие запросы:

Я пытаюсь создать график в R, который имеет несколько строк (ряды данных). Каждая из этих строк является категорией, и я хочу, чтобы она имела уникальный цвет.

В настоящее время мой код настроен таким образом:

Во-первых, я создаю пустой сюжет:

plot(1,type='n',xlim=c(1,10),ylim=c(0,max_y),xlab='ID', ylab='Frequency') 

Затем для каждой моей категории я рисую линии на этом пустом участке, используя цикл «for», например:

 for (category in categories){ lines(data.frame.for.this.category, type='o', col=sample(rainbow(10)), lwd=2) } 

Здесь есть 8 категорий, и поэтому на участке имеется 8 строк. Как вы можете видеть, я пытаюсь выбрать цвет из функции rainbows (), чтобы генерировать цвет для каждой строки.

Однако, когда график сгенерирован, я обнаружил, что есть несколько строк, которые имеют один и тот же цвет. Например, 3 из этих 8 линий имеют зеленый цвет.

Как сделать, чтобы каждая из этих 8 строк имела уникальный цвет?

Кроме того, как я отражу эту уникальность в легенде о сюжете? Я пытался найти функцию legend() , однако неясно, какой параметр я должен использовать, чтобы отразить этот уникальный цвет для каждой категории?

Любая помощь или предложения будут высоко оценены.

Если ваши данные находятся в широком формате, matplot делается для этого и часто забывается о:

  dat <- matrix(runif(40,1,20),ncol=4) # make data matplot(dat, type = c("b"),pch=1,col = 1:4) #plot legend("topleft", legend = 1:4, col=1:4, pch=1) # optional legend 

Существует также дополнительный бонус для тех, кто не знаком с такими вещами, как ggplot что большинство параметров построения графика, таких как pch и т. Д., Одинаковы с использованием matplot() как plot() . введите описание изображения здесь

Если вы хотите использовать решение ggplot2 , вы можете сделать это, если сможете сформировать свои данные в этом формате (см. Пример ниже)

 # dummy data set.seed(45) df <- data.frame(x=rep(1:5, 9), val=sample(1:100, 45), variable=rep(paste0("category", 1:9), each=5)) # plot ggplot(data = df, aes(x=x, y=val)) + geom_line(aes(colour=variable)) 

ggplot2_geom_line

У вас есть правильная общая страtagsя для этого, используя базовую графику, но, как было указано, вы, по сути, говорите, что R выбирает случайный цвет из набора по 10 для каждой строки. Учитывая это, неудивительно, что вы будете иногда получать две строки одного цвета. Вот пример использования базовой графики:

 plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n") cl <- rainbow(5) for (i in 1:5){ lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b') } 

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

Обратите внимание на использование type = "n" для подавления всех графиков в исходном вызове для настройки windows и индексации cl внутри цикла for.

Используя фиктивные данные @Arun 🙂 здесь lattice решение:

 xyplot(val~x,type=c('l','p'),groups= variable,data=df,auto.key=T) 

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

Более одной строки можно рисовать на одной диаграмме, используя функцию lines()

 # Create the data for the chart. v <- c(7,12,28,3,41) t <- c(14,7,6,19,3) # Give the chart file a name. png(file = "line_chart_2_lines.jpg") # Plot the bar chart. plot(v,type = "o",col = "red", xlab = "Month", ylab = "Rain fall", main = "Rain fall chart") lines(t, type = "o", col = "blue") # Save the file. dev.off() 

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

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

Добавив: цвет в функции ggplot, я мог бы получить линии с разными цветами, относящимися к группе, присутствующей на графике.

 ggplot(data=Set6, aes(x=Semana, y=Net_Sales_in_pesos, group = Agencia_ID, colour = as.factor(Agencia_ID))) 

а также

 geom_line() 

Линейный график с несколькими цветами

Вот пример кода, который включает в себя легенду, если это интересно.

 # First create an empty plot. plot(1, type = 'n', xlim = c(xminp, xmaxp), ylim = c(0, 1), xlab = "log transformed coverage", ylab = "frequency") # Create a list of 22 colors to use for the lines. cl <- rainbow(22) # Now fill plot with the log transformed coverage data from the # files one by one. for(i in 1:length(data)) { lines(density(log(data[[i]]$coverage)), col = cl[i]) plotcol[i] <- cl[i] } legend("topright", legend = c(list.files()), col = plotcol, lwd = 1, cex = 0.5) 

Вот еще один способ добавить строки, используя plot() :

Сначала используйте функцию par(new=T)

опция:

http://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_addat.html

Чтобы покрасить их по-разному, вам понадобится col() .

Чтобы избежать описания лишних осей, используйте xaxt="n" и yaxt="n" для второго и последующих графиков.

В дополнение к ответу @ joran, используя функцию базового plot с циклом for , вы также можете использовать базовый plot :

 plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n") cl <- rainbow(5) invisible(lapply(1:5, function(i) lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b'))) 
  • Здесь invisible функция просто препятствует lapply чтобы lapply создавал вывод списка в вашей консоли (поскольку все, что нам нужно, это recursion, предоставляемая функцией, а не список).

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

Как вы можете видеть, он дает тот же результат, что и при использовании подхода for loop.

Так зачем использовать lapply ?

Было показано, что, как было показано, выполнение lapply выполняется быстрее / лучше, чем в R (например, см. Здесь , хотя см. Здесь для примера, где это не так), в этом случае он примерно примерно одинаково:

Увеличение числа строк до 50000 как для lapply и for подходов соответствовало моей системе 46.3 и 46.55 секунды.

  • Таким образом, хотя lapply было немного быстрее, это было пренебрежимо. Эта разница в скорости может пригодиться при более крупном / более сложном графике, но, честно говоря, 50000 строк, вероятно, довольно хороший потолок ...

Таким образом, ответ на вопрос «почему?»: Это просто альтернативный подход, который работает одинаково. 🙂

  • Малое изменение значения невидимо с помощью scale_colour_gradient2
  • Как установить цвета пули в списки UL / LI html через CSS без использования каких-либо изображений или тегов span
  • Как смешивать цвета «естественно» с C #?
  • Java - непрозрачный цвет
  • Как определить цвет шрифта в белом или черном в зависимости от цвета фона?
  • Давайте будем гением компьютера.