2013-07-09 43 views
28

Tôi có thể vẽ đồ thị phân tán và tô màu các điểm dựa trên một tiêu chí, nghĩa là tôi có thể tô màu tất cả các điểm> = 3 bằng màu đỏ và phần còn lại là màu đen. Tôi rất thích để có thể đến các điểm màu trong thời trang này:Điểm phân tán màu R dựa trên giá trị

  1. = 3 màu đỏ

  2. < = 1 màu xanh
  3. Phần còn lại là màu đen

Mã tôi dưới đây hoàn tất bước 1 và 3 nhưng tôi không chắc chắn cách kết hợp đối số thứ hai của bước 2

data<- read.table('sample_data.txtt', header=TRUE, row.name=1) 
pos<- data$col_name1 
cn<- data$col_name2 
plot(pos,cn, ylim=c(0,5), col="blue") 
plot(pos,cn, col=ifelse(cn>=3,"red","black"), ylim=c(0,10)) 

Mọi trợ giúp sẽ tuyệt vời !!! Cảm ơn trước

enter image description here

Trả lời

40

điều tốt nhất để làm ở đây là thêm một cột để các đối tượng dữ liệu để biểu thị màu điểm. Sau đó cập nhật các phần của nó bằng cách lọc.

data<- read.table('sample_data.txtt', header=TRUE, row.name=1) 
# Create new column filled with default colour 
data$Colour="black" 
# Set new column values to appropriate colours 
data$Colour[data$col_name2>=3]="red" 
data$Colour[data$col_name2<=1]="blue" 
# Plot all points at once, using newly generated colours 
plot(data$col_name1,data$col_name2, ylim=c(0,5), col=data$Colour, ylim=c(0,10)) 

Cần phải rõ ràng cách điều chỉnh điều này cho các ô có nhiều màu sắc hơn & điều kiện.

+0

hoạt động như một sự quyến rũ! – Jcrow06

+10

'cắt' sẽ tốt hơn cho việc tạo cột mới, tức là' dữ liệu $ Màu <- cắt (dữ liệu $ col_name2, ngắt = c (-Inf, 1, 3, Inf), nhãn = c ("xanh", "đen "," đỏ "))'. Giữ nó thành một hàng, và thậm chí dễ dàng tổng quát hơn – Gregor

+0

Điều đó thật tuyệt, tôi không biết về việc cắt! – CnrL

14

Ngoài ra nó muốn làm việc để chỉ định ifelse() hai lần:

plot(pos,cn, col= ifelse(cn >= 3, "red", ifelse(cn <= 1,"blue", "black")), ylim = c(0, 10)) 
+1

Cả hai ansers đều tuyệt vời! Tôi thậm chí không thể đổ lỗi cho nó vào thứ hai vì thiếu ifelse lồng nhau – Jcrow06

+0

Tôi thích điều này, rất thanh lịch. Tất cả những gì tôi có thể nói để bảo vệ sự thay thế của tôi là nó sẽ mở rộng quy mô rõ ràng hơn cho các vấn đề cần nhiều màu hơn. – CnrL

2

Nó tốt hơn để tạo một biến yếu tố mới sử dụng cắt(). Tôi đã thêm một vài tùy chọn bằng cách sử dụng ggplot2.

df <- data.frame(
    X1=seq(0, 5, by=0.001), 
    X2=rnorm(df$X1, mean = 3.5, sd = 1.5) 
) 

# Create new variable for plotting 
df$Colour <- cut(df$X2, breaks = c(-Inf, 1, 3, +Inf), 
       labels = c("low", "medium", "high"), 
       right = FALSE) 

### Base Graphics 

plot(df$X1, df$X2, 
    col = df$Colour, ylim = c(0, 10), xlab = "POS", 
    ylab = "CS", main = "Plot Title", pch = 21) 

plot(df$X1,df$X2, 
    col = df$Colour, ylim = c(0, 10), xlab = "POS", 
    ylab = "CS", main = "Plot Title", pch = 19, cex = 0.5) 

# Using `with()` 

with(df, 
    plot(X1, X2, xlab="POS", ylab="CS", col = Colour, pch=21, cex=1.4) 
    ) 

# Using ggplot2 
library(ggplot2) 

# qplot() 
qplot(df$X1, df$X2, colour = df$Colour) 

# ggplot() 
p <- ggplot(df, aes(X1, X2, colour = Colour)) 
p <- p + geom_point() + xlab("POS") + ylab("CS") 
p 

p + facet_grid(Colour~., scales = "free") 
+0

sử dụng "với", cách tiếp cận cơ bản không hoạt động: df <- data.frame (X1 = seq (0, 5, by = 0,001)) df $ X2 <- rnorm (df $ X1, mean = 3,5, sd = 1.5) df $ Màu <- "trung bình" df $ Màu [df $ X2> = 3] = "cao" df $ Màu [df $ X2 <= 1] = "thấp" với (df, lô (X2 , xlab = "X2", ylab = "số"), , ylim = c (20,75), pch = 21, cex = 1,4, col = Màu) –

+0

Nó hoạt động, bạn vừa thực hiện một lỗi cú pháp trong cuộc gọi 'plot()' của bạn. Tôi đã chỉnh sửa câu trả lời và thêm phiên bản của bạn. – marbel

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