Kolory
Kodowanie kolorów
R wykorzystuje wszystkie możliwe kolory istniejące w systemach cyfrowych. Listę dostępnych kolorów można uzyskać za pomocą komendy colors(). Są to angielskie nazwy różnych kolorów, niektóre z cyframi na końcu, ujęte w cudzysłów. Z reguły cyfry na końcu im są wyższe tym kolor jest ciemniejszy. Liczba tych kolorów zależy od systemu operacyjnego i wersji R, i przeważnie jest ich kilkaset. Na pierwszy miejscu jest “white”, ale później nazwy kolorów wymieniane są w porządku alfabetycznym. Początek tej listy wygląda następująco:
> colors() [1] "white" "aliceblue" "antiquewhite" "antiquewhite1" [5] "antiquewhite2" "antiquewhite3" "antiquewhite4" "aquamarine" [9] "aquamarine1" "aquamarine2" "aquamarine3" "aquamarine4" [13] "azure" "azure1" "azure2" "azure3" [17] "azure4" "beige" "bisque" "bisque1" [21] "bisque2" "bisque3" "bisque4" "black" |
Wypisywanie długich angielskich nazw w programach może być męczące. Dlatego ostre podstawowe kolory można uzyskać za pomocą liczb zapisywanych już nie w cudzysłowie. Lista odpowiadających im kolorów znajduje się poniżej.
- 0 – biały
- 1 – czarny
- 2 – czerwony
- 3 – zielony
- 4 – niebieski
- 5 – jasnoniebieski
- 6 – różowy
- 7 – żółty
- 8 – szary
Potem, przy wzroście liczby (9,10,11,…) kolory od 1 do 9 (bez białego) powtarzają się.
Kolory można zapisywać w systemie RGB. Nazwy takiego koloru składają się z 7 znaków. Pierwszym z nich jest “#”, kolejne sześć znaków tworzą liczbę zapisaną w systemie szesnastkowym. Są to współrzędne punktu odczytane z tzw. sześcianu kolorów. Dwa pierwsze znaki oznaczają nasycenie kolorem czerwonym, kolejne dwa – nasycenie kolorem zielonym a piąty i szósty znak – kolorem niebieskim. R stosuje także nieco zmodyfikowany zapis kolorów w systemie RGB składający się z 9 znaków. Po znaku “#” kolejne sześć znaków oznacza stopnie nasycenia kolorami czerwonym, zielonym i niebieskim, zaś ostatnie dwa znaki – liczba w systemie szesnastkowym – stopień nie przeźroczystości. Na białym tle barwne figury stają się coraz jaśniejsze, gdy liczba ta jest coraz mniejsza. Domyślna wartość FF daje kolor całkiem nie przeźroczysty.
Kody te wyglądają następująco “#f5cc23”, “#AB7C3F” itp. Mogą być w nich cyfry i litery od a do f. W R jest wszystko jedno czy te litery napiszemy jako duże czy małe.
Listy kolorów zapisywanych w systemie RGB znajdują się w Internecie na wielu stronach, np. w: http://szablony.blogowicz.info/koloryrgb.php albo https://www.w3schools.com/colors/colors_rgb.asp. Można je znaleźć także w Wikipedii pod hasłem “lista kolorów”.
Symbole kolorów w notacji RGB można uzyskać za pomocą funkcji rgb(), której trzy pierwsze argumenty określają nasycenie koloru barwą czerwoną, niebieską i zieloną, a czwarty określa przeźroczystość. Domyślnie wszystkie cztery liczby mają wartości z przedziału [0,1]. Ponieważ w wielu programach, system RBG pozwala na wybieraniu nasycenia kolorami podstawowymi za pomocą liczb całkowitych od 0 do 255, funkcja rgb() ma opcję maxColorValue=255, która pozwala na właśnie taki sposób na wybieranie koloru. Wygląda to następująco:
> rgb(0.5, 0.5, 0.5, 0.5) [1] "#80808080" > rgb(100, 200, 10, 70, maxColorValue=255) [1] "#64C80A46" |
Inną przydatną funkcją do sterowania kolorami jest col2rgb(), która dla danego koloru tworzy wektor (a właściwie jednokolumnową macierz) pokazującą stopień nasycenia kolorami czerwonym, zielonym i niebieskim (liczby od 0 do 255).
> col2rgb("#FFCC11") [,1] red 255 green 204 blue 17 > col2rgb("lightblue") [,1] red 173 green 216 blue 230 |
Warto przy tym zapamiętać regułę: kolor “#uvwxyz” jest taki sam jak “#uvwxyzFF”, a liczby w systemie szesnastkowym mniejsze od FF napisane na końcu dają kolor o tej samej barwie co “#uvwxyz” tylko jaśniejszy, ogólnie podobniejszy do tła.
Bywa, że musimy znaleźć kod koloru w systemie HSV, gdy znamy go w RGB. Do konwersji służy funkcja rgb2hsv(). Argumentami tej funkcji są stopnie wysycenia kolorami czerwonym, zielonym i niebieskim oraz maksymalna liczba określająca te wysycenia (domyślnie 255), a wynikami odcień (ang. hue), nasycenie (ang. saturation) i wartość (ang. value) będące liczbami od 0 do 1. Funkcja hsv() zamienia ten ciąg na kod RGB.
> rgb2hsv(100,50,120) [,1] h 0.7857143 s 0.5833333 v 0.4705882 > hsv(0.7857143,0.5833333,0.4705882) [1] "#643278" |
Wielkim ułatwieniem dla programistów jest możliwość automatycznego wyboru ciągu kilku kolorów skrajnie różniących się od siebie. Są to funkcja rainbow() i gray(). Pierwsza z tych funkcji wybiera kolory z palety barw nasyconych ułożonych w tęczę i jej argumentem jest liczba wybieranych kolorów. Druga funkcja ogranicza się do różnych odcieni szarości i jej argumentem jest wektor nasyceń kolorem czarnym (od 0 – biały do 1 – czarny), czy jeśli patrzymy na ekran, a nie drukarkę – stopiej nasycenia pikseli światłem.
> rainbow(7) [1] "#FF0000FF" "#FFDB00FF" "#49FF00FF" "#00FF92FF" "#0092FFFF" [2] "#4900FFFF" "#FF00DBFF" > gray(1:7/10) [1] "#1A1A1A" "#333333" "#4D4D4D" "#666666" "#808080" [2] "#999999" "#B3B3B3" |
R zapewnia nam dostęp do wszystkich kolorów, nawet gdy nie ma ich nasz monitor. Sterownik graficzny dobierze kolor najbardziej podobny do wybranego.
Kolor tła
Do prac dyplomowych nadaje się właściwie tylko kolor biały jako kolor tła wykresu. Jest to kolor domyślny. Nie mniej w przypadku wykonywania posterów lub prezentacji często stosowany jest inny kolor, by dopasować grafikę wykresów do stylu całego opracowania. Kolor tła zmieniamy za pomocą parametrów bg=”color”, funkcji par().
windows(4.5, 2.5) par(mar=c(3,3,1,1), bg="#99ccff") plot(1:10) # windows(4.5, 2.5) par(mar=c(3,3,1,1), bg="#99ff99") pie(1:10) # windows(4.5, 2.5) par(mar=c(3,3,1,1), bg="#ccff33") barplot(1:10) # windows(4.5, 2.5) par(mar=c(3,3,1,1), bg="#ffcccc") boxplot(1:10) |
Powstaną w taki sposób cztery wykresy:
Takie ustawienia pamiętane będą przez R i wykonywane dopóki nie zostaną zmienione nową funkcją par(bg=””).
Kolor tła pola kreślenia
Nadrzędne funkcje graficzne w bibliotece graphics nie mają opcji zmiany koloru tła samego pola kreślenia. Tymczasem takie wykresy często umieszcza się na posterach i w prezentacjach. Z reguły marginesy są ciemniejsze od tła pola kreślenia. Jest to eleganckie oddzielenie wyników badań od wyjaśnień i komentarzy. W R trzeba sobie poradzić za pomocą swojego rodzaju “oszustwa”. Oszustwa w stosunku do programów, które takie kolorowanie tła pola kreślenia umożliwiają. Polega ono na:
- Utworzeniu wykresu za pomocą funkcji graficznej rysującej z odpowiednimi marginesami i ustalonymi opcjami zmieniającymi współrzędne pola kreślenia, ale bez obiektów wpisywanych w pole kreślenia.
- Utworzeniu prostokąta o współrzędnych odczytanych z funkcji par(“usr”) i odpowiednim kolorze wypełnienia.
- Wpisaniu do wykresu tego wszystkiego, co ma być w polu kreślenia.
Nie jest to aż tak pracochłonne, jak to wygląda. Pierwsza z funkcji graficznych rysujących tworzy odpowiednie marginesy i wyznacza pole kreślenia. Daje też odpowiednie tło całości. Jest ono zamalowywane przez prostokąt zajmujący całe pole kreślenia. Na końcu na tym prostokącie kreślone jest to, co powinno być zrobione przez nadrzędną funkcję graficzną, tyle że przez odpowiednią funkcję podrzędną. Wygląda to następująco:
windows(4.5, 2.5) par(mar=c(3,3,0.5, 0.5), mgp=c(1.7,0.5,0), tck=-0.03, bg="#99ccff") plot(1:10,type="n") rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col="#aaddff") points(1:10) # windows(4.5, 2.5) par(mar=c(3,3,0.5, 0.5), mgp=c(1.7,0.5,0), tck=-0.03, bg="#ccff33") barplot(1:10) rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col="#e6fac8") barplot(1:10,add=TRUE) # windows(4.5, 2.5) par(mar=c(3,3,0.5, 0.5), mgp=c(1.7,0.5,0), tck=-0.03, bg="#ffcccc") boxplot(1:10,type="n") rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4], col="#ffecf1") boxplot(1:10,add=TRUE) |
Program ten tworzy następujące wykresy:
W podobny sposób możemy “oszukać” komputer używając podrzędnej funkcji graficznej grid(), co pozwala na rezygnację z używania liczb pojawiających się w wektorze par(“usr”). Jest to funkcja standardowo dokładająca siatkę na wykresie. Niestety siatka ta nie pojawia się pod danymi, ale na nich, co powoduje, że często trzeba dane ponownie narysować. Siatkę można utworzyć z gęsto narysowanych grubych linii ciągłych o określonym kolorze. Wygląda to następująco:
windows(4.5, 2.5) par(mar=c(3,3,0.5, 0.5), mgp=c(1.7,0.5,0), tck=-0.03, bg="#99ccff") plot(1:10,type="n") grid(100,50, col="#aaddff", lty=1, lwd=10) points(1:10) # windows(4.5, 2.5) par(mar=c(3,3,0.5, 0.5), mgp=c(1.7,0.5,0), tck=-0.03, bg="#ccff33") barplot(1:10) grid(100,50, col="#e6fac8", lty=1, lwd=10) barplot(1:10,add=TRUE) # windows(4.5, 2.5) par(mar=c(3,3,0.5, 0.5), mgp=c(1.7,0.5,0), tck=-0.03, bg="#ffcccc") boxplot(1:10,type="n") grid(100,50, col="#ffecf1", lty=1, lwd=10) boxplot(1:10,add=TRUE) |
Powstaną w ten sposób następujące trzy wykresy:
Są one bardzo podobne do poprzednich, tylko niektórym przydałoby się obramowanie zrobione np. funkcją box().
Jedyną funkcją, z która tego typu manipulacja nie jest wykonalna, to funkcja pie(). Nie ma ona bowiem opcji zamieniającej jej na funkcje graficzną dokładającą. Jedyny sposób polega na samodzielnym wykonaniu wielokątów mających kształt wycinka koła o odpowiednik kącie wierzchołkowym i położeniu, a nie jest to wcale takie proste, bo wśród istniejących w pakiecie graphics funkcji graficznych dokładających, nie ma wycinków kół. Nie mniej w rozdziale 10 podano kod takiej funkcji i sposób jej wykorzystania do zrobienia ładnych wykresów kołowych na kolorowym tle.
Kolor kreślenia
W polu kreślenia sam wykres, a dokładnie jego kontury, są rysowane domyślnie kolorem czarnym. To także najlepszy kolor dla wykresów umieszczanych w pracach dyplomowych, gdzie co najwyżej wypełnienia słupków lub pudełek robi się kolorowe. Nie mniej można to zmienić opcją fg=”kolor” wstawianej do funkcji par() lub do odpowiednich nadrzędnych funkcji graficznych.
windows(4.5, 2.5) par(mar=c(3,3,1,1), fg="blue") plot(1:10) # windows(4.5, 2.5) par(mar=c(1,3,1,1), fg="red") pie(1:10) # windows(4.5, 2.5) par(mar=c(3,3,1,1), fg="green") barplot(1:10) # windows(4.5, 2.5) par(mar=c(3,3,1,1), fg="brown") boxplot(1:10) |
Powstaną w taki sposób cztery wykresy:
Jak widać opcja ta zmienia kolor także osi i znaczników, a w funkcji pie() – etykiet wykresu.
Kolory elementów wykresu
Przy opracowaniu graficznym wyników badań z reguły kolorów używa się do wskazania odrębnych grup danych. Powoduje to, że elementy pojawiające się w polu kreślenia powinny mieć różne kolory. R umożliwia to, bowiem argumentem podstawowej opcji wskazującej kolor col=c() poszczególnych elementów wykresu może być wektor różnych kolorów. Pierwszy element wykresu będzie miał pierwszy kolor, drugi kolor, itd. Gdy elementów wykresu jest więcej niż kolorów, cykl przyznawania kolorów powtarza się.
windows(4.5, 2.5) par(mar=c(3,3,1,1)) plot(1:10, col=rainbow(20)[1:5*3]) # windows(4.5, 2.5) par(mar=c(1,3,1,1)) pie(1:10, col=rainbow(20)[3:8*2]) # windows(4.5, 2.5) par(mar=c(3,3,1,1)) barplot(1:10, col=rainbow(20)[11:15]) # windows(4.5, 2.5) par(mar=c(3,3,1,1)) boxplot(1:10, 2:11, 3:12, 4:13, 5:14, 1:10, 2:11, 3:12, 4:13, 5:14, col=rainbow(20)[16:20]) |
Program tworzy 4 wykresy:
Opcja col=c() w taki sam sposób działa także w wielu podrzędnych funkcjach graficznych.
Kolory osi
Wśród opcji graficznych związanych z kolorowaniem wykresu jest opcja col.axis=”kolor”. Zmienia ona jedynie kolor etykiet na wykresie. Opcja col.lab=”kolor” zmienia kolor podpisów pod osiami.
windows(4.5, 2.5) par(mar=c(3,3,1,1), mgp=c(1.7, 0.5, 0), tck=-0.03) plot(1:10, xlab="Podpis osi 0X", ylab="Podpis osi oY", col.axis=2, col.lab=3)windows(4.5, 2.5) par(mar=c(3,3,1,1), mgp=c(1.7, 0.5, 0), tck=-0.03) barplot(1:10, xlab="Podpis osi 0X", ylab="Podpis osi oY", col.axis=3, col.lab=4)windows(4.5, 2.5) par(mar=c(3,3,1,1), mgp=c(1.7, 0.5, 0), tck=-0.03) boxplot(1:10, xlab="Podpis osi 0X", ylab="Podpis osi oY", col.axis=4, col.lab=2) |
Program utworzy następujące wykresy:
Kolor samej osi możemy zmienić dopiero używając funkcji axis() do ich narysowania. Opcją, która to robi jest col=”kolor”.
windows(4.5, 2.5) par(mar=c(3,3,1,1), mgp=c(1.7, 0.5, 0), tck=-0.03) plot(1:10, axes=FALSE, xlab="Podpis osi 0X", ylab="Podpis osi oY", col.lab=4) axis(1, at=0:5*2, col=2, col.axis=3) axis(2, at=0:5*2, col=3, col.axis=2) # windows(4.5, 2.5) par(mar=c(3,3,1,1), mgp=c(1.7, 0.5, 0), tck=-0.03) barplot(1:10, axes=FALSE, xlab="Podpis osi 0X", ylab="Podpis osi oY", col.lab=3) axis(2, at=0:5*2, col=2, col.axis=4) # windows(4.5, 2.5) par(mar=c(3,3,1,1), mgp=c(1.7, 0.5, 0), tck=-0.03) boxplot(1:10, axes=FALSE, xlab="Podpis osi 0X", ylab="Podpis osi oY", col.lab=2) box(col=3) axis(2, at=0:5*2, col=4, col.axis=5) |
Program generuje 3 wykresy:
Odpowiednie opcje pozwalają także kolorować wszelkie napisy i podpisy wprowadzane do wykresu. Za tytuł odpowiada opcja col.main=”kolor”, za podpis odpowiada opcja col.sub=”kolor”. Ponadto opcja col=”kolor” umieszczona w funkcjach title(), text() i mtext() tworzy napisy odpowiedniego koloru.