2013-02-21 18 views
9

Jak wykonać krzywe z gradientem kolorów w R. Spójrz na ten płomień enter image description here.Wykres R - krzywe normalne z gradientem koloru

To powinno wyglądać tak. Próbowałem zrobić normalną krzywą, a następnie inną normalną krzywą, ale technicznie rzecz biorąc, nie można zrobić takiej figury z mnóstwem normalnych krzywych, ponieważ nie zejdą i przecinają się w odpowiednim miejscu po obu stronach. Jak mogę zrobić taką liczbę w R? Jakieś pomysły?

+0

Wybrałem wersję beta, ponieważ jest ona obsługiwana w [0.1]. Możesz dokonać "szczytowego" dopasowania, modyfikując parametry a i b. Dopóki zachowujesz je tak samo, zachowujesz symetrię, ale jeśli chcesz płomienia, który jest "wysadzony na bok lub na inny", możesz pozwolić, by były inne. –

Odpowiedz

23

Najlepszą udało mi się zrobić tak daleko jest:

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") 

I odkrył, że wprowadzenie „czarny” kolor na początku tej serii dodać dodatkowy „blask” do ogólnego wyniku , ale nie publikuję tego wyniku.

enter image description here

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

To, co zaczęło się i potem są kolejne przybliżenie i szczypie pojawiające się poniżej:

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

Dla kolorach:

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

Na czarnym tle i gęstszych kolorach i wyciszenia na czarny u góry:

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

zauważyłem, że blaknięcie do czarnego aspekcie również kontrolowana szerokość linii u boki. Nie spodziewałem się tego, ale wydaje mi się to pożądaną cechą. Innym aspektem, którego nie omówiono, jest możliwość zwiększenia przejrzystości. W funkcjach R RGB występuje argument alfa.

Jeden przydatna sztuczka za znalezienie kolory byname:

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

Jeśli grasz z iteracji, aby gradient gładsza a następnie trzeba będzie również dostosować ylim argumentu: Wybierz 0,5^9 * 0,5^9/beta (10,10) * [iteracje], ponieważ będzie to maksymalna wartość przy x = 0,5.

+0

To jest niesamowite. DZIĘKUJĘ CI!!! – CodeGuy

+0

Chciałbym móc zagłosować jeszcze raz. – N8TRO

Powiązane problemy