2012-06-19 28 views
12

Tôi có năm (5) geom_vline() trong cốt truyện của mình và tôi muốn chúng có màu khác nhau. Có cách nào làm được việc này không?ggplot2: Cách có một màu khác nhau của geom_vline()

Dưới đây là mã của tôi,

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

Và đây là kết quả,

enter image description here

Thông báo các năm dòng dọc trong cốt truyện, tôi muốn mỗi người trong số những dòng để có một màu sắc khác nhau ,

Tôi đã thử điều này

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

nhưng không hiệu quả, Một nỗ lực

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

và vẫn không thành công.

Cảm ơn trước!

Trả lời

26

Vì vậy, bạn đang loại thiếu ý tưởng cơ bản đằng sau ggplot2, đó là bạn luôn đặt tất cả dữ liệu của bạn vào một data.frame và mỗi thẩm mỹ mà bạn ánh xạ tương ứng với một biến trong khung dữ liệu của bạn.

Bạn có thể nhận được 5 đường thẳng đứng, mỗi màu có một màu khác nhau với năm cuộc gọi riêng biệt đến geom_vline nhưng điều đó bỏ qua điểm của toàn bộ gói. Thay vào đó, bạn tạo một khung dữ liệu:

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

tôi đã tạo ra một cách rõ ràng một nhóm biến grp để ánh xạ colour. Sau đó chúng ta thêm lớp và bản đồ thẩm mỹ để các biến sử dụng 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")) 

(Những màu sắc sẽ khó có thể phân biệt vì họ đường đứt nét, và hai trong số đó là gần trên đầu trang của mỗi khác.)

bạn sẽ nhận được nhiều hơn nữa ra khỏi ggplot2 nếu bạn chuyển ra khỏi qplot hướng ggplot() và bắt đầu đưa dữ liệu của bạn vào khung dữ liệu chứ không phải là vectơ.

+0

Vâng, cảm ơn vì đã nhắc nhở :) Tôi nên nghĩ về điều đó. Cảm ơn bạn rất nhiều! bạn tiết kiệm thời gian của tôi :) –

+0

Cảm ơn bạn rất nhiều @ joran! –

+0

Đó là một câu trả lời tuyệt vời, nó đã cho tôi một hướng đi đúng đắn khi làm điều gì đó tương tự. Tôi cần phải thêm geom_hlines vào trung bình của một cốt truyện với các nhóm khác nhau. Tôi đã có nghĩa là theo nhóm và sử dụng geom_hline như mô tả của bạn. Sự khác biệt là tôi đã sử dụng "linetype = grp" để có linetypes khác nhau và nó đã được bên trong cuộc gọi aes, thay vì được bên ngoài như được hiển thị ở đây. – Eduardo

1

Nếu bạn chỉ muốn đặt một dòng, hãy thêm geom sau đây sẽ thêm một đường thẳng đứng tại x=1 có màu đỏ và bị gạch ngang.

+ geom_vline(aes(xintercept=1), colour="#BB0000", linetype="dashed") 
Các vấn đề liên quan