sobota, 25 lutego 2012

Wykres bąbelkowy

Od dobrych dwóch lat trwa moja przygoda z R - darmowym środowiskiem statystyczno-modelarskim. Możliwości R są ogromne, ale czasami potrzebne są drobne tricki które trudno znaleźć lub do których trudno samemu dojść. Będę od czasu do czasu wrzucać tutaj takie rady - mam nadzieję że przydatne :)
Bardzo często macie problem z Waszymi danymi polegający na ich nakładaniu się na wykresie. Takie kłopoty bardzo często pojawiają się, gdy próbujemy przedstawić dane o charakterze zliczeń (gdzie siłą rzeczy tylko niektóre wartości są możliwe).
Np. spójrzmy na poniższy wykres.

Tutaj na każdą kropkę przypada 1 lub więcej punktów - dobrze by było wiedzieć gdzie jest ich więcej. Wyjść jest kilka. Możemy wykorzystać tzw. sunflower plot lub dodać do naszych punktów losowe zaburzenie, które je uwidoczni, np.:

> sunflowerplot(y~x)

lub też

> plot(jitter(y)~jitter(x))

To drugie rozwiązanie jest znacznie bardziej estetyczne - ale i nie do końca odpowiada naszemu gustowi (a założę się, żę recenzentom może także nie odpowiadać ;)). Jest w wielu pakietach statystycznych opcja zwana bubble plot, która rysuje wykres  zmieniając rozmiar punktów proporcjonalnie do tego ile ich "kryje" się w danym miejscu. Czy R ma coś takiego? Oczywiście - pakiet gstat posiada funkcję bubble służącą do generowania takich wykresów. Problem jest 1 - nasze dane muszą a priori mieć postać 3 kolumn: zmienna x, zmienna y oraz zmienna z opisująca rozmiary bąbli. Co jeśli mamy dane w których nie ma kolumny z a za to mamy wiele powtórzeń wartości y? Jak zawsze w R - trzeba wykazać się przebiegłością ;)

Zamiast generować wykres funkcją sunflowerplot() moża jej wtnik zapisać do pliku. Po otwarciu okaże się, że plik zawiera dokładnie te dane, które chcemy użyć w naszym wykresie!

> sunflowerplot(y~x) -> A
> A

$x
 [1]  6770.84  6770.84  6770.84  6770.84  6770.84  6770.84  6770.84 11100.40
 [9] 11100.40 11100.40 11100.40 11100.40 11100.40 11100.40 16883.90 16883.90
[17] 16883.90 16883.90 16883.90 16883.90 16883.90 16883.90 18313.90 18313.90
[25] 18313.90 18313.90 18313.90 18313.90 18313.90 23874.50 23874.50 23874.50
[33] 23874.50 23874.50 23874.50 23874.50 23874.50 28418.40 28418.40 28418.40
[41] 28418.40 28418.40 28418.40 28418.40 28418.40

$y
 [1] 0.000000 0.693147 1.098610 1.386290 1.609440 2.079440 2.197220 0.000000
 [9] 0.693147 1.098610 1.386290 1.791760 1.945910 2.079440 0.000000 1.386290
[17] 1.609440 1.945910 2.079440 2.302590 2.397900 2.564950 0.000000 1.098610
[25] 1.386290 1.609440 1.945910 2.079440 2.302590 1.098610 1.609440 1.791760
[33] 1.945910 2.197220 2.302590 2.397900 2.484910 0.000000 1.098610 1.386290
[41] 1.609440 1.791760 1.945910 2.079440 2.302590

$number
 [1] 2 5 2 1 1 1 1 1 3 2 3 1 1 1 1 1 4 2 1 1 1 1 1 2 3 2 2 1 1 4 1 1 1 1 1 1 1
[38] 1 2 1 3 2 1 1 1

Co teraz? Wykorzystujemy kolejną użyteczną funkcję do wstawienia na nasz wykres (musi być jakikolwiek aktywny w danym momencie) kół o określonej wielkości:

> symbols(A$x, A$y, circles=A$number)


Hmm - ok ale coś jest nie tak. Wprowadzimy kilka zmian. Po pierwsze - parametr circles określający wielkość kół zastąpimy wyrażeniem, które sprawi że powierzchnia a nie promień koła będzie proporcjonalna do ilości punktów. Po drugie zmienimy kolory (argumenty bg oraz fg). A po trzecie - za pomocą argumentu inches zmienimy domyślną wielkość kół. Zobaczymy efekty działania tych funkcji z i bez zmiany wielkości kół.

> symbols(A$x, A$y, circles=sqrt(A$number/pi), fg="white", bg="red")


> symbols(A$x, A$y, circles=sqrt(A$number/pi), fg="white", bg="red", inches=0.3)

Ten drugi wynik pewnie większość z Was bardziej usatysfakcjonuje ;)

Brak komentarzy:

Prześlij komentarz

Obserwatorzy