Czcionka, napisy, podpisy, tytuł
Wielkość i rodzaj czcionki
Rozmiar czcionki ustala się opcją ps=n w funkcji par(). Domyślnie jest to 12 jednostek, a jednostka to 1/72 cala. Zastosowanie w tej opcji określa rozmiar wszystkich symboli tekstowych (liter i liczb), a więc etykiet, podpisów osi i innych elementów tekstowych. W funkcjach graficznych istnieją opcje, takie jak:
- cex.axis=x zmieniające wielkość czcionki w etykietach,
- cex.lab=x zmieniające wielkość czcionki w podpisach osi,
- cex.main=x zmieniająca wielkość czcionki w tytule wykresu,
- cex.sub=x zmieniająca wielkość czcionki w podpisie wykresu,
które zwiększają lub zmniejszają x – razy czcionkę ustaloną opcją ps=n. Liczba x przyjmuje zatem najczęściej wartości od 0.5 do 1.5, choć może być dowolną liczbą dodatnią. Ustalanie wielkości czcionek pokazuje następujący program:
windows(4.5, 2.5) par(mar=c(4, 3, 2, 1), mgp=c(1.7, 0.5, 0), tck=-0.03, ps=10) plot(5:15, type="n", xlab="Podpis osi 0X", ylab="Podpis osi 0Y", main="Tytuł", sub="Podpis", cex.axis=1.2, cex.lab=0.8, cex.main=1.1, cex.sub=1.3) # windows(4.5, 2.5) par(mar=c(4, 3, 2, 1), mgp=c(1.7, 0.5, 0), tck=-0.03, ps=12) plot(5:15, type="n", xlab="Podpis osi 0X", ylab="Podpis osi 0Y", main="Tytuł", sub="Podpis", cex.axis=0.8, cex.lab=1.2, cex.main=1.3, cex.sub=1.1) |
Po wykonaniu programu pokazują się dwa wykresy:
W funkcji text() rozmiar czcionek ustala się za pomocą parametru cex=x, gdzie x=1 odpowiada domyślnej wielkości czcionki odczytanej z funkcji par(). Inne wielkości cex=x odpowiednio ją zwiększają lub zmniejszają. Można przetestować wymiary czcionek za pomocą programu:
windows(4.5, 2.5) par(mar=c(1,1,1,1)) plot(5:15, type="n", axes=FALSE, xlab="", ylab="") for (i in 5:20) {text(3,i, "Ala ma kota", cex=i/10, adj=0) text(9,i,paste("cex =",i/10), cex=1, adj=0)} # windows(4.5, 2.5) par(mar=c(1,1,1,1)) plot(5:15, type="n", axes=FALSE, xlab="", ylab="") for (i in 5:20) {par(ps=i) text(3,i, "Ala ma kota", adj=0) par(ps=12) text(9,i, paste("ps =",i), adj=0)} |
Wygenerowane wykresy wyglądają następująco:
Ponadto każdy tekst można napisać czcionka pogrubioną lub kursywą (italikiem) oraz pogrubioną kursywą. Służą do tego opcje:
- font.axis=n określająca rodzaj czcionki w etykietach,
- font.lab=n określająca rodzaj czcionki w podpisach osi,
- font.main=n określająca rodzaj czcionki w tytule,
- font.sub=n określająca rodzaj czcionki w podpisie wykresu.
Liczba n może mieć wartości 1, 2, 3 i 4, gdzie:
- 1 oznacza normalne pismo
- 2 oznacza pismo pogrubione
- 3 oznacza kursywę (pismo pochyłe)
- 4 oznacza pismo pochyłe i pogrubione
Odpowiednikiem tej opcji w funkcji text() jest font=n. Działanie tych opcji wygląda następująco:
windows(4.5, 2.5) par(mar=c(4, 3, 2, 1), mgp=c(1.7, 0.5, 0), tck=-0.03 ) plot(5:15, type="n", xlab="Podpis osi 0X", ylab="Podpis osi 0Y", main="Tytuł", sub="Podpis", font.axis=1, font.lab=2, font.main=3, font.sub=4) for (i in 1:4) {text(4,(5-i)*2, "Ala ma kota", adj=0, font=i) text(8,(5-i)*2, paste("font =",i), adj=0)} # windows(4.5, 2.5) par(mar=c(4, 3, 2, 1), mgp=c(1.7, 0.5, 0), tck=-0.03) plot(5:15, type="n", xlab="Podpis osi 0X", ylab="Podpis osi 0Y", main="Tytuł", sub="Podpis", font.axis=3, font.lab=4, font.main=1, font.sub=2) for (i in 1:4) {text(4,(5-i)*2, "Ala ma kota", adj=0, font=i) text(8,(5-i)*2, paste("font =",i), adj=0)} |
Wykresy powstające, jako wynik uruchomienia tego programu wyglądają następująco:
Krój czcionki
Zmiana kroju czcionki na wykresach w R sprawia dość dużo problemów, bo nie ma na to prostej opcji w funkcjach graficznych. Standardowo przyjętym krojem jest “Arial Unicode” zdefiniowany dla różnych systemów podobnie. Tymczasem R umożliwia posługiwanie się każdą czcionką jaką dysponuje system operacyjny. Wystarczy znaleźć tylko nazwę systemową tej czcionki, a R ją użyje.
W systemie Windows 10 znalezienie nazw krojów czcionek polega na:
- kliknięciu na ikonkę “Okna” w lewym dolnym rogu pulpitu (tą, która uruchamia podgląd wszystkich programów i wyróżnione kafle),
- kliknięciu na ikonkę “Ustawienia” (będącą zazwyczaj powyżej ikonki “Zasilanie”),
- wpisaniu w górne pole z napisem “Znajdź ustawienie” słowa “czcionka”,
- wybraniu pokazującej się opcji “Ustawienia czcionek” i kliknięciu na nią.
Pojawi się obszerne pole z zainstalowanymi krojami czcionek, przykładowym napisem wykonanym tym krojem. Dodatkowo, gdy napis ten wykonany jest po polsku to możemy być pewni, że ten krój zawiera polskie litery. Ich nazwy zapisane są pod spodem, a dodatkowe informacje pokazują, czy dany krój ma swój odpowiednik w kursywie lub czcionkach pogrubionych.
Po wybraniu krojów, trzeba im przypisać w R odpowiedni literał i wykonać funkcję windowsFonts(). Można jednorazowo przypisać nazwy kilku czcionek systemowych z nazwami, których będzie się używało w R i funkcję tę uruchamiać, kiedy tylko zajdzie potrzeba zmiany czcionki w wykresach. Przykładowo, funkcja ta napisana dla systemu Windows 10 została podana w pierwszej części poniższego programu. W drugiej części pokazano jak wykożystać zaimplementowane czcionki do wykonania napisy “Źrebak złamał kość”.
windowsFonts(Arial = windowsFont("Arial"), Cambria = windowsFont("Cambria"), Comic = windowsFont("Comic Sans MS"), Consolas = windowsFont("Consolas"), Constantia = windowsFont("Constantia"), Corbel = windowsFont("Corbel"), Courier = windowsFont("Courier New"), Georgia = windowsFont("Georgia"), Impact = windowsFont("Impact"), Palatino = windowsFont("Palatino Linotype"), Symbol = windowsFont("Symbol")) # windows(4.5, 2.5) par(mar=c(1,1,1,1)) plot(1:10, type="n", axes=FALSE, xlab="", ylab="") par(family="Cambria") text(1,10, "Źrebak złamał kość", adj=0) par(family="Arial") text(6,10, "Cambria", adj=0) par(family="Comic") text(1,9, "Źrebak złamał kość", adj=0) par(family="Arial") text(6,9, "Comic", adj=0) par(family="Consolas") text(1,8, "Źrebak złamał kość", adj=0) par(family="Arial") text(6,8, "Consolas", adj=0) par(family="Constantia") text(1,7, "Źrebak złamał kość", adj=0) par(family="Arial") text(6,7, "Constantia", adj=0) par(family="Corbel") text(1,6, "Źrebak złamał kość", adj=0) par(family="Arial") text(6,6, "Corbel", adj=0) par(family="Georgia") text(1,5, "Źrebak złamał kość", adj=0) par(family="Arial") text(6,5, "Georgia", adj=0) par(family="Impact") text(1,4, "Źrebak złamał kość", adj=0) par(family="Arial") text(6,4, "Impact", adj=0) par(family="Palatino") text(1,3, "Źrebak złamał kość", adj=0) par(family="Arial") text(6,3, "Palatino", adj=0) par(family="Symbol") text(1,2, "Źrebak złamał kość", adj=0) par(family="Arial") text(6,2, "Symbol", adj=0) |
Program spowodował powstanie następującego wykresu:
Po wykonaniu funkcji windowsFonts() możemy posługiwać się skróconymi nazwami krojów czcionek w opcji family=”nazwa kroju czcionki” funkcji par(). Krój ten może ulegać pogrubieniu lub kursywie poprzed dodanie opcji font.
windows(4.5, 2.5) par(mar=c(1,1,1,1)) plot(1:10, type="n", axes=FALSE, xlab="", ylab="") par(family="Cambria") text(1,10, "Ala ma kota", adj=0) par(family="Arial") text(6,10, "Cambria", adj=0) par(family="Comic") text(1,9, "Ala ma kota", adj=0) par(family="Arial") text(6,9, "Comic", adj=0) par(family="Consolas") text(1,8, "Ala ma kota", adj=0) par(family="Arial") text(6,8, "Consolas", adj=0) par(family="Constantia") text(1,7, "Ala ma kota", adj=0) par(family="Arial") text(6,7, "Constantia", adj=0) par(family="Corbel") text(1,6, "Ala ma kota", adj=0) par(family="Arial") text(6,6, "Corbel", adj=0) par(family="Pristina") text(1,5, "Ala ma kota", adj=0) par(family="Arial") text(6,5, "Pristina", adj=0) par(family="Georgia") text(1,4, "Ala ma kota", adj=0) par(family="Arial") text(6,4, "Georgia", adj=0) par(family="Impact") text(1,3, "Ala ma kota", adj=0) par(family="Arial") text(6,3, "Impact", adj=0) par(family="Ravie") text(1,2, "Ala ma kota", adj=0) par(family="Arial") text(6,2, "Ravie", adj=0) par(family="Palatino") text(1,1, "Ala ma kota", adj=0) par(family="Arial") text(6,1, "Palatino", adj=0) |
Program generuje jeden wykres, ale poprzez dodanie opcji font=2 i font=3 do funkcji text() z tekstem “Ala ma kota” tworzą się pozostałe dwa wykresy.
Pod pewnymi krojami czcionek nie kryją się litery i cyfry, ale inne symbole. Mogą one mieć znaczenie na niektórych wykresach i zamiast je rysować można użyć gotowych znaków. Do takich czcionek należy “Symbol”, “Webdings” i “Wingdings”. Można zobaczyć, co kryje się w tych krojach pod znakami, które możemy wprowadzić z klawiatury. Dla czcionki “Symbol” można wykonać program:
windows(4.5, 2.5) par(mar=c(1,1,1,1)) plot(1:10, type="n", axes=FALSE, xlab="", ylab="", xlim=c(1,11)) for (j in 1:3){ for (i in ((j-1)*10+1):(j*10)){ par(family="Symbol") text(j,j*10+1-i, letters[i], adj=0) par(family="TimesNewRoman") text(j+0.3,j*10+1-i, letters[i], adj=0, col=grey(0.5))}} for (j in 1:3){ for (i in ((j-1)*10+1):(j*10)){ par(family="Symbol") text(j+3,j*10+1-i, LETTERS[i], adj=0) par(family="TimesNewRoman") text(j+3+0.3,j*10+1-i, LETTERS[i], adj=0, col=grey(0.5))}} for (i in 1:10) { par(family="Symbol") text(7,11-i, paste(0:9)[i], adj=0) par(family="TimesNewRoman") text(7.3,11-i, paste(0:9)[i], adj=0, col=grey(0.5))} znaki1=c("~", "`", "!", "@", "#", "$", "%", "^", "&", "*") znaki2=c("(", ")", "_", "-", "+", "=", "|", "{", "[", "}") znaki3=c("]", ":", ";", ",", "<", ">", ".", "?", "/") for (i in 1:10) { par(family="Symbol") text(8,11-i, znaki1[i], adj=0) par(family="TimesNewRoman") text(8.3,11-i, znaki1[i], adj=0, col=grey(0.5))} for (i in 1:10) { par(family="Symbol") text(9,11-i, znaki2[i], adj=0) par(family="TimesNewRoman") text(9.3,11-i, znaki2[i], adj=0, col=grey(0.5))} for (i in 1:10) { par(family="Symbol") text(10,11-i, znaki3[i], adj=0) par(family="TimesNewRoman") text(10.3,11-i, znaki3[i], adj=0, col=grey(0.5))} |
Uzyskany wykres pokaże na czarno znaki, jakie kryją się pod znakami z klawiatury zaznaczonymi na szaro. Po zmianie słowa “Symbol” na “Webdings” oraz na “Wingdings” uzyskamy drugi i trzeci wykres.
Ważne są litery greckie w czcionkach “Symbol”, gdyż często występują one w jednostkach zmiennych. Jednak ich pisanie razem z innym krojem czcionek jest kłopotliwe. Są na to inne sposoby wyjaśnione w następnym podrozdziale.
Znaki specjalne, symbole matematyczne
W podpisach osi często trzeba użyć jednostek pomiaru zmiennych ciągłych z indeksami górnymi lub dolnymi i greckimi literami. Taki podpis programuje się za pomocą funkcji expression(), która wystąpiwszy w funkcjach graficznych przetwarza wyrażenie tekstowe o specjalnej składni na odpowiednio wyglądający tekst. Chodzi tu przede wszystkim o wyrażenia matematyczne, które w funkcji expression() zapisuje się za pomocą znaków dostępnych na klawiaturze, a ogląda na wykresach w taki sposób, w jaki przywykliśmy na lekcjach matematyki. Żeby to zrozumieć, trzeba to zobaczyć na przykładzie.
Przypuśćmy, że w podpisach pod osiami musimy napisać jednostki, w jakich mierzone były objętości jąder komórkowych i są to ηm3 lub stężenie ołowiu w μg/g lub μg·g-1. W wielu językach programistycznych można napisać litery greckie i używać indeksów górnych, ale w konsoli R nie jest to możliwe. Trzeba użyć specjalnej notacji, którą zrozumie funkcja expression() i przetworzy na odpowiednio wyglądający tekst. Wygląda to następująco:
windows(4.5, 2.5) par(mar=c(3.6,3.6,1,1),mgp=c(1.7,0.5,0), tck=-0.03) plot(1:2,type="n", xlab=expression("objętość jądra komórkowego [" * eta * m^3 * " ]"), ylab=expression("stężenie Pb [ " * mu * g %.% g^-1 * "]")) |
Wykonanie powyższego programu spowoduje powstanie następującego wykresu:
Funkcja expression(napis) zastępuje napis w odpowiedni tekst. Elementy składające się na napis łączone są znakiem *. Wygląda to następująco:
expression( czlon1 * czlon2 * … * czlon k)Poszczególne człony, rozdzielone znakiem *, nie przecinkami, będą osobno przetwarzane i wyniki zostaną napisane jeden za drugim. Członami mogą być dowolne zestawienia liter, które zostaną nie zmienione o ile nie oznaczają jakiejś greckiej litery lub są nazwą funkcji rozumianej przez expression(). Spacje i teksty zapisane w cudzysłowie ” ” nie będą zmieniane. Natomiast specjalne zestawy znaków (liter i znaków znajdujących się na klawiaturze) oraz specjalne funkcje wewnętrzne funkcji expression() w zdefiniowany sposób zamieniają na znaki specjalne i konstrukcje matematyczne. Wykaz takich typowych konstrukcji znajduje się w helpie R. Znajdziemy go wpisując w konsoli ?plotmath. Tu podamy tylko podstawowe informacje.
Funkcja expression() przekształca następujące zestawy liter łacińskich na litery greckie:
|
Wynik działania
funkcji expression() |
|
alpha | α | |
beta | β | |
gamma | γ | |
delta | δ | |
epsilon | ε | |
zeta | ζ | |
eta | η | |
theta | θ | |
iota | ι | |
kappa | κ | |
lambda | λ | |
mu | μ | |
nu | ν | |
xi | ξ | |
omicron | ο | |
pi | π | |
rho | ρ | |
sigma | σ | |
tau | τ | |
upsilon | υ | |
phi | φ | |
chi | χ | |
psi | ψ | |
omega | ω |
Zestaw liter łacińskich |
Wynik działania
funkcji expression()
AlphaΑBetaΒGammaΓDeltaΔEpsilonΕZetaΖEtaΗThetaΘIotaΙKappaΚLambdaΛMuΜNuΝXiΞOmicronΟPiΠRhoΡSigmaΣTauΤUpsilonΥPhiΦChiΧPsiΨOmegaΩ
Indeks dolny uzyskamy pisząc expression(x[i]), a indeks górny (potęgę) uzyskamy pisząc expression(x^i). Zamiast pojedynczego symbolu w miejsce “i” można wpisać dowolnie długi tekst pod warunkiem, że nie ma w nim liczb, pauzy, przecinka i innych znaków przystankowych. Litery z liczbami muszą być objęte funkcją paste(). Ponieważ często trzeba tych znaków użyć w końcowym tekście, pożądany efekt uzyskuje się pisząc “~” w miejsce pauzy i spinając symbole rozdzielone przecinkami funkcją list().
windows(4.5, 2.5) par(mar=c(1,1,1,1),mgp=c(1.7,0.5,0), tck=-0.03) plot(1:10,type="n", xlab="", ylab="", axes=FALSE) text(3, 4, expression(x[i]*", "*x[i+1]*", "*x[indeksy~dolne]*", "*x[list(i,j,k)]), cex=1.4, adj=0) text(3, 7, expression(x^i*", "*x^list(i+1)*", "*x^list(indeksy~górne)*", "*x^list(i,j,k)), cex=1.4, adj=0) |
W efekcie uzyskujemy wykres postaci:
Funkcja expression(sqrt(x)) pozwala zapisać x pod pierwiastkiem, a expression(sqrt(1-x^2)) daje poprawny wzór matematyczny (pierwiastek z 1 – x do kwadratu). Często poszukiwany daszek nad x (lub innym wyrażeniem) uzyskamy stosując funkcje hat(x) lub widehat(x). Natomiast kreskę nad x stosowaną na oznaczenie średniej uzyskamy pisząc bar(x). Dla bardziej złożonych wzorów często znajdziemy podpowiedź w Internecie, gdyż jest to popularny temat wśród matematyków.
windows(4.5, 2.5) par(mar=c(1,1,1,1),mgp=c(1.7,0.5,0), tck=-0.03) plot(1:10,type="n", xlab="", ylab="", axes=FALSE) text(3, 7, expression(bar(x)*" = "*frac(1, n)*sum(x[i], i==1, n)), cex=1.4, adj=0) text(5, 4, expression(paste(frac(1, sigma*sqrt(2*pi))*" "* plain(e)^{frac(-(x-mu)^2, 2*sigma^2)})), cex=1.4, adj=0) |
Rezultatem działania programu jest wykres:
Biologów jednak bardziej zainteresuje fakt, że funkcja expression() pozwala także pogrubiać i pochylać wybrane fragmenty w napisach i podpisach. Służą do tego funkcje bold(), italic(), bolditalic(), którymi należy objąć pewne partie tekstu. Można też fragment tekstu podkreślić obejmując go funkcją underline(), napisać z szerszymi odstępami między literami obejmując go funkcją displaystyle(), zmniejszyć tekst obejmując go funkcja scriptstyle() lub scripscriptstyle(). Daje to dodatkowe efekty w podpisach osi, tytułach i podpisach.
windows(4.5, 2.5) par(mar=c(4, 3, 2, 1), mgp=c(1.7, 0.5, 0), tck=-0.03, ps=14) plot(5:15, type="n", xlab=expression(underline(Podpis)*" osi 0X"), ylab=expression("Podpis " * bolditalic(osi)*" "*bold(paste(0,Y))), main=expression("Tytuł "*scriptstyle(Tytuł)*" "*scriptscriptstyle(Tytuł))) |
Wstawienie powyższego kodu do konsoli powoduje powstanie następującego wykresu:
Zestawienie wszystkich możliwych efektów powoduje, że możemy stosunkowo swobodnie komponować wykresy w R, zwłaszcza gdy chodzi o rodzaje tekstów wstawianych do wykresu.
Umiejscowienie i obracanie napisów
Temat umiejscowienia napisów, podpisów i tytułu na wykresie pojawiał się już wcześniej, gdyż bez tego nie dałoby się pokazać przykładów użycia różnych opcji graficznych. W szczególności stosowano już kilka razy podrzędną funkcję graficzną text() służącą głównie do wstawiania tekstu w obrębie pola kreślenia. Jej obowiązkowymi argumentami są współrzędne punktu wskazującego gdzie ma pojawić tekst. W rozdziale o osiach wykresu omówiono opcję adj=x, która ustalała różne wyrównanie podpisów osi (do lewej, wyśrodkowanie, do prawej lub do dołu, wyśrodkowanie do góry) gdy x przyjmowało wartości 0, 0.5 i 1. Opcja ta w funkcji text() pokazuje, jak pisany jest tekst względem współrzędnych punktu , które należy podać na dwóch pierwszych miejscach. Funkcja ta ma jeszcze jedną opcję wyrównującą tekst: pos=n, gdzie n jest liczba od 1 do 4. Domyślnie ma wartość NULL, ale gdy zostanie jej przyporządkowana jakaś wartość liczbowa, to opcja adj zostanie pominięta. Poszczególne wartości opcji pos=n działają następująco:
- pos=1 Tekst znajdzie się powyżej podanego punktu współrzędnych wyśrodkowany.
- pos=2 Tekst znajdzie się na lewo od podanego punktu współrzędnych wyrównany do prawej.
- pos=3 Tekst znajdzie sie na prawo od podanego punktu współrzędnych wyrównany do lewej.
- pos=4 Tekst znajdzie się poniżej podanego punktu współrzędnych wyśrodkowany
Działanie obu opcji adj=x i pos=n w funkcji text() zobaczyć można za pomocą programu:
windows(4.5, 2.5) par(mar=c(1,1,2,1), mgp=c(2,1,0)) plot(1:3, type="n", xlab="", ylab="", axes=FALSE, main="pos=NULL") points(2,1.5, col="green", pch=20) text(2,1.5, "Ala ma kota \n(adj=1)", adj=1) points(1.5,2, col="blue", pch=20) text(1.5,2, "Ala ma kota \n(adj=0.75)", adj=0.75) points(2,2.5, col="red", pch=20) text(2,2.5, "Ala ma kota \n(adj=0)", adj=0) points(2.5,2, col="magenta", pch=20) text(2.5,2, "Ala ma kota \n(adj=0.25)", adj=0.25) # windows(4.5, 2.5) par(mar=c(1,1,2,1), mgp=c(2,1,0)) plot(1:3, type="n", xlab="", ylab="", axes=FALSE, main="adj dowolne") points(2,1.5, col="green", pch=20) text(2,1.5, "Ala ma kota \n(pos=1)", pos=1) points(1.5,2, col="blue", pch=20) text(1.5,2, "Ala ma kota \n(pos=2)", pos=2) points(2,2.5, col="red", pch=20) text(2,2.5, "Ala ma kota \n(pos=3)", pos=3) points(2.5,2, col="magenta", pch=20) text(2.5,2, "Ala ma kota \n(pos=4)", pos=4) |
Program generuje dwa wykresy:
Do obrotu tekstu (ale tylko tekstu napisanego funkcją text()) służy opcja srt=x, gdzie x jest liczba rzeczywistą oznaczającą kąt zapisany w stopniach. Obrót o kąt dodatni następuje zgodnie z ruchem przeciwnym do ruchu wskazówek zegara. Obrót zachodzi względem punktu o podanych współrzędnych. Odgrywają w nim zatem sposoby wyrównania tekstu względem tego punktu. Wygląda to następująco:
windows(4.5, 2.5) par(mar=c(1,1,2,1), mgp=c(2,1,0)) plot(1:3, type="n", xlab="", ylab="", axes=FALSE, main="pos=NULL, srt=30") points(2,1.5, col="green", pch=20) text(2,1.5, "Ala ma kota \n(adj=1)", adj=1, srt=30) points(1.5,2, col="blue", pch=20) text(1.5,2, "Ala ma kota \n(adj=0.75)", adj=0.75, srt=30) points(2,2.5, col="red", pch=20) text(2,2.5, "Ala ma kota \n(adj=0)", adj=0, srt=30) points(2.5,2, col="magenta", pch=20) text(2.5,2, "Ala ma kota \n(adj=0.25)", adj=0.25, srt=30) # windows(4.5, 2.5) par(mar=c(1,1,2,1), mgp=c(2,1,0)) plot(1:3, type="n", xlab="", ylab="", axes=FALSE, main="adj dowolne, srt=30") points(2,1.5, col="green", pch=20) text(2,1.5, "Ala ma kota \n(pos=1)", pos=1, srt=30) points(1.5,2, col="blue", pch=20) text(1.5,2, "Ala ma kota \n(pos=2)", pos=2, srt=30) points(2,2.5, col="red", pch=20) text(2,2.5, "Ala ma kota \n(pos=3)", pos=3, srt=30) points(2.5,2, col="magenta", pch=20) text(2.5,2, "Ala ma kota \n(pos=4)", pos=4, srt=30) |
Program tworzy dwa wykresy wyglądające następująco:
Stosunkowo najlepiej obraca się tekst względem punktu znajdującego się w jego środku, czyli dla parametrów domyślnych wartości opcji adj=0.5 i pos=NULL. Najczęściej potrzebny jest obrót taki, by uzyskać tekst pionowy. Współrzędne punktu tekstu docelowego ustalamy tak, by wypadły w środku tekstu. Dla osi lewej pasuje obrót o 90°, dla osi prawej o 270°. Wygląda to następująco:
windows(4.5, 2.5) par(mar=c(3,3,1,3), mgp=c(1.7,0.5,0)) plot(1:10, type="n",xlab="Podpis osi 0X", ylab="Podpis osi 0X",main="") axis(4,at=1:5*2) mtext("Podpis drugiej osi 0Y", 4, 1.7) text(1,5.5,"Tu są wartości zmiennej Y", srt=90, cex=0.8) text(10,5.5,"Tu są wartości zmiennej Z", srt=270, cex=0.8) # windows(4.5, 2.5) par(mar=c(3,3,1,3), mgp=c(1.7,0.5,0)) plot(1:10, type="n",xlab="Podpis osi 0X", ylab="Podpis osi 0X",main="", las=1) axis(4,at=1:5*2, las=1) par(xpd=TRUE) text(11.7,5.5,"Podpis drugiej osi 0Y", srt=270) text(1,5.5,"Tu są wartości zmiennej Y", srt=90, cex=0.8) text(10,5.5,"Tu są wartości zmiennej Z", srt=270, cex=0.8) |
Dzięki temu programowi powstają dwa następujące wykresy:
W nadrzędnych funkcjach graficznych, mtext(), axis() i wszystkich innych niż text() nie możemy obracać tekstu.
Umieszczanie napisów na marginesach
Na marginesach pojawiają się standardowo podpisy osi, które można napisać za pomocą opcji xlab=”” i ylab=”” wszystkich nadrzędnych funkcji graficznych. We wszystkich tych funkcjach opcja main=”” wstawia tytuł na marginesie górnym, a opcja sub=”” wstawia podpis na marginesie dolnym. Umiejscowienie podpisów osi określa opcja mgp=c(z,y,x), którą najczęściej umieszcza się w funkcji par() poprzedzającej funkcje graficzna rysującą lub w funkcjach axis(). Liczby x, y i z liczy się w jednostkach zwanych linijkami wynoszącymi 0.2 cala i określonymi jako odległość od brzegu pola kreślenia. Liczba x określa płożenie osi względem brzegu pola kreślenia i najczęściej ma wartość 0. Liczba y określa miejsce pisania etykiet i jej domyślna wartość (y=1) jest na małych wykresach zazwyczaj zbyt duża. Liczba z określa linijkę, w której umieszczany jest podpis osi (domyślnie 3). Wielkości te mogą być liczbami rzeczywistymi i można im nadać dowolna wartość, nawet ujemną. Trzeba pamiętać, że opcja mgp=c(x,y,z) w funkcji par() lub nadrzędnej funkcji graficznej działa jednakowo na wszystkie osie. Tytuł domyślnie wstawia się w środek marginesu górnego, a podpis wykresu linijkę za podpisem dolnej osi. Wygląda to następująco:
windows(4.5, 2.5) plot(1:10, type="n",xlab="Podpis osi 0X", ylab="Podpis osi 0Y",main="Tytuł", sub="Podpis") # windows(4.5, 2.5) par(mar=c(4,3,2,1), mgp=c(1.7,0.5,0)) plot(1:10, type="n",xlab="Podpis osi 0X", ylab="Podpis osi 0Y",main="Tytuł", sub="Podpis", font.main=1) |
Powstają dwa wykresy:
Po zastosowaniu opcji mar=c(x1,x2,x3,x4) i mgp=c(x,y,z) zazwyczaj otrzymujemy zadowalający wykres. Problemy pojawiają się wtedy, gdy umieszczenie podpisów pod osią 0X jest kilkulinijkowy. Nie wystarcza bowiem zwiększenie marginesu dolnego, ale trzeba też odsunąć podpis osi od etykiet. Ciekawe, że kilkulinijkowy podpis osi 0Y nie wymaga takich poprawek. Widać to po wykonaniu następującego programu:
windows(4.5, 2.5) par(mar=c(5,3.5,2,1), mgp=c(1.7,0.5,0)) plot(1:10, type="n",xlab="Podpis osi 0X \nzajmuje dwie linijki", ylab="Podpis osi 0Y", main="Tytuł", sub="Podpis", font.main=1) # windows(4.5, 2.5) par(mar=c(5,3.5,2,1), mgp=c(2.5,0.5,0)) plot(1:10, type="n",xlab="Podpis osi 0X \nzajmuje dwie linijki", ylab="Podpis osi 0Y", main="Tytuł", sub="Podpis", font.main=1) # windows(4.5, 2.5) par(mar=c(4,4,2,1), mgp=c(1.7,0.5,0)) plot(1:10, type="n",xlab="Podpis osi 0X", ylab="Podpis osi 0Y \nzajmuje dwie linijki", main="Tytuł", sub="Podpis", font.main=1) |
Program generuje trzy wykresy:
W przypadku wielolinijkowego podpisu osi 0X możemy mieś albo nadpisane etykiety dolnej osi albo za bardzo wysunięty w lewo podpis osi 0Y. W tym wypadku, podpis osi 0Y należy wstawić funkcją mtext(), a w nadrzędnej funkcji graficznej wstawić ylab=””.
Choć funkcja mtext() różni się tylko jedną literą od funkcji text() jej konstrukcja jest inna. Jej pierwszym obowiązkowym argumentem jest tekst, który ma być napisany na wykresie, ujęty w cudzysłów (albo napisany funkcją expression()), drugim jest numer marginesu, trzecim linijka, w której ma być napisany text. Trzeci argument może być dowolną liczba rzeczywistą.
windows(4.5, 2.5) par(mar=c(5,3,2,1), mgp=c(2.5,0.5,0)) plot(1:10, type="n",xlab="Podpis osi 0X \nzajmuje dwie linijki", ylab="", main="Tytuł", sub="Podpis", font.main=1) mtext("Podpis osi 0Y",2,1.7) |
Powstanie w ten sposób następujący wykres:
Funkcja mtext() umożliwia także podpisywanie osi dodatkowej 0Y wstawianej na czwartym marginesie i wstawianie wszelkich dodatków tekstowych na marginesach górnym i dolnym. Opcja adj=0.5 na każdym marginesie wyśrodkowuje tekst (jest to wartość domyślna, ale można go wyrównać do lewej lub w dół pisząc adj=0 lub do prawej / w górę pisząc adj=1. Może też przyjmować wartości ujemne lub większe od 1, co umożliwia pisanie w rogach wykresu. Zazwyczaj w lewym górnym rogu wpisywane są oznaczenia wykresów, gdy na jednej rycinie jest ich kilka. Zazwyczaj są to litery “A”, “B”,… i gdy rycina ma podpis zaczynający się od Ryc.2., to powołujemy się na poszczególne wykresy (ryc.2.A, ryc.2.B) itd. Wygląda to następująco:
windows(4.5, 2.5) par(mar=c(3,3,2,1), mgp=c(1.7,0.5,0)) plot(1:10, type="n",xlab="Odległość od portu w Gdynii [km]", ylab="Stężenie PCBs [mg/kg]", main="Zatoka Pucka", font.main=1) mtext("A",3,1,adj=-0.15, xpd=NA, font=2) # windows(4.5, 2.5) par(mar=c(3,3,2,1), mgp=c(1.7,0.5,0)) plot(1:20, type="n",xlab="Odległość od portu w Świnoujściu", ylab="Stężenie PCBs [kg/g]", main="Okolice Świnoujścia", font.main=1) mtext("B",3,1,adj=-0.15, xpd=NA, font=2) |
Program generuje dwa wykresy:
Napisy na marginesach można dodać stosując funkcję graficzną dokładającą title(). Jej opcjami są właśnie main, sub, xlab, ylab (w tej właśnie kolejności), numer linijki, w której ma się wpisać tekst, oraz wszystkie opcje graficzne, które przetwarzają tekst. Zazwyczaj stosuje się ją dla tytułu lub podpisu wykresu, umieszczając go w odpowiednim miejscu na marginesie górnym (main=””) lub dolnym (sub=””).
Poniższy program pokazuje standardowe użycie funkcji title().
windows(4.5, 2.5) par(mar=c(3,3,2,1), mgp=c(1.7,0.5,0)) plot(1:100, type="n",xlab="Podpis osi 0X", ylab="Podpis osi oY", main="") title("Tytuł wykresu") # windows(4.5, 2.5) par(mar=c(4,3,1,1), mgp=c(1.7,0.5,0)) plot(1:100, type="n",xlab="Podpis osi 0X", ylab="Podpis osi oY", main="") title(sub="Podpis wykresu") |
Powoduje on powstanie dwóch wykresów.
Powstałe wykresy są takie same jak umieszczenie odpowiednich tekstów w opcjach main=”” i sub=”” odpowiednich funkcji graficznych. Funkcja title() ma także opcję outer=TRUE, która umożliwia zrobienie wspólnego tytułu dla kilku wykresów umieszczonych na jednej rycinie, a także stosowanie wspólnych podpisów osi, gdy brzmią one identycznie na kilku wykresach.
windows(9, 5) layout(matrix(1:4,2,2,byrow=TRUE)) layout.show(4) # par(mar=c(1,1,1,1), oma=c(3,3,2,0), mgp=c(1.7,0.5,0)) plot(1:100, type="n", xlab="", ylab="", main="") plot(1:100, type="n", xlab="", ylab="", main="") plot(1:100, type="n", xlab="", ylab="", main="") plot(1:100, type="n", xlab="", ylab="", main="") # title("Wspólny tytuł wykresu", outer=TRUE) title(xlab="Wspólny podpis osi 0X",outer=TRUE, cex.lab=1.2, font.lab=2) title(ylab="Wspólny podpis osi 0Y",outer=TRUE, cex.lab=1.2, font.lab=2) |
Powyższy program powoduje powstanie wykresu:
Tego typu złożone ryciny mają wystarczające minimum potrzebnych wyjaśnień i eksponują przede wszystkim dane.