2009-09-02 37 views
6

Tôi có dữ liệu giống như this.Cách xếp chồng nhiều đường cong mật độ vào một ô trong R

Và tôi dự định tạo nhiều đường cong mật độ thành một ô, trong đó mỗi đường cong tương ứng với ID duy nhất.

Tôi đã cố gắng sử dụng gói "sm", với mã này nhưng không thành công.

library(sm) 
dat <- read.table("mydat.txt"); 
plotfn <- ("~/Desktop/flowgram_superimposed.pdf"); 
pdf(plotfn); 

sm.density.compare(dat$V1,dat$V2, xlab = "Flow Signal") 
colfill <- c(2:10); 
legend(locator(1), levels(dat$V2), fill=colfill) 

dev.off(); 

Vui lòng cho biết cách làm đúng hoặc nếu có cách khác để thực hiện?

Tôi đang cố gắng để có được loại âm mưu này ở cuối. figure http://img524.imageshack.us/img524/2736/testl.png

+2

Đặt câu hỏi tại đây _and_ trong danh sách R cùng một lúc: Không được mát mẻ. http://www.nabble.com/Howto-Superimpose-Multiple-Density-Curves-Into-One-Plot-td25254899.html –

+0

Tôi không chắc mình hiểu tại sao, xem xét rằng vẫn chưa có nhiều điều chồng chéo giữa hai nhóm người dùng. Bạn có thể giải thích lý do tại sao điều đó không nên được thực hiện? –

+1

"Đăng nhiều tài khoản là một sự lãng phí băng thông, tiền bạc và thời gian của mọi người, không có lợi thế gì, và không bao giờ nên được thưởng thức." http://bit.ly/Ja5n1. Mặc dù hai lý do đầu tiên là ít quan trọng trong những ngày này, tôi làm giá trị thời gian của tôi và không thích đọc cùng một thông điệp trong nhiều danh sách. –

Trả lời

11

Hãy thử sử dụng ggplot2:

dnow <- read.table("http://dpaste.com/88561/plain/") 
library(ggplot2) 
qplot(V1, colour=factor(V2), data=dnow, geom="density") 
+0

Giải pháp tuyệt vời cho thấy sức mạnh của ggplot2! –

+1

liên kết không hoạt động nữa. Bằng cách này tôi không thể understadn tốt những gì giải pháp của bạn không. Bạn có thể sửa liên kết không? Cảm ơn ... –

+3

@Manoel 'qplot (mtcars $ drat, color = factor (mtcars $ cyl), dữ liệu = mtcars, geom =" density ")' nên cung cấp cho bạn một ví dụ chức năng. – Unode

3

Sử dụng đồ họa cơ bản trong một spaghetti mã thời trang:

plot.multi.dens <- function(s) 
{ 
junk.x = NULL 
junk.y = NULL 
for(i in 1:length(s)) 
{ 
junk.x = c(junk.x, density(s[[i]])$x) 
junk.y = c(junk.y, density(s[[i]])$y) 
} 
xr <- range(junk.x) 
yr <- range(junk.y) 
plot(density(s[[1]]), xlim = xr, ylim = yr, main = "") 
for(i in 1:length(s)) 
{ 
lines(density(s[[i]]), xlim = xr, ylim = yr, col = i) 
} 
} 
dnow <- read.table("http://dpaste.com/88561/plain/") 
library(sqldf) 
x <- unlist(sqldf("select V1 from dnow where V2==0")) 
y <- unlist(sqldf("select V1 from dnow where V2==1")) 
z <- unlist(sqldf("select V1 from dnow where V2==2")) 
plot.multi.dens(list(x,y,z)) 
library(Hmisc) 
le <- largest.empty(x,y,.1,.1) 
legend(le,legend=c("x","y","z"), col=(1:3), lwd=2, lty = 1) 
+3

Mục đích của việc sử dụng sqldf ở đây là gì? Đó là nghĩa đen là một trăm lần chậm hơn subscripting: x <- với (dnow, V1 [V2 == 0]) –

+0

Bạn đang phải. Nhưng tôi thích gói sqldf và cách tiếp cận vì vậy tôi có xu hướng sử dụng nó trong một thời trang không-não ;-) – Paolo

1

tôi thấy mình cần phải làm điều này rất nhiều khi nhìn vào dữ liệu microarray, vì vậy tôi được cuộn lên như một phần của thư viện mã tiện ích mà tôi giữ trên github: ARE.utils, cụ thể là chức năng plot.densities.

Nó sử dụng đồ họa cơ bản để bạn có thể lấy cảm hứng từ chức năng để tạo riêng của bạn, hoặc chỉ cần mang nó bán buôn (nhưng nó dựa trên một số các chức năng khác trong thư viện đó):

  1. create.densities, mà chuyển đổi danh sách/ma trận/v.v. của dữ liệu thành danh sách mật độ; và
  2. match.dim chức năng (chuyển đổi thứ nguyên "tên" thành trục số).

(Bạn có thể tùy chọn, cài đặt toàn bộ gói, nhưng tôi không hứa rằng các chức năng trong đó sẽ không thay đổi theo một số cách không tương thích ngược).

Không khó để viết chức năng như vậy của riêng bạn, nhưng chỉ cần đảm bảo rằng bạn có chức năng chọn phạm vi chính xác trên trục và nội dung. Dù sao, sau đó bạn sẽ sử dụng mã như sau:

library(ARE.utils) 
# Create a matrix dataset with separate observations in columns 
dat <- matrix(c(rnorm(100), rnorm(100, mean=3), 
       rnorm(100, mean=3, sd=2)), 
       ncol=3) 
# Plot them 
plot.densities(dat, along='cols') 

Điều đó sẽ tạo ba ô mật độ khác nhau trên cùng một trục với màu riêng của chúng.

+0

Steve, nếu điều này có ích và vượt qua R CMD kiểm tra, bằng mọi cách gửi nó đến CRAN. Nếu nó không vượt qua R CMD kiểm tra được nêu ra, làm việc trên một phần đó và sau đó quay trở lại bước trước đó :) –

+0

Dirk, bạn có ngụ ý rằng khả năng tương thích ngược không nên được nhiều của một mối quan tâm? –

+0

Eduardo: Khả năng tương thích ngược có liên quan gì với điều này? Vui lòng gửi email cho tôi bên ngoài SO. Tôi thực sự không hiểu câu hỏi của bạn. –

4

Bạn cũng có thể giải quyết vấn đề này bằng gói mạng.

require(lattice) 
dnow <- read.table('http://dpaste.com/88561/plain/') 
densityplot(~V1, groups=V2, data=dnow) 
Các vấn đề liên quan