Ggplot2: Как иметь другой цвет geom_vline()

У меня есть пять (5) geom_vline() в моем сюжете, и я хочу, чтобы у них были разные цвета. Есть ли способ сделать это?

Здесь мои коды,

library(ggplot2)

x <- seq(-7, 8, length = 90)
tvalues <- dt(x,15)

qplot(x, tvalues) + geom_polygon(fill = "purple", colour = "purple", alpha = 0.5) + 
  geom_point(fill = "purple", colour = "purple", alpha = 0.2, pch = 21) +
  geom_vline(xintercept = c(a <- c(-2.27685371,  0.01661155,  
  0.33598194,  1.92426022), mean(a)), linetype = "dashed", colour = "red") + theme_bw() + xlab(bquote(bold('Average Tensile Strength (lb/in'^'2'*')'))) +
  ylab(expression(bold(P(x)))) +
  opts(title = expression(bold("Student t Distribution")), plot.title = theme_text(size = 20, colour = "darkblue"),
       panel.border = theme_rect(size = 2, colour = "red"))

И вот вывод,

enter image description here

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

Я пробовал это

library(colorRamps)
geom_vline(xintercept = c(a <- c(-2.27685371,  0.01661155,  
   0.33598194,  1.92426022), mean(a)), linetype = "dashed", colour = matlab.like(5)) 

но не работает, Еще одна попытка

geom_vline(xintercept = c(a <- c(-2.27685371,  0.01661155,  
   0.33598194,  1.92426022), mean(a)), linetype = "dashed", colour = c("red","blue","green","yellow","orange"))

и все еще не увенчались успехом.

Спасибо заранее!

Ответ 1

Итак, вы теряете основную идею ggplot2, которая заключается в том, что вы всегда помещаете все свои данные в data.frame, и каждая эстетика, которую вы сопоставляете, соответствует переменной в ваших данных кадр.

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

a <- c(-2.27685371,0.01661155,0.33598194,1.92426022)
vlines <- data.frame(xint = c(a,mean(a)),grp = letters[1:5])

Я явно создал переменную группировки grp для сопоставления с colour. Затем мы добавляем слой и сопоставляем эстетику с этими переменными с помощью aes:

qplot(x, tvalues) + 
  geom_polygon(fill = "purple", colour = "purple", alpha = 0.5) + 
  geom_point(fill = "purple", colour = "purple", alpha = 0.2, pch = 21) +
  geom_vline(data = vlines,aes(xintercept = xint,colour = grp), linetype = "dashed") + 
  theme_bw() + 
  xlab(bquote(bold('Average Tensile Strength (lb/in'^'2'*')'))) +
  ylab(expression(bold(P(x)))) +
  opts(title = expression(bold("Student t Distribution")), 
       plot.title = theme_text(size = 20, colour = "darkblue"),
       panel.border = theme_rect(size = 2, colour = "red"))

(Цвета будут трудно отличить, потому что они пунктирные линии, а два из них почти на вершине друг друга.)

Вы получите гораздо больше ggplot2, если вы перейдете от qplot к ggplot() и начнете помещать свои данные в кадры данных, а не в векторы.

Ответ 2

Если вы просто хотите поместить одну строку, добавив следующий geom, добавьте вертикальную линию в x=1 в красный цвет и пунктир.

+ geom_vline(aes(xintercept=1), colour="#BB0000", linetype="dashed")