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

Pole kreślenia

Wymiary pola kreślenia

 

Pole kreślenia zawsze jest prostokątem. Jego wymiary można wyliczyć w calach jako:

długość = długość pola graficznego – szerokość marginesu prawego – szerokość marginesu lewegowysokość = wysokość pola graficznego – szerokość marginesu dolnego – szerokość marginesu górnegoNie ułatwia to jednak nawigacji w jego obrębie. Bowiem każdy punkt pola kreślenia ma współrzędne wynikające z danych, z których utworzony został wykres. Przykładowo polecenie plot(1:10) tworzy pole kreślenia, którego dolny lewy róg ma współrzędne (0.64, 0.64) a prawy górny róg ma współrzędne (10.36, 10.36). Są to współrzędne odczytane z automatycznie tworzonego w polu kreślenia fragmentu kartezjańskiego układu współrzędnych, takiego samego jakiego uczą na lekcjach matematyki. Jest on tak tworzony, aby obejmował z nawiązką wszystkie dane, które mają pojawić się w polu kreślenia. W pokazanym przykładzie prostokąt o lewym dolnym rogu (0.64, 0.64), a prawym górnym (10.36, 10.36) obejmuje z nawiązką wszystkie punkty wykreślone jako 1:10 × 1:10.

Granice pola kreślenia wyliczymy za pomocą funkcji par() obliczając jej wartość dla zmiennej tekstowej “usr”. Wygląda to następująco:

> plot(1:7)
> par("usr")
[1] 0.76 7.24 0.76 7.24
> pie(1:7)
> par("usr")
[1] -1.20802 1.20802 -1.08000 1.08000
> windows(4.5, 2.5)
> pie(1:7)
> par("usr")
[1] -5.42009 5.42009 -1.08000 1.08000
> barplot(1:7)
> par("usr")
[1] -0.128 8.728 -0.070 7.000
> boxplot(1:7)
> par("usr")
[1] 0.46 1.54 0.76 7.24

Za wyjątkiem funkcji pie() wielkości te nie ulegają zmianie przy zmianach wielkości pola graficznego spowodowanego manipulacjami myszką lub ustaleniami w funkcji windows(). Funkcja pie() ma wbudowane instrukcje powodujące, że w każdym kształcie pola kreślenia jest kołem o środku w punkcie (0,0), a to powoduje zmiany pola kreślenia przy zmianach stosunku jego długości do wysokości.

Inne dane wygenerują przy tych samych funkcjach graficznych inne współrzędne granic pola kreślenia. Są one bowiem tak określone, aby wartości liczbowe danych umieszczane na wykresie mieściły się między tymi granicami. Domyślnie przyjęta została zasada:

  • Wykres umieszczony jest w domyślnym kartezjańskim układzie współrzędnych.
  • Wyliczana jest minimalna xmin i maksymalna xmax wartość na osi 0X, tak by cały wykres mieścił się na odcinku [xmin, xmax].
  • Jeżeli w opcjach wykresu określona jest opcja xlim=c(x1,x2) to xmin=x1 i xmax=x2.
  • Wyliczany jest minimalna ymin i maksymalna ymax wartość na osi 0Y, tak by cały wykres mieścił się miedzy ymin a ymax.
  • Jeżeli w opcjach wykresu określona jest opcja ylim=c(y1,y2) to ymin=y1 i ymax=y2.
  • Od wartości minimalnej xmin odejmowanych jest 4% długości odcinka [xmin, xmax], a do wartości maksymalnej dodawana jest wartość równa 4% długości tego odcinka
  • Od wartości minimalnej ymin odejmowanych jest, a do wartości ymax dodawana jest wartość równa 4% długości odcinka [ymin, ymax].
  • Uzyskane liczby są przeskalowywane na obszar wykresu między wyznaczonymi marginesami i wykres jest rysowany.

Efektem tego jest możliwość posługiwania się układem współrzędnych pola kreślenia w celu dokonania zmian lub dorysowywania czegoś na wykresie.

 

 

Oznaczanie granic pola kreślenia

 

Poszczególne funkcje graficzne domyślnie albo generują, albo nie generuję granice pola kreślenia. Umieszczają lub nie osie na tych granicach (zwłaszcza dolną i lewą). Można tym sterować za pomocą następujących opcji funkcji graficznych sterujących:

  • axes=TRUE   Gdy osie mają się pojawić na wykresie (nie działa w funkcji pie()).
  • frame=TRUE   Gdy obramowanie ma być na wykresie (nie działa dla funkcji pie() i barplot()).
  • ann=TRUE   Gdy domyślne tytuły osi mają być na wykresie (nie działa dla funkcji pie() i barplot()).

Działają one w następujący sposób:

windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
plot(10:0, frame=FALSE, ann=FALSE)
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
boxplot(10:0, frame=FALSE, ann=FALSE)

Programy te spowodowały, że na wykresach pozostały tylko osie. Są one wykreślane tylko od wartości najmniejszej etykiety do największej.

   

Ponieważ opcja frame=TRUE nie działa w niektórych funkcjach graficznych wydaje się, że wykreślenie granic pola kreślenia na wykresie nie jest dla nich możliwe. Nie jest tak źle. Istnieje bowiem podrzędna funkcja graficzna box(), która zakreśla pole kreślenia i w dodatku ma opcje, które pozwalają wybrać styl i kolor linii zakreślającej to pole.

windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
plot(10:0, frame=FALSE, ann=FALSE, axes=FALSE)
box()
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
pie(10:0, ann=FALSE)
box()
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
barplot(10:0, ann=FALSE, axes=FALSE)
box()
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
boxplot(10:0, frame=FALSE, ann=FALSE, axes=FALSE)
box()

Programy te wygenerowały cztery wykresy:

       

We wszystkich wykresach zostało najpierw usunięte całe obramowanie i osie (o ile istniało), a następnie narysowane granice pola kreślenia.

 

Nawigacja w obrębie pola kreślenia

Znajomość współrzędnych granic pola kreślenia pozwala na umiejscowienie różnych elementów na polu kreślenia, gdyż współrzędne miejsca gdzie ma być coś dorysowane lub dopisane są obowiązkowym argumentem niemal wszystkich podrzędnych funkcji graficznych. Muszą one wskazywać punkty znajdujące się w polu kreślenia, gdyż kiedy wskażą punkt poza tym polem nic się nie dorysuje.

Przy funkcjach plot(), matplot() oraz curve() boxplot() oraz hist() wskaźnikiem pozwalającym na odczytanie współrzędnych punktów mieszczących się w polu kreślenia są liczby umieszczane na osiach. Nie trzeba wtedy wywoływać funkcji par(“usr”). Można to zobaczyć na przykładzie podrzędnej funkcji graficznej points() dorysowującej punkty do wykresu, której obowiązkowymi argumentami są wektor pierwszych i wektor drugich współrzędnych wykreślanych punktów.

windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
plot(1:7, 7:1+3)
points(1:5, 5:1+3)
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
curve(sin, -pi, pi)
points(c(-pi,pi), c(1,-1))

Po uruchomieniu tego programu powstają dwa wykresy:

   

Opisana zasada działa także w przypadku wykresów o zlogarytmowanych jednej lub obu osiach. Pokazano to przy zastosowaniu podrzędnej funkcji graficznej lines() dokładającą łamaną do wykresu, w której obowiązkowymi argumentami są której obowiązkowymi argumentami są wektor pierwszych i wektor drugich współrzędnych punktów połączonych odcinkami.

y = c(4.84, 1.12, 3.57, 10.57, 0.12, 2.55, 30.10, 30.18, 100.93, 400.15)
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
plot(1:10, y)
lines(1:10,0:9*50+0.1)
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
plot(1:10, y, log="y")
lines(1:10,0:9*50+0.1)

Programy te różnią się wyłącznie tym, że jedna z osi drugiego wykresu jest logarytmiczna. Łamana będąca prostą na pierwszym wykresie zmienia się na łamaną na drugim.

  

Pewne problemy może sprawiać funkcja barplot(), gdyż nie tworzy ona osi poziomej wskazującej współrzędne punktów w polu kreślenia. Dopiero po dłuższym szukaniu można znaleźć przyjęte zasady tworzenia słupków: lewy brzeg pierwszego słupka jest na linii x=0, słupkom przyporządkowano domyślną szerokość 1, a odstępy między nimi wynoszą 0.2. Okazuje się, jednak, że funkcja ta obok zrobienia wykresu tworzy także jednokolumnową macierz liczb będącymi współrzędnymi środków słupków. Można je wykorzystać do modyfikacji wykresu.

windows(4.5, 2.5)
par(mar=c(0.5, 3, 0.5, 0.5))
barplot(1:7)
points(1:7, 1:7-0.5)
#
windows(4.5, 2.5)
par(mar=c(0.5, 3, 0.5, 0.5))
a=barplot(1:7)
points(a, 1:7-0.5))

Programy te utworzyły dwa wykresy:

  

Tylko w drugim dołożone punkty wypadły w środku słupków. W pokazanym przykładzie macierz środków słupków wygląda następująco:

> a=barplot(1:7)
> a
    [,1]
[1,] 0.7
[2,] 1.9
[3,] 3.1
[4,] 4.3
[5,] 5.5
[6,] 6.7
[7,] 7.9

Gdy argumentem tej funkcji barplot() jest macierz kilkukolumnowa zasada rozmieszczania słupków już już inna:

> a=barplot(cbind(1:3, 3:1, c(1,3,2)), beside=TRUE)
> a
     [,1] [,2] [,3]
[1,]  1.5  5.5  9.5
[2,]  2.5  6.5 10.5
[3,]  3.5  7.5 11.5

Jednocześnie powstał następujący wykres:

Warto zapamiętać o pokazanej właściwości funkcji barplot(), gdyż bardzo ułatwia modyfikowanie wykresów przez nią utworzonych.

 

Modyfikacja pola kreślenia

Rozmiary i przydzielenie skali liczbowej polu kreślenia przebiegają w kilku etapach obejmuje etap odjęcie od wartości minimalnych wykresu wielkości odpowiadającej 4% długości oraz wysokości wykresu i dodanie do wartości maksymalnych wielkości odpowiadającej 4% długości i wysokości wykresu. Etap ten powoduje, że żaden z elementów wykresu nie znajdzie się na osi lub na brzegu pola kreślenia, gdzie może być tylko połowicznie narysowany. Jednocześnie może powodować nieco mylną interpretację niektórych wykresów, gdyż przywykliśmy, że osie wykresów przecinają się w punkcie (0,0). W niektórych sytuacjach lepiej jest zlikwidować etap drugi, przynajmniej w stosunku do jednej osi. Wykonuje się to opcjami xaxs i yaxs funkcji par() domyślnie przyjmującymi wartości “r” (ustawienie standardowe). Należy im nadać wartość “i”.

windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
plot(0:10)
par("usr")
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5), xaxs="i")
plot(0:10)
par("usr")
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5), yaxs="i")
plot(0:10)
par("usr")
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5), xaxs="i", yaxs="i")
plot(0:10)
par("usr")

Program tworzy 4 wykresy:

      

Jednocześnie zmieniają się współrzędne dolnego lewego i górnego prawego rogu pola kreślenia, co wykrywamy funkcją par(“usr”):

> windows(4.5, 2.5)
> par(mar=c(3, 3, 0.5, 0.5))
> plot(0:10)
> par("usr")
[1] 0.6 11.4 -0.4 10.4
>
> windows(4.5, 2.5)
> par(mar=c(3, 3, 0.5, 0.5), xaxs="i")
> plot(0:10)
> par("usr")
[1] 1.0 11.0 -0.4 10.4
>
> windows(4.5, 2.5)
> par(mar=c(3, 3, 0.5, 0.5), yaxs="i")
> plot(0:10)
> par("usr")
[1] 0.6 11.4 0.0 10.0
>
> windows(4.5, 2.5)
> par(mar=c(3, 3, 0.5, 0.5), xaxs="i", yaxs="i")
> plot(0:10)
> par("usr")
[1] 1 11 0 10
>

Dodam, że funkcja plot() dla pojedynczego wektora tworzy rozrzut punktów (i, x[i]) gdzie i jest liczone od 1. Zatem minimalna wartością na osi 0X jest 1 a maksymalna 11. Na osi 0Y minimalną wartością jest 0 a maksymalną 10.

Czasami potrzebne są sztuczne zmiany zakresu wykreślania danych. Rządzą tym opcje nadrzędnych funkcji graficznych:

  • xlim=c(x1,x2) Minimalna wartość na osi 0X równa x1 i maksymalna równa x2.
  • ylim=c(y1,y2) Minimalna wartość na osi 0Y równa y1 i maksymalna równa y2.

Opcje te zmieniają etap pierwszy wyznaczania pola kreślenia, nie wpływając na etap drugi.

windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
plot(0:10, xlim=c(0,5), ylim=c(0,10))
par("usr")
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
plot(0:10, xlim=c(0.34,5.72), ylim=c(-0.11,10.53))
par("usr")
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
barplot(0:10, xlim=c(0,5), ylim=c(2,10))
par("usr")
box()
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5))
boxplot(0:10, -1:11, xlim=c(0,5), ylim=c(2,10))
par("usr")

Cztery wykresy tworzone przez ten program wyglądają następująco:

      

Ograniczenie zakresu rysowania na osi pionowej spowodowały przesunięcie obrazu funkcji barplot() oraz boxplot() na margines dolny i obcięcie części wykresu. Z tym, że dla funkcji barplot() częsci znajdujace się na marginesach zostały ujawnione a dla funkcji boxplot() nie. Dzieje się to dlatego, że jedną z opcji funkcji barplot() jest xpd mająca domyślnie wartość TRUE. Opcja logiczna xpd stosowana jest najczęscie w funkcji par() i domyślnie przyjmuje wartość FALSE co nie pozwala niczego dorysowywać lub dopisywać na marginesach. Dopiero zastosowanie par(xpd=TRUE) pozwala na takie operacje. Jednak taka sama opcja w funkcji nadrzędnej może to zmienić, choć dotyczy to tylko wykonania funkcji nadrzędnej. Wygląda to następująco:

windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5), xpd=FALSE)
barplot(0:10, xlim=c(0,5), ylim=c(2,10), xpd=TRUE)
par("usr")
box()
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5), xpd=TRUE)
barplot(0:10, xlim=c(0,5), ylim=c(2,10), xpd=FALSE)
par("usr")
box()
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5), xpd=FALSE)
boxplot(0:10,-1:11, xlim=c(0,5), ylim=c(2,10), xpd=FALSE)
par("usr")
box()
#
windows(4.5, 2.5)
par(mar=c(3, 3, 0.5, 0.5), xpd=TRUE)
boxplot(0:10,-1:11, xlim=c(0,5), ylim=c(2,10), xpd=FALSE)
par("usr")
box()

Powstałe wykresy wyglądają następująco:

      

Funkcja boxplot() nie ma wogóle opcji xpd i reaguje wyłącznie na wartość tej opcji w funkcji par().

Współrzędne rogów pola kreślenia, ujawnione w konsoli przy okazji wykonywania ostatniego programu, wyglądają następująco:

> windows(4.5, 2.5)
> par(mar=c(3, 3, 0.5, 0.5))
> plot(0:10, xlim=c(0,5), ylim=c(0,10))
> par("usr")
[1] -0.2 5.2 -0.4 10.4
>
> windows(4.5, 2.5)
> par(mar=c(3, 3, 0.5, 0.5))
> plot(0:10, xlim=c(0.34,5.72), ylim=c(-0.11,10.53))
> par("usr")
[1] 0.1248 5.9352 -0.5356 10.9556
>
> windows(4.5, 2.5)
> par(mar=c(3, 3, 0.5, 0.5))
> barplot(0:10, xlim=c(0,5), ylim=c(2,10))
> par("usr")
[1] -0.2 5.2 2.0 10.0
> box()
>
> windows(4.5, 2.5)
> par(mar=c(3, 3, 0.5, 0.5))
> boxplot(0:10, xlim=c(0,5), ylim=c(2,10))
> par("usr")
[1] -0.20 5.20 1.68 10.32

 

Zmiana pola kreślenia i tworzenie wykresów o osi dodatkowej

Czasami już po utworzeniu wykresu trzeba zmienić współrzędne pola kreślenia gdy chcemy na nim dorysować dane wyliczane w innych jednostkach i mające inne wartości. Innymi słowy, gdy chcemy zastosować wykres z dwoma osiami 0Y. W tym wypadku musimy sami przyjrzeć się dokładanym danym, znaleźć ich wartość minimalną i maksymalną na osi 0X i 0Y i posłużyć się funkcją plot.window(). Jej obowiązkowymi argumentami są xlim=c(xmin,xmax) oraz ylim=c(ymin,ymax). Funkcja działa tylko, gdy już został utworzony jakiś wykres z określonym polem kreślenia. Służy zatem tylko do zmiany jego układu współrzędnych przy czym sama dokłada z każdej strony 4% długości i wysokości wynikających z podanych granic w opcjach xlim i ylim (o ile opcje xaxs i yaxs nie decydują inaczej).

windows(4.5, 2.5)
par(mar=c(3, 3, 3, 3))
plot(0:10, type="l")
plot.window(c(0,60),c(-10,50))
points(0:60, 50:-10)
axis(3)
axis(4)

 

Program generuje następujący wykres:

Spis treści