[R] overlaying two graphs / plots /lines

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Tue Feb 7 22:34:49 CET 2023


Às 21:18 de 07/02/2023, Jim Lemon escreveu:
> Hi Bogdan,
> Try this:
> 
> A<-data.frame(x=c(1,7,9,20),
>   y=c(39,91,100,3))
> B<-data.frame(x=c(10,21,67,99,200),
>   y=c(9,89,1000,90,1001)) # one value omitted to equalize the rows
> xrange<-range(c(unlist(A$x),unlist(B$x)))
> yrange<-range(c(unlist(A$y),unlist(B$y)))
> plot(A,type="l",xlim=xrange,ylim=yrange,col="red")
> lines(B,lty=2,col="blue")
> legend(150,400,c("A","B"),lty=1:2,col=c("red","blue"))
> 
> There are other tricks to deal with the differences in range between A and B.
> 
> Jim
> 
> On Wed, Feb 8, 2023 at 7:57 AM Bogdan Tanasa <tanasa using gmail.com> wrote:
>>
>>   Dear all,
>>
>> Any suggestions on how I could overlay two or more graphs / plots / lines
>> that have different sizes and the x axes have different breakpoints.
>>
>> One dataframe is : A :
>>
>> on x axis : 1 , 7, 9, 20, etc ... (100 elements)
>> on y axis : 39, 91, 100, 3, etc ... (100 elements)
>>
>>
>> The other dataframe is : B :
>>
>> on x axis : 10, 21, 67, 99, 200 etc .. (200 elements).
>> on y axis :  9, 0, 89, 1000, 90, 1001. ... (200 elements).
>>
>> Thanks a lot,
>>
>> Bogdan
>>
>>          [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
Hello,

Here is a ggplot way.
I'll use the same data.

On each data.frame, create an id column, saying which df it is.


A<-data.frame(x=c(1,7,9,20),
               y=c(39,91,100,3))
B<-data.frame(x=c(10,21,67,99,200),
               y=c(9,89,1000,90,1001)) # one value omitted to equalize 
the rows

suppressPackageStartupMessages({
   library(dplyr)
   library(ggplot2)
})

bind_rows(
   A %>% mutate(id = "A"),
   B %>% mutate(id = "B")
)
#>     x    y id
#> 1   1   39  A
#> 2   7   91  A
#> 3   9  100  A
#> 4  20    3  A
#> 5  10    9  B
#> 6  21   89  B
#> 7  67 1000  B
#> 8  99   90  B
#> 9 200 1001  B


To do this in a pipe doesn't change the original data.
Then pipe the result to ggplot separating the lines by mapping id to 
color. ggplot will automatically take care of the axis ranges.


bind_rows(
   A %>% mutate(id = "A"),
   B %>% mutate(id = "B")
) %>%
   ggplot(aes(x, y, colour = id)) +
   geom_line() +
   theme_bw()


Hope this helps,

Rui Barradas



More information about the R-help mailing list