Wykreśl dwa wykresy na tym samym wykresie w R

Chciałbym narysować y1 i y2 na tej samej działce.

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
plot(x, y1, type = "l", col = "red")
plot(x, y2, type = "l", col = "green")

Ale kiedy robię to w ten sposób, nie są one nakreślone w tym samym wątku razem.

W Matlab można zrobić hold on, ale czy ktoś wie jak to zrobić w R?

Author: Henrik, 2010-04-02

15 answers

lines() or points() doda do istniejącego wykresu, ale nie utworzy nowego okna. Więc musisz zrobić

plot(x,y1,type="l",col="red")
lines(x,y2,col="green")
 497
Author: bnaul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-01 05:57:33

Można również użyć par i rysować na tym samym wykresie, ale na innej osi. Coś w następujący sposób:

plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )

Jeśli przeczytasz szczegółowo o par W R, będziesz w stanie wygenerować naprawdę ciekawe wykresy. Kolejną książką do obejrzenia jest grafika R Paula Murrela.

 175
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-04 15:43:12

Przy konstruowaniu działek wielowarstwowych należy wziąć pod uwagę ggplot Pakiet. Ideą jest stworzenie obiektu graficznego o podstawowej estetyce i stopniowe jego Ulepszanie.

ggplot styl wymaga spakowania danych w data.frame.

# Data generation
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x,y1,y2)

Rozwiązanie podstawowe:

require(ggplot2)

ggplot(df, aes(x)) +                    # basic graphical object
  geom_line(aes(y=y1), colour="red") +  # first layer
  geom_line(aes(y=y2), colour="green")  # second layer

Tutaj {[7] } służy do dodawania dodatkowych warstw do obiektu basic.

Z ggplot masz dostęp do obiektów graficznych na każdym etapie kreślenia. Powiedzmy, że zwykła konfiguracja krok po kroku może wyglądać tak to:

g <- ggplot(df, aes(x))
g <- g + geom_line(aes(y=y1), colour="red")
g <- g + geom_line(aes(y=y2), colour="green")
g

g produkuje wykres, i można go zobaczyć na każdym etapie (dobrze, po utworzeniu co najmniej jednej warstwy). Kolejne zaczarowania fabuły są również wykonywane za pomocą stworzonego obiektu. Na przykład możemy dodać etykiety dla osi:

g <- g + ylab("Y") + xlab("X")
g

Finał g wygląda następująco:

Tutaj wpisz opis obrazka

Aktualizacja (2013-11-08):

Jak podkreślono w komentarzach, filozofia ggplot sugeruje używanie danych w długim formacie. Możesz odwołać się do tej odpowiedzi https://stackoverflow.com/a/19039094/1796914 aby zobaczyć odpowiedni kod.

 95
Author: redmode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:29

Myślę, że odpowiedź, której szukasz to:

plot(first thing to plot)
plot(second thing to plot,add=TRUE)
 31
Author: user3749764,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 18:34:45

Użyj funkcji matplot:

matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))

Użyj tego, jeśli y1 i y2 są oceniane w tych samych punktach x. Skaluje oś Y, aby pasowała do tego, co jest większe (y1 lub y2), w przeciwieństwie do niektórych innych odpowiedzi tutaj, które będą przycinać y2, jeśli będzie większa niż y1 (rozwiązania ggplot w większości są z tym w porządku).

Alternatywnie, a jeśli dwie linie nie mają tych samych współrzędnych x, Ustaw granice osi na pierwszym wykresie i dodaj:

x1  <- seq(-2, 2, 0.05)
x2  <- seq(-3, 3, 0.05)
y1 <- pnorm(x1)
y2 <- pnorm(x2,1,1)

plot(x1,y1,ylim=range(c(y1,y2)),xlim=range(c(x1,x2)), type="l",col="red")
lines(x2,y2,col="green")

Jestem zaskoczony, że Q jest 4 lat i nikt nie wspomniał o matplot lub x/ylim...

 23
Author: Spacedman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-18 10:53:24

Tl; dr: chcesz użyć curve (z add=TRUE) lub lines.


Nie zgadzam się z par(new=TRUE), ponieważ będzie to Podwójne drukowanie znaczników i etykiet osi. Eg

sinus i parabola

wyjście plot(sin); par(new=T); plot( function(x) x**2 ).

Zobacz, jak pokręcone są etykiety na osi pionowej! Ponieważ zakresy są różne, musisz ustawić ylim=c(lowest point between the two functions, highest point between the two functions), co jest mniej łatwe niż to, co zaraz ci pokażę - - - i sposób mniej łatwy, jeśli chcesz dodać nie tylko dwie krzywe, ale wielu.


To, co zawsze mnie myliło w spiskowaniu, to różnica między curve a lines. (jeśli nie pamiętasz, że są to nazwy dwóch ważnych komend spiskowych, po prostu śpiewaj to.)

Oto duża różnica między curve i lines.

curve wykreśli funkcję, jak curve(sin). lines wykresy punktów z wartościami x i y, jak: lines( x=0:10, y=sin(0:10) ).

A tu drobna różnica: curve trzeba nazwać add=TRUE za co próbujesz to zrobić, podczas gdy lines już zakłada, że dodajesz do istniejącej fabuły.

id & sinus

oto wynik wywołania plot(0:2); curve(sin).


Za kulisami, sprawdź methods(plot). I sprawdź body( plot.function )[[5]]. Po wywołaniu plot(sin) R wykaże, że sin jest funkcją (Nie wartościami y) i używa metody plot.function, która kończy się wywołaniem curve. Więc {[0] } jest narzędziem przeznaczonym do obsługi funkcji.

 21
Author: isomorphismes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-26 19:43:39

Jeśli używasz Grafiki bazowej (tj. nie Grafiki kratowej/ siatki), możesz naśladować funkcję przytrzymaj MATLAB za pomocą funkcji punkty / linie/wielokąty, aby dodać dodatkowe szczegóły do wykresów bez rozpoczynania nowego wykresu. W przypadku układu multipot, możesz użyć par(mfg=...), aby wybrać, do którego wykresu dodajesz rzeczy.

 15
Author: mcabral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-01 05:58:17

Jak opisano przez @ redmode, możesz narysować dwie linie w tym samym urządzeniu graficznym za pomocą ggplot. Jednak dane zawarte w tej odpowiedzi były w "szerokim" formacie, podczas gdy w ggplot na ogół najwygodniej jest przechowywać dane w ramce danych w "długim" formacie. Następnie, używając różnych "zmiennych grupujących" w argumentach aes, właściwości linii, takie jak typ linii lub kolor, będą się różnić w zależności od zmiennej grupującej i pojawią się odpowiednie legendy. W tym przypadku możemy użyć na colour aessthetyka, która dopasowuje kolor linii do różnych poziomów zmiennej w zbiorze danych (tutaj: y1 vs y2). Ale najpierw musimy przetopić dane z szerokiego na długi format, używając funkcji "stopić" z reshape2 pakietu.

library(ggplot2)
library(reshape2)

# original data in a 'wide' format
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
df <- data.frame(x, y1, y2)

# melt the data to a long format
df2 <- melt(data = df, id.vars = "x")

# plot, using the aesthetics argument 'colour'
ggplot(data = df2, aes(x = x, y = value, colour = variable)) + geom_line()

Tutaj wpisz opis obrazka

 15
Author: Henrik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-26 22:34:49

Jeśli chcesz podzielić ekran, możesz to zrobić tak:

(na przykład dla 2 działek obok razem)

par(mfrow=c(1,2))

plot(x)

plot(y) 

Link Referencyjny

 14
Author: Hamed2005,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-08 18:26:11

Możesz użyć punktów za overplot, czyli.

plot(x1, y1,col='red')

points(x2,y2,col='blue')
 9
Author: brainstorm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-21 05:15:41

Zamiast przechowywać wartości do wykreślenia w tablicy, przechowuj je w macierzy. Domyślnie Cała macierz będzie traktowana jako jeden zestaw danych. Jeśli jednak dodasz tę samą liczbę modyfikatorów do wykresu, np. col (), jak masz wiersze w macierzy, R odkryje, że każdy wiersz powinien być traktowany niezależnie. Na przykład:

x = matrix( c(21,50,80,41), nrow=2 )
y = matrix( c(1,2,1,2), nrow=2 )
plot(x, y, col("red","blue")

Powinno to działać, chyba że twoje zbiory danych są różnej wielkości.

 6
Author: cranberry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-02 23:30:17

Idiomatic Matlab plot(x1,y1,x2,y2) można przetłumaczyć W R z ggplot2 na przykład w ten sposób:

x1 <- seq(1,10,.2)
df1 <- data.frame(x=x1,y=log(x1),type="Log")
x2 <- seq(1,10)
df2 <- data.frame(x=x2,y=cumsum(1/x2),type="Harmonic")

df <- rbind(df1,df2)

library(ggplot2)
ggplot(df)+geom_line(aes(x,y,colour=type))

Tutaj wpisz opis obrazka

zainspirowany wykresami Tingtinga Zhao o różnych zakresach osi x przy użyciu ggplot2 .

 5
Author: Alessandro Jacopson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-26 09:16:56

Możesz również stworzyć swoją fabułę używając ggvis :

library(ggvis)

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x, y1, y2)

df %>%
  ggvis(~x, ~y1, stroke := 'red') %>%
  layer_paths() %>%
  layer_paths(data = df, x = ~x, y = ~y2, stroke := 'blue')

Spowoduje to utworzenie następującego wykresu:

Tutaj wpisz opis obrazka

 4
Author: epo3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 14:36:32

Możesz użyć Plotly R API do tego stylu. Poniżej znajduje się kod, aby to zrobić, a wersja live tego wykresu jest tutaj .

# call Plotly and enter username and key
library(plotly)
p <- plotly(username="Username", key="API_KEY")

# enter data
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)

# format, listing y1 as your y.
First <- list(
x = x,
y = y1,
type = 'scatter',
mode = 'lines',
marker = list(
    color = 'rgb(0, 0, 255)',
    opacity = 0.5
 )
)

# format again, listing y2 as your y.
Second <- list(
x = x,
y = y2,
type = 'scatter',
mode = 'lines',
opacity = 0.8, 
marker = list(
    color = 'rgb(255, 0, 0)'
 )
)

# style background color
plot_bgcolor = 'rgb(245,245,247)'

# and structure the response. Plotly returns a URL when you make the call. 
response<-p$plotly(list(First,Second), kwargs = list(layout=layout))

Pełne ujawnienie: jestem w drużynie spiskowej.

Graf

 3
Author: Mateo Sanchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 04:48:30

Możemy również użyć biblioteki kratowej

library(lattice)
x <- seq(-2,2,0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
xyplot(y1 + y2 ~ x, ylab = "y1 and y2", type = "l", auto.key = list(points = FALSE,lines = TRUE))

Dla określonych kolorów

xyplot(y1 + y2 ~ x,ylab = "y1 and y2", type = "l", auto.key = list(points = F,lines = T), par.settings = list(superpose.line = list(col = c("red","green"))))

Tutaj wpisz opis obrazka

 0
Author: Varn K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-25 18:56:27