2013-02-21 38 views
9

Làm cách nào để tạo đường cong với độ dốc màu trong R. Hãy xem ngọn lửa enter image description here này.R lô - đường cong bình thường với gradient màu

Nó sẽ giống như vậy. Tôi đã cố gắng tạo một đường cong bình thường và sau đó là một đường cong bình thường khác, nhưng về mặt kỹ thuật, bạn không thể tạo ra một hình dạng như vậy với một đường cong bình thường bởi vì chúng sẽ không đi xuống và giao nhau ở đúng vị trí ở hai bên. Làm thế nào tôi có thể làm cho một con số như vậy trong R? Bất kỳ ý tưởng?

+0

Tôi đã chọn bản phân phối beta vì nó được hỗ trợ trên [0.1]. Bạn có thể làm nếu như "cao điểm" như bạn muốn bằng cách sửa đổi các tham số a và b. Miễn là bạn giữ chúng giống nhau, bạn duy trì tính đối xứng, nhưng nếu bạn muốn một ngọn lửa được "thổi sang một bên hay cái khác", bạn có thể để chúng khác nhau. –

Trả lời

23

Điều tốt nhất tôi đã có thể làm cho đến nay là:

par(bg="black") 
plot(seq(0.15,0.85,by=0.01), 
     5*dbeta(seq(0.15,0.85,by=0.01),10,10), 
     type="l" , ylim=c(0,700)) # this just sets up the plotting framework. 

for(i in 1:200) { lines(x= seq(0.15,0.85,by=0.01), 
          y= i*dbeta(seq(0.15,0.85,by=0.01),10,10), 
        col= colorRampPalette(c("yellow", "orange", "red", "hotpink", 
          "violet", "blue", "lightblue", "lightgreen", "darkgreen", 
          "black"))(200)[i], 
         lwd=13) } 
par(bg="white") 

tôi đã khám phá ra rằng việc đưa một "đen" màu ở phần đầu của loạt bài mà thêm một thêm "ánh sáng" đến kết quả tổng thể , nhưng tôi không đăng kết quả đó.

enter image description here

-----------------

Đây là những gì tôi bắt đầu với và sau đó có xấp xỉ kế và chỉnh xuất hiện bên dưới:

plot(seq(0.15,0.85,by=0.01), 5*dbeta(seq(0.15,0.85,by=0.01),10,10), 
      type="l" , ylim=c(0,100)) 
for(i in seq(0.2, 5)) { lines(seq(0.15,0.85,by=0.01), 
        i*5*dbeta(seq(0.15,0.85,by=0.01),10,10)) } 

enter image description here

Đối với màu sắc:

plot(seq(0.15,0.85,by=0.01), 5*dbeta(seq(0.15,0.85,by=0.01),10,10), type="l" , 
      ylim=c(0,130)) 
for(i in 1:35) {lines(seq(0.15,0.85,by=0.01), i*dbeta(seq(0.15,0.85,by=0.01), 10,10), 
          col=colorRampPalette(c("yellow", "orange", "red", "violet", 
             "blue", "lightblue", "lightgreen"))(35)[i], 
        lwd=3) } 

enter image description here

Đối với nền đen và màu sắc đậm đặc hơn và mờ dần sang màu đen ở phía trên:

par(bg = 'black') 
plot(seq(0.15,0.85,by=0.01), 5*dbeta(seq(0.15,0.85,by=0.01),10,10), type="l", 
      ylim=c(0,130)) 
for(i in 1:35) { lines(seq(0.15,0.85,by=0.01), i*dbeta(seq(0.15,0.85,by=0.01),10,10), 
          col=colorRampPalette(c("yellow", "orange", "red", "violet", 
           "blue", "lightblue", "lightgreen", "darkgreen", 
           "black")) (35)[i], 
          lwd=13) } 

enter image description here

tôi nhận thấy rằng mờ dần đến khía cạnh đen cũng kiểm soát chiều rộng dòng ở hai bên. Tôi đã không mong đợi điều đó nhưng nó có vẻ là một tính năng hấp dẫn. Khía cạnh khác không được giải quyết ở đây là khả năng thêm tính minh bạch. Có một đối số alpha trong các hàm R RGB.

Một mẹo nhỏ hữu ích cho việc tìm kiếm màu sắc byname:

grep("purple", colors(), value=TRUE) 
[1] "mediumpurple" "mediumpurple1" "mediumpurple2" "mediumpurple3" "mediumpurple4" 
[6] "purple"  "purple1"  "purple2"  "purple3"  "purple4"  

Nếu bạn đang chơi với lặp để làm gradient mượt mà sau đó bạn sẽ cần cũng điều chỉnh tham số ylim: chọn 0,5^9 * 0,5^9/beta (10,10) * [lần lặp], vì đó sẽ là tối đa tại x = 0,5.

+0

Điều này thật đáng kinh ngạc. CẢM ƠN BẠN!!! – CodeGuy

+0

Tôi ước tôi có thể bỏ phiếu lại lần nữa. – N8TRO

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