Ta strona wykorzystuje ciasteczka ("cookies") w celu zapewnienia maksymalnej wygody w korzystaniu z naszego serwisu. Czy wyrażasz na to zgodę?

Czytaj więcej
< All Topics
Print

Wzory, desenie, tekstura i siatka

Znaczniki

Znaczniki, jako graficzna reprezentacja punktów na wykresach występują w funkcjach plot() i matplot() z opcją type=”p” lub type=”b” oraz w funkcji points(). Standardowo pojawiają się w wykresach jako puste kółeczka. Można zmienić ich kształt wykorzystując opcje pch=n, gdzie n jest liczbą od 1 do 25 generującą różne kształty znaczników. Można je zobaczyć za pomocą programu:

windows(4.5, 2.5)
par(mar=c(1,1,1,1), xpd=TRUE)
plot(1:5, type="n", axes=FALSE)
points(1:5, rep(5,5), pch=1:5)
points(1:5, rep(4,5), pch=6:10)
points(1:5, rep(3,5), pch=11:15)
points(1:5, rep(2,5), pch=16:20)
points(1:5, rep(1,5), pch=21:25)
text(1:5+0.2, rep(5,5), paste(1:5))
text(1:5+0.2, rep(4,5), paste(6:10))
text(1:5+0.2, rep(3,5), paste(11:15))
text(1:5+0.2, rep(2,5), paste(16:20))
text(1:5+0.2, rep(1,5), paste(21:25))

Powstaje w ten sposób wykres:

Wielkość znacznika można zmienić opcją cex=x. Standardowo cex=1. Można mu przypisywać wartości typu ciąg liczb, co daje ciekawe efekty.

windows(4.5, 2.5)
par(mar=c(1,1,1,1))
plot(1:10, type="p", pch=c(8,20), cex=1:10/2)

Program generuje wykres:

Kolory znaczników można zmienić opcją col=c(“color1”, “color2”,…). Dopasowuje ona punkt na pozycji i-tej z kolorem na pozycji i-tej, a gdy kolorów jest mniej niż punktów proces dopasowania zaczyna się do początku wektora kolorów. Wygląda to następująco:

windows(4.5, 2.5)
par(mar=c(1,1,1,1), xpd=TRUE)
matplot(1:5, cbind(1:5, 1:5*2, 1:5*3),type="b", pch=19, col=rainbow(3))

Program generuje pokazany niżej wykres.

W funkcji matplot() zawsze ten sam znacznik, kolor i wielkość dopasowywany jest do całej serii danych zapisanych w kolumnach macierzy wyników.

 

Linie

Linie pokazują się jako wyniki w wykresach liniowych, ale są też obramowaniami słupków lub pudełek. Ponadto występują na osiach i obramowaniach wykresu, a często też trzeba dodać jakąś linię lub łamaną do wykresu. We wszystkich funkcjach rysujących linie, ich styl można zmienić za pomocą opcji lty=n mającą wartości od 1 do 6. Zamiast liczb można wpisać nazwy wzorów:

  1. “solid”     Linia ciągła ustalana domyślnie.
  2. “dashed”     Linia kreskowana.
  3. “dotted”     Linia kropkowana.
  4. “dotdashed”   Linia kreskowano-kropkowana.
  5. “longdashed”   Linia kreskowana z długini kreseczkami.
  6. “twodashed”   Linia zmiennie kreskowana krótkimi i długimi kreskami.

Można je zobaczyć za pomocą programu:

 

windows(4.5, 2.5)
par(mar=c(1,1,1,1), xpd=TRUE)
plot(1:9, type="n", axes=FALSE)
for (i in 1:9) {lines(c(1,8), c(10-i,10-i), lty=i)
text(9,10-i,paste("lty =",i))}

Po jego uruchomieniu pokazuje się następujący wykres:

Dla lty=7 linia ma taki sam styl jak lty=1 , lty=8 odpowiada lty=2 itp.

W funkcji matplot() opcja lty=n może mieć wartości zapisane w postaci wektora. Każda z linii otrzyma wtedy styl ustalony według zasady n-ty numer kolumny w macierzy wyników ma styl zapisany na n-tym miejscu w tym wektorze (który ewentualnie jest wielokrotnie powielany). Wygląda to następująco:

windows(4.5, 2.5)
par(mar=c(1,1,1,1), xpd=TRUE)
matplot(1:5, cbind(1:5, 1:5*2, 1:5*3, 1:5*4, 1:5*5, 1:5*6), type="l", 
   lty=1:3)
#
windows(4.5, 2.5)
par(mar=c(1,1,1,1), xpd=TRUE)
matplot(1:5, cbind(1:5, 1:5*2, 1:5*3, 1:5*4, 1:5*5, 1:5*6), type="l", 
   lty=c(1,1,2,2,3,3))

 

 

Grubość linii określa się opcją lwd=x, gdzie x musi być większe od 0, choć może mieć wartość NA (brak linii). Wygląd linii o grubości x na różnych monitorach może nieco różnić sie od siebie i najlepiej jest przetestować to za pomocą programu:

windows(4.5, 2.5)
par(mar=c(1,1,2,1), xpd=TRUE)
plot(1:10, type="n", axes=FALSE, main="lty=1")
for (i in 1:10){ lines(c(1,8), c(11-i,11-i), lwd=i, lty=1)
text(10,11-i, paste(i))}
#
windows(4.5, 2.5)
par(mar=c(1,1,2,1), xpd=TRUE)
plot(1:10, type="n", axes=FALSE, main="lty=2")
for (i in 1:10){ lines(c(1,8), c(11-i,11-i), lwd=i, lty=2)
text(10,11-i, paste(i))}
#
windows(4.5, 2.5)
par(mar=c(1,1,2,1), xpd=TRUE)
plot(1:10, type="n", axes=FALSE, main="lty=3")
for (i in 1:10){ lines(c(1,8), c(11-i,11-i), lwd=i, lty=3)
text(10,11-i, paste(i))}

Po jego uruchomieniu pojawią się trzy wykresy:

Przy grubych liniach widać, że końce linii są zaokrąglone. Zmianę kształtu końców linii można uzyskać za pomocą opcji lend=n mającą wartości 0, 1 lub 2 albo ich odpowiednik słowny:

  • “round” = 0 końce zaokrąglone (wartość domyślna)
  • “butt” = 1 końce kwadratowe przez obcięcie zaokrągleń.
  • “square” = 2 końce kwadratowe przez objęcie zaokrągleń.

Różnice po uzyciu tej opcji widać

windows(4.5, 2.5)
par(mar=c(1,1,2,1), xpd=TRUE)
plot(1:6, type="n", axes=FALSE, main="lend=0")
for (i in 1:6){ lines(c(1,5.5), c(7-i,7-i), lwd=10, lend=0, lty=i)
text(6,7-i, paste("lty=",i))}
#
windows(4.5, 2.5)
par(mar=c(1,1,2,1), xpd=TRUE)
plot(1:6, type="n", axes=FALSE,, main="lend=1")
for (i in 1:6){ lines(c(1,5.5), c(7-i,7-i), lwd=10, lend=1, lty=i)
text(6,7-i, paste("lty=",i))}
#
windows(4.5, 2.5)
par(mar=c(1,1,2,1), xpd=TRUE)
plot(1:6, type="n", axes=FALSE, main="lend=2")
for (i in 1:6){ lines(c(1,5.5), c(7-i,7-i), lwd=10, lend=2, lty=i)
text(6,7-i, paste("lty=",i))}

Program spowoduje powstanie trzech wykresów:

Również sposób łączenia linii w krzywych łamanych można zmienić opcją ljoin=n, gdzie n ma wartość 0, 1 lub 2 albo słowną:

  • “round” = 0 połaczenia zaokrąglone (wartość domyślna)
  • “mitre” = 1 połaczenia stożkowe.
  • “bevel” = 2 połaczenia będące ściętym stożkiem.
x=c(0,3,2,5,3,4)
#
windows(4.5, 2.5)
par(mar=c(1,1,2,1), xpd=TRUE)
plot(1:6,1:6*2, type="n", axes=FALSE, main="lend=0, ljoin=0", xlim=c(1,7))
for (i in 1:6){ lines(1:6, x+7-i, lwd=10, lend=0, ljoin=0, lty=i)
text(7,7-i+4, paste("lty=",i))}
#
windows(4.5, 2.5)
par(mar=c(1,1,2,1), xpd=TRUE)
plot(1:6,1:6*2, type="n", axes=FALSE, main="lend=0, ljoin=1", xlim=c(1,7))
for (i in 1:6){ lines(1:6, x+7-i, lwd=10, lend=0, ljoin=1, lty=i)
text(7,7-i+4, paste("lty=",i))}
#
windows(4.5, 2.5)
par(mar=c(1,1,2,1), xpd=TRUE)
plot(1:6,1:6*2, type="n", axes=FALSE, main="lend=0, ljoin=2", xlim=c(1,7))
for (i in 1:6){ lines(1:6, x+7-i, lwd=10, lend=0, ljoin=2, lty=i)
text(7,7-i+4, paste("lty=",i))}

Program generuje trzy wykresy:

Operowanie opcjami lend i ljoin niekiedy zwiększa optycznie zróżnicowanie linii na wykresach, co ułatwia jego interpretację.

Niekiedy wybrane nadrzędne funkcje graficzne w nieoczekiwany sposób reagują na opcję lty=n. Np. w funkcji barplot() nie zmienia się styl obramowań słupków, ale istnieje opcja axis.lty=n, która zmienia styl osi pionowej. W funkcjach pie() i boxplot() opcja ta zmienia obramowania wycinków koła i pudełek, a także styl prostej oznaczającej medianę. Wygląda to następująco:

windows(4.5, 2.5)
par(mar=c(1,1,1,1))
barplot(1:10, lty=2, axis.lty=3)
#
windows(4.5, 2.5)
par(mar=c(1,1,1,1))
boxplot(1:10, lty=2)
#
windows(4.5, 2.5)
par(mar=c(1,1,1,1))
pie(1:10, lty=2)

Dzięki temu programowi powstają wykresy:

Desenie i tekstura

W standardowych opcjach R nie istniej coś takiego, jak wypełnianie obszaru zadanym wcześniej wzorem lub robieniu wykresu na tle zdjęcia. Możemy co najwyżej wypełnić wzorami to, co jest możliwe do wypełnienia kolorem. Są to słupki w funkcji barplot(), wycinki koła w funkcji pie() oraz wielokąty napisane funkcją graficzna dokładającą polygon(). Zrobienie wzorów umożliwiają opcje density=x, angle=y. Powodują one wpisanie w obszary kresek o nachyleniu y (y oznacza kąt w stopniach) i zagęszczeniu x. W domyśle x=NULL, co daje efekt braku tekstury.

windows(4.5, 2.5)
par(mar=c(1,1,1,1))
pie(c(4,2,3,5,1,2), angle=1:6*30, density=10)
#
windows(4.5, 2.5)
par(mar=c(1,1,1,1))
barplot(c(4,2,3,5,1,2), angle=1:6*30, density=10)
#
windows(4.5, 2.5)
par(mar=c(1,1,1,1))
plot(1:6, type="n")
polygon(1:6, c(4,2,3,5,1,2), angle=30, density=10)

Wykonanie tych funkcji powoduje wygenerowanie trzech wykresów:

Dodatkowe efekty daje możliwość kolorowania tekstury, wybierania wzorów i grubości linii tworzących teksturę oraz nakładania wykresów na siebie (nie dotyczy funkcji pie()):

windows(4.5, 2.5)
par(mar=c(1,1,1,1))
pie(c(4,2,3,5,1,2), angle=1:6*30, density=1:6*20, lty=1:6, lwd=5, col=1:6)
#
windows(4.5, 2.5)
par(mar=c(1,1,1,1))
barplot(c(4,2,3,5,1,2), angle=1:6*30, density=1:6*5, col=1:6)
barplot(c(4,2,3,5,1,2), angle=1:6*(-30), density=1:6*5, col=1:6, add=TRUE)
#
windows(4.5, 2.5)
par(mar=c(1,1,1,1))
plot(1:6, type="n")
polygon(1:6, c(4,2,3,5,1,2), angle=30, density=20, lty=3, col=3)
polygon(1:6, c(4,2,3,5,1,2), angle=-30, density=30, lty=3, col=7)
polygon(1:6, c(4,2,3,5,1,2))

Wynikiem działania tego programu są trzy wykresy wyglądające następująco:

Siatka w polu kreślenia

Czasem z wykresów trzeba odczytywać przybliżone wartości danych i bardzo pomaga w tym siatka umieszczana w polu kreślenia. Umieszcza się ją stosując podrzędną funkcję graficzną grid(), której przykład zastosowania podano już w rozdziale o kolorach jako sposób na kolorowanie tła pola kreślenia. Jej użycie dla różnych typów wykresów wygląda następująco:

windows(4.5, 2.5)
par(mar=c(2,2,1,1))
plot(c(4,2,3,5,1,2))
grid()
#
windows(4.5, 2.5)
par(mar=c(1,1,1,1))
pie(c(4,2,3,5,1,2))
grid()
#
windows(4.5, 2.5)
par(mar=c(1,2,1,1))
barplot(c(4,2,3,5,1,2))
grid()
#
windows(4.5, 2.5)
par(mar=c(1,2,1,1))
boxplot(1:6)
grid()

Widać, że siatka tworzy się na wykresie, a nie w tle. Powoduje to często konieczność nadpisania wykresu funkcjami graficznymi dokładającymi (co nie jest możliwe dla funkcji pie(). Wygląda to wtedy następująco:

windows(4.5, 2.5)
par(mar=c(2,2,1,1))
plot(c(4,2,3,5,1,2))
grid(col="#ccffff", lty=1, lwd=2)
points(1:6,c(4,2,3,5,1,2))
#
windows(4.5, 2.5)
par(mar=c(1,2,1,1))
barplot(c(4,2,3,5,1,2))
grid(col="#ffccff", lty=1, lwd=2)
barplot(c(4,2,3,5,1,2),add=TRUE)
#
windows(4.5, 2.5)
par(mar=c(1,2,1,1))
boxplot(1:6)
grid(col="#ccffcc", lty=1, lwd=2)
boxplot(1:6, col="white", add=TRUE)

Program utworzy wykresy:

Opcje graficzne takie jak col=”kolor”, lty=n, lwd=x umożliwiają tworzenie różnych wzorów i kolorów linii stosowanych w siatce i nie sprawiają one problemów. Problemem jest inne niż domyślne rozmieszczenie linii siatki tak, aby spełniała ona swoje zadanie, tzn. umożliwiała odczytywanie na osiach wartości. Chodzi o opcje nx=n i ny=n wskazujące, z ilu linii poziomych i pionowych ma składać się siatka. Po policzeniu tych części na wyżej wykonanych wykresach i wstawieniu ich do opcji nx=n i ny=n otrzymamy następujący program:

windows(4.5, 2.5)
par(mar=c(2,2,1,1))
plot(c(4,2,3,5,1,2))
grid(nx=7, ny=6, col=”#ccffff”, lty=1, lwd=2)
points(1:6,c(4,2,3,5,1,2))
#
windows(4.5, 2.5)
par(mar=c(1,2,1,1))
barplot(c(4,2,3,5,1,2))
grid(nx=9, ny=5, col=”#ffccff”, lty=1, lwd=2)
barplot(c(4,2,3,5,1,2),add=TRUE)
#
windows(4.5, 2.5)
par(mar=c(1,2,1,1))
boxplot(1:6)
grid(nx=6, ny=7, col=”#ccffcc”, lty=1, lwd=2)
boxplot(1:6, col=”white”, add=TRUE)

który generuje następujące wykresy:

Siatki, których linie nie wypadają w znacznikach etykiet osi, nie tylko nie ułatwiają odczytanie wartości danych, ale też niezbyt ładnie wyglądają. Winna jest temu zasada dzielenia całego obszaru kreślenia na równe części łącznie z 4% dodatkiem wydłużającym z każdej strony obszar kreślenia. Wykres barplot() dla osi 0Y tego nie robi i linie siatki są na nim poprawne. Jak sobie z poradzić z innymi wykresami? Są na to trzy sposoby:

  • nx=NULL, ny=NULL powoduje, że linie siatki są wykreślane zgodnie z podanymi znacznikami osi utworzonymi domyślnie.
  • nx=NA, ny=NA powoduje, że odpowiednie linie pionowe albo poziome siatki nie pojawią się.
  • Zastosowanie opcji xax=”i”, yaxs=”i” oraz xlim=c(x1,x2), ylim(y1,y2) o “okrągłych” granicach spowoduje, że odpowiedni podział pola graficznego będzie zgadzał się z pożądanym wyglądem siatki.

Można to zobaczyć za pomocą programu:

windows(4.5, 2.5)
par(mar=c(2,2,1,1), xaxs="i", yaxs="i")
plot(c(4,2,3,5,1,2), xlim=c(0,7), ylim=c(0,6))
grid(nx=7, ny=6, col="#ccffff", lty=1, lwd=2)
points(1:6,c(4,2,3,5,1,2))
#
windows(4.5, 2.5)
par(mar=c(1,2,1,1))
barplot(c(4,2,3,5,1,2))
grid(nx=NA, ny=NULL, col="#ffccff", lty=1, lwd=2)
barplot(c(4,2,3,5,1,2),add=TRUE)
#
windows(4.5, 2.5)
par(mar=c(1,2,1,1), yaxs="i")
boxplot(1:6, axes=FALSE)
axis(2,at=10:60/10, labels=rep("",51), tck=-0.02)
grid(nx=NA, ny=50, col="#ccffcc", lty=1, lwd=2)
axis(2,at=2:12/2, labels=rep("",11), tck=-0.04)
grid(nx=NA, ny=10, col="#99ff99", lty=1, lwd=2)
axis(2,at=1:6)
grid(nx=NA, ny=NULL, col="#55ff55", lty=1, lwd=2)
boxplot(1:6, axes=FALSE, col="white", add=TRUE)

Program tworzy następujące wykresy:

Ostatni z przykładów pokazuje, że przy tworzeniu właściwej siatki najlepiej posługiwać się wszystkimi trzema sposobami.

Spis treści