2013-02-13 31 views
52

Tôi khá mới đối với R và tôi có các truy vấn sau:Vẽ nhiều dòng (chuỗi dữ liệu) với màu duy nhất trong R

Tôi đang cố gắng tạo một ô trong R có nhiều dòng (chuỗi dữ liệu) . Mỗi dòng này là một danh mục và tôi muốn nó có một màu duy nhất.

Hiện nay mã của tôi được thiết lập theo cách này:

Trước tiên, tôi đang tạo ra một âm mưu trống:

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

Sau đó, đối với mỗi loại của tôi, tôi đang âm mưu dòng trong âm mưu trống này bằng một "for" loop như vậy:

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

Có 8 danh mục ở đây và do đó có 8 dòng được tạo ra trong cốt truyện. Như bạn có thể thấy, tôi đang cố gắng lấy mẫu màu từ hàm cầu vồng() để tạo màu cho mỗi dòng.

Tuy nhiên, khi cốt truyện được tạo, tôi thấy rằng có nhiều dòng có cùng màu. Ví dụ, 3 trong số 8 dòng có màu xanh lá cây.

Làm cách nào để làm cho mỗi 8 dòng này có màu duy nhất?

Ngoài ra, làm cách nào để phản ánh tính độc đáo này trong truyền thuyết của cốt truyện? Tôi đã cố gắng tìm kiếm các chức năng legend(), tuy nhiên nó không phải là rõ ràng tham số tôi nên sử dụng để phản ánh màu sắc độc đáo này cho mỗi thể loại?

Bất kỳ trợ giúp hoặc đề xuất nào sẽ được đánh giá cao.

+2

YOu có thể muốn thay đổi col = category, sau đó bạn có thể thấy các màu khác nhau cho mỗi chuỗi. Bạn có thể cho chúng tôi dữ liệu mẫu để làm việc không? ggplot2 có thể là một lựa chọn dễ dàng hơn cho việc này. –

Trả lời

41

Nếu bạn muốn có một giải pháp ggplot2, bạn có thể làm điều này nếu bạn có thể định hình dữ liệu của bạn sang định dạng này (xem ví dụ dưới đây)

# 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

21

Bạn có chiến lược chung phù hợp với làm điều này bằng cách sử dụng đồ họa cơ sở, nhưng như đã được chỉ ra bạn đang cơ bản nói với R để chọn một màu sắc ngẫu nhiên từ một bộ 10 cho mỗi dòng. Cho rằng, nó không đáng ngạc nhiên rằng đôi khi bạn sẽ nhận được hai dòng với cùng một màu sắc. Dưới đây là một ví dụ sử dụng đồ họa cơ sở:

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') 
} 

enter image description here

Lưu ý việc sử dụng type = "n" để ngăn chặn tất cả các âm mưu trong cuộc gọi ban đầu để thiết lập các cửa sổ, và lập chỉ mục của cl bên trong vòng lặp for.

+0

(Imo) một giải pháp tuyệt vời cho người mới bắt đầu trong R :) –

58

Nếu dữ liệu của bạn trong wide formatmatplot được làm cho điều này và thường bị bỏ quên về:

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 

Ngoài ra còn có thêm tiền thưởng cho những người không quen với những thứ như ggplot rằng hầu hết các tham số được âm mưu như pch vv là giống nhau bằng cách sử dụng matplot()plot(). enter image description here

+1

Cảm ơn bạn rất nhiều vì đã chỉ ra điều này! – SirRichie

7

Sử dụng dữ liệu giả @Arun :) đây là một giải pháp lattice:

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

enter image description here

2

Dưới đây là mô tả đẹp như thế nào để thêm dòng để

lô()

sử dụng chức năng -

mệnh (mới = T)

tùy chọn

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

Để tô màu chúng khác nhau, bạn sẽ cần

col()

tùy chọn. Để tránh thừa trục giới thiệu sử dụng

xaxt = "n"

yaxt = "n"

cho lô thứ hai và tiếp tục.

1

Đây là mã mẫu bao gồm chú thích nếu đó là sở thích.

# 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) 
2

tôi biết, cũ một bài để trả lời nhưng cũng giống như tôi đi qua tìm kiếm một bài, người khác có thể rẽ đây cũng

Bằng cách thêm: màu sắc trong chức năng ggplot, tôi có thể đạt được các dòng có các màu khác nhau liên quan đến nhóm hiện diện trong ô.

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

geom_line() 

Line Graph with Multiple colors

3

Hơn một dòng có thể được vẽ trên bảng xếp hạng tương tự bằng cách sử dụng các chức năng 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() 

OUTPUT enter image description here

Các vấn đề liên quan