2012-11-26 73 views
7

Tôi đang cố tạo một biểu đồ với hai ô mật độ chồng lên nhau. Vấn đề: là tôi muốn một mật độ là một đường nét đứt, mà hoạt động hoàn hảo nhưng trong truyền thuyết là nét đứt sẽ không xuất hiện, như trong ví dụ sauggplot2: Đường đứt nét trong chú thích

x<-sort(rnorm(1000)) 
data<-data.frame(x=x,Normal=dnorm(x,mean(x),sd=sd(x)),Student=dt(x,df=3)) 

ggplot(data,aes(y=x))+geom_histogram(aes(x=x,y=..density..), 
color="black",fill="darkgrey")+geom_line(aes(x=x,y=Normal,color="Normal"),size=1, 
linetype=2)+ylab("")+xlab("")+labs(title="Density estimations")+geom_line(aes(x=x,y=Student,color="Student"),size=1)+ 
scale_color_manual(values=c("Student"="black","Normal"="black")) 

Bất kỳ ý tưởng làm thế nào tôi có được tiêu tan dòng trong huyền thoại?

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

Rainer

Example Plot

Trả lời

4

Các "ggplot" cách thường thích dữ liệu được ở định dạng "dài" với các cột riêng biệt để chỉ định từng tính thẩm mỹ. Trong trường hợp này, linetype nên được hiểu là thẩm mỹ. Cách đơn giản nhất để đối phó với điều này là để chuẩn bị dữ liệu của bạn sang định dạng phù hợp với reshape2 gói:

library(reshape2) 
data.m <- melt(data, measure.vars = c("Normal", "Student"), id.vars = "x") 

Và sau đó sửa đổi mã âm mưu của bạn để tìm một cái gì đó như thế này:

ggplot(data,aes(y=x)) + 
    geom_histogram(aes(x=x,y=..density..),color="black",fill="darkgrey") + 
    geom_line(data = data.m, aes(x = x, y = value, linetype = variable), size = 1) + 
    ylab("") + 
    xlab("") + 
    labs(title="Density estimations") 

Kết quả trong một cái gì đó như này:

enter image description here

+0

+1 Bạn có thể vừa nhắc tôi thêm thư viện gọi là lol. –

+0

@BrandonBertelsen - đó hoàn toàn là công việc của hai thiên tài độc lập ... Tôi thấy cả câu trả lời của bạn và cây trồng của Stephen lên khi tôi đang cố gắng lưu/tải lên câu trả lời của tôi ... – Chase

+0

Làm điều đó ba. Tất cả chúng ta được đăng trong vòng vài phút của nhau. –

1

Bạn muốn định hình lại này sang định dạng dài ... làm cho nó đơn giản hơn

x<-sort(rnorm(1000)) 
Normal=dnorm(x,mean(x),sd=sd(x)) 
Student=dt(x,df=3) 
y= c(Normal,Student) 
DistBn= rep(c('Normal', 'Student'), each=1000) 
# don't call it 'data' that is an R command 
df<-data.frame(x=x,y=y, DistBn=DistBn) 

head(df) 
      x   y DistBn 
1 -2.986430 0.005170920 Normal 
2 -2.957834 0.005621358 Normal 
3 -2.680157 0.012126747 Normal 
4 -2.601635 0.014864165 Normal 
5 -2.544302 0.017179353 Normal 
6 -2.484082 0.019930239 Normal 



ggplot(df,aes(x=x, y=y))+ 
    geom_histogram(aes(x=x,y=..density..),color="black",fill="darkgrey")+ 
    geom_line(aes(x=x,y=y,linetype=DistBn))+ 
    ylab("")+xlab("")+labs(title="Density estimations")+ 
    scale_color_manual(values=c("Student"="black","Normal"="black")) 

Rplot

+0

không làm xáo trộn phân phối F! '? df' là lệnh R quá :) – Chase

+0

Gawd ... vậy là xong. Tôi không bao giờ để ý. Mã của tôi đầy df. –

+0

của tôi là quá cho đến khi ai đó chỉ ra cho tôi ... có một bài viết khá chi tiết trên SO ở đây minh họa rằng ghi đè tên chức năng R không thực sự * rằng * xấu như R là khá thông minh để tìm ra những gì bạn thực sự muốn làm ... vẫn có lẽ thực hành tốt nhất để tránh nó - nhưng là không thể tránh khỏi với hơn 4000 gói đóng góp và nhiều chức năng khác. – Chase

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