2011-07-28 31 views
17

Jest to kontynuacja this question.Wykreślanie wielu krzywych tego samego wykresu i tej samej skali

Chciałem wydrukować wiele krzywych na tym samym wykresie, ale tak, aby moje nowe krzywe były zgodne z tą samą skalą osi Y wygenerowaną przez pierwszą krzywą.

Wskazówka następujący przykład:

y1 <- c(100, 200, 300, 400, 500) 
y2 <- c(1, 2, 3, 4, 5) 
x <- c(1, 2, 3, 4, 5) 

# first plot 
plot(x, y1) 

# second plot 
par(new = TRUE) 
plot(x, y2, axes = FALSE, xlab = "", ylab = "") 

To rzeczywiście działki oba zestawy wartości, na tych samych współrzędnych wykresu (bo ja chowam nową oś y, który byłby stworzony z drugiej działce) .

Moje pytanie brzmi: jak zachować tę samą skalę osi y podczas drukowania drugiego wykresu.

+1

Nie jestem pewien, co chcesz. Graficzny, co chcesz pomoże ... –

+0

Wystarczy dodać do komentarza manoel za drugi zbiór wartości Y są poza zasięgiem pierwszej. Gdzie spodziewacie się ich wykreślić? – joran

+0

@Manoel: to właśnie szukam rzeczywiście ... – Renan

Odpowiedz

30

(Typowa metoda polega na użyciu plot jednorazowo ustawić limity, ewentualnie obejmować zakres wszystkich serii połączone, a następnie użyć points i lines, aby dodać oddzielną serię.) Aby wielokrotnie używać plot z par(new=TRUE) musisz upewnić się, że twój pierwszy działka ma prawidłową ylim, aby zaakceptować wszystkie serie (a w innej sytuacji może zajść potrzeba użycia tej samej strategii dla xlim):

# first plot 
plot(x, y1, ylim=range(c(y1,y2))) 

# second plot EDIT: needs to have same ylim 
par(new = TRUE) 
plot(x, y2, ylim=range(c(y1,y2)), axes = FALSE, xlab = "", ylab = "") 

enter image description here

Następny kod będzie wykonać zadanie bardziej kompaktowo, domyślnie można uzyskać numery jako punkty ale druga daje typową R-Type „punkty”:

matplot(x, cbind(y1,y2)) 
    matplot(x, cbind(y1,y2), pch=1) 
+0

Czy drugi zestaw wartości y nie ma być 1: 5? – joran

+0

Tak, to nie działa. Widać, że te punkty nie są reprezentowane w tej samej skali osi y, inaczej 2 byłaby większa niż 100 ... :) – Renan

+0

Ojej: Will edytować –

1

Nie jestem pewien, czego chcesz, ale użyję kraty.

x = rep(x,2) 
y = c(y1,y2) 
fac.data = as.factor(rep(1:2,each=5)) 
df = data.frame(x=x,y=y,z=fac.data) 
# this create a data frame where I have a factor variable, z, that tells me which data I have (y1 or y2) 

Następnie wykreślanie

xyplot(y ~x|z, df) 
# or maybe 
xyplot(x ~y|z, df) 
+4

Lub 'xyplot (y ~ x, grupy = z, df)'. I bez tworzenia nowego 'data.frame':' xyplot (y1 + y2 ~ x) '. – Marek

+0

Wiem o tym, ale nigdy go nie użyłem! Może powinienem spróbować. +1 dla wskaźnika. –

5

Nie bardzo wiesz, czego chcesz, ponieważ uważam, że @ DWin jest technicznie poprawny, biorąc pod uwagę przykładowy kod. Myślę, że to, co naprawdę chcą to:

y1 <- c(100, 200, 300, 400, 500) 
y2 <- c(1, 2, 3, 4, 5) 
x <- c(1, 2, 3, 4, 5) 

# first plot 
plot(x, y1,ylim = range(c(y1,y2))) 

# Add points 
points(x, y2) 

rozwiązanie Dwin została działająca pod domniemanym założeniu (w oparciu o przykład kodu), który chciał wykreślić drugi zbiór punktów nakładka na oryginalnej skali . Dlatego jego obraz wygląda tak, jak punkty są nanoszone na 1, 101 itd. Wywoływanie plot po raz drugi nie jest tym, czego chcesz, chcesz dodać do wykresu przy użyciu points. Więc powyższy kod na moim komputerze produkuje to:

enter image description here

Ale głównym punktem Dwin na temat korzystania ylim jest poprawna.

+0

Punkty dla ciebie. Naprawiono mój problem z y, używając tego samego ylim na obu. Prawdopodobnie powinien był wykorzystać punkty z perspektywy czasu. –

+0

Nie potrzebujesz 'c' w zasięgu. "zasięg (y1, y2)" jest wystarczający. – Marek

6

points lub lines jest przydatny jeśli

  • y2 generowany jest później lub
  • nowe dane nie mają taką samą x ale nadal powinno iść w tym samym układzie współrzędnych.

W swojej y Udostępnij ten sam x, można również użyć matplot:

matplot (x, cbind (y1, y2), pch = 19) 

matplot (x, cbind (y1, y2), pch = 19)

(bez pchmatplopt będzie fabuła numerami kolumn macierzy y zamiast kropek).

+0

+1 Widzę, że przed tobą spadł do strategii matplot. –

+0

Jak mogę opisać czarne kropki i czerwone kropki odpowiednio za pomocą y1 i y2? – dacongy

+0

@dacongy: 'pch' symboli przyjmuje jedną znaków (na przykład „A” i „B” lub „1” i „2”) na każdej z kolumn macierzy r. Jeśli naprawdę potrzebujesz dłuższego tekstu, AFAIK, musisz użyć 'text' dla każdej z kolumn (lub napisać funkcję mattext ;-)) – cbeleites

3

Moje rozwiązaniem jest użycie ggplot2. Dotyka tego typu rzeczy automatycznie. Najważniejsze jest odpowiednie uporządkowanie danych.

y1 <- c(100, 200, 300, 400, 500) 
y2 <- c(1, 2, 3, 4, 5) 
x <- c(1, 2, 3, 4, 5) 
df <- data.frame(x=rep(x,2), y=c(y1, y2), class=c(rep("y1", 5), rep("y2", 5))) 

Następnie użyj ggplot2 wykreślić to

library(ggplot2) 
ggplot(df, aes(x=x, y=y, color=class)) + geom_point() 

To mówi wykreślić dane w df i rozdzielić punkty class.

Działka generowany jest enter image description here

Powiązane problemy