Plote dois charts na mesma plotagem em R

Eu gostaria de traçar y1 e y2 no mesmo enredo.

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") 

Mas quando eu faço assim, eles não são tramados no mesmo enredo juntos.

Em Matlab, você pode hold on , mas alguém sabe como fazer isso em R?

lines() ou points() serão adicionados ao gráfico existente, mas não criarão uma nova janela. Então você precisa fazer

 plot(x,y1,type="l",col="red") lines(x,y2,col="green") 

Você também pode usar par e plot no mesmo gráfico, mas em diferentes eixos. Algo como segue:

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

Se você ler em detalhes sobre o par em R , você será capaz de gerar charts realmente interessantes. Outro livro para olhar é R Graphics de Paul Murrel.

Ao construir charts multicamadas, deve-se considerar o pacote ggplot . A ideia é criar um object gráfico com estética básica e aprimorá-lo incrementalmente.

ggplot estilo ggplot requer que os dados sejam empacotados em data.frame .

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

Solução básica:

 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 

Aqui, o + operator é usado para adicionar camadas extras ao object básico.

Com o ggplot você tem access ao object gráfico em todas as etapas da plotagem. Digamos que a configuração passo a passo habitual possa ser assim:

 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 produz o gráfico, e você pode vê-lo em cada estágio (bem, após a criação de pelo menos uma camada). Mais encantamentos do enredo também são feitos com o object criado. Por exemplo, podemos adicionar labels para axises:

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

Final g parece com:

insira a descrição da imagem aqui

ATUALIZAÇÃO (2013-11-08):

Como apontado nos comentários, a filosofia do ggplot sugere o uso de dados em formato longo. Você pode consultar esta resposta https://stackoverflow.com/a/19039094/1796914 para ver o código correspondente.

Eu acho que a resposta que você está procurando é:

 plot(first thing to plot) plot(second thing to plot,add=TRUE) 

Use a function matplot :

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

use isto se y1 e y2 forem avaliados nos mesmos x pontos. Ele escala o eixo Y para ajustar-se ao que for maior ( y1 ou y2 ), ao contrário de algumas das outras respostas aqui que irão recortar y2 se ficar maior que y1 (as soluções ggplot, na maior parte, estão bem com isso).

Como alternativa, e se as duas linhas não tiverem as mesmas coordenadas x, defina os limites do eixo no primeiro gráfico e adicione:

 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") 

Estou espantado este Q é de 4 anos e ninguém mencionou matplot ou x/ylim ...

tl; dr: Você quer usar curve (com add=TRUE ) ou lines .


Eu discordo de par(new=TRUE) porque isso irá imprimir duas vezes marcas de escala e labels de eixo. Por exemplo

seno e parábola

A saída do plot(sin); par(new=T); plot( function(x) x**2 ) plot(sin); par(new=T); plot( function(x) x**2 ) plot(sin); par(new=T); plot( function(x) x**2 ) .

Veja como as etiquetas do eixo vertical estão bagunçadas! Como os ranges são diferentes, você precisaria definir ylim=c(lowest point between the two functions, highest point between the two functions) , o que é menos fácil do que eu estou prestes a mostrar – e muito menos fácil se você quer adicionar não apenas duas curvas, mas muitas.


O que sempre me confundiu na plotagem é a diferença entre curve e lines . (Se você não consegue lembrar que esses são os nomes dos dois importantes comandos de plotagem, apenas cante .)

Aqui está a grande diferença entre curve e lines .

curve irá traçar uma function, como curve(sin) . lines traça pontos com valores x e y, como: lines( x=0:10, y=sin(0:10) ) .

E aqui está uma pequena diferença: a curve precisa ser chamada com add=TRUE para o que você está tentando fazer, enquanto as lines já assumem que você está adicionando a uma plotagem existente.

id e seno

Aqui está o resultado de chamar plot(0:2); curve(sin) plot(0:2); curve(sin) .


Nos bastidores, confira os methods(plot) . E verifique o body( plot.function )[[5]] . Quando você chama plot(sin) R descobre que sin é uma function (não valores y) e usa o método plot.function , que termina chamando a curve . Então curve é a ferramenta destinada a manipular funções.

Se você estiver usando charts de base (ou seja, não lattice / grid graphics), então você pode imitar o recurso de retenção do MATLAB usando as funções de pontos / linhas / polígonos para adicionar detalhes adicionais aos seus charts sem iniciar um novo gráfico. No caso de um layout multiplot, você pode usar par(mfg=...) para escolher qual plot você adiciona itens.

Como descrito por @redmode, você pode plotar as duas linhas no mesmo dispositivo gráfico usando ggplot . No entanto, os dados nessa resposta estavam em um formato ‘amplo’, enquanto que em ggplot geralmente é mais conveniente manter os dados em um quadro de dados em um formato ‘longo’. Em seguida, usando diferentes ‘variables ​​de agrupamento’ nos argumentos de aes tética, as propriedades da linha, como tipo de linha ou cor, variarão de acordo com a variável de agrupamento e as legendas correspondentes aparecerão. Neste caso, podemos usar a colour aes sthetics, que combina a cor das linhas com diferentes níveis de uma variável no dataset (aqui: y1 vs y2). Mas primeiro precisamos derreter os dados do formato wide para o longo, usando a function ‘melt’ do pacote reshape2 .

 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() 

insira a descrição da imagem aqui

se você quiser dividir a canvas, você pode fazer assim:

(por exemplo, para 2 plots próximas)

 par(mfrow=c(1,2)) plot(x) plot(y) 

Link de Referência

Você pode usar pontos para o overplot, isto é.

 plot(x1, y1,col='red') points(x2,y2,col='blue') 

Em vez de manter os valores a serem plotados em uma matriz, armazene-os em uma matriz. Por padrão, toda a matriz será tratada como um dataset. No entanto, se você adicionar o mesmo número de modificadores ao gráfico, por exemplo, o col (), como você tem linhas na matriz, R descobrirá que cada linha deve ser tratada de forma independente. Por exemplo:

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

Isso deve funcionar, a menos que seus conjuntos de dados sejam de tamanhos diferentes.

Você poderia usar a API Plotly R para estilizar isso. Abaixo está o código para fazer isso, e a versão ao vivo deste gráfico está aqui .

 # 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)) 

Divulgação completa: estou na equipe Plotly.

Gráfico

Você também pode criar seu gráfico usando o 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') 

Isso criará o seguinte gráfico:

insira a descrição da imagem aqui

A plotagem idiomática de Matlab plot(x1,y1,x2,y2) pode ser traduzida em R com ggplot2 por exemplo, desta forma:

 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)) 

insira a descrição da imagem aqui

Inspirado em Tingting Zhao's Dual line plots com diferentes ranges de eixo x Usando ggplot2 .