top - r plot two histograms side by side
Plot two graphs in same plot in R (10)
points() will add to the existing graph, but will not create a new window. So you'd need to do
I would like to plot y1 and y2 in the same plot.
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")
But when I do it like this, they are not plotted in the same plot together.
In Matlab one can do
hold on, but does anyone know how to do this in R?
tl;dr: You want to use
I disagree with
par(new=TRUE) because that will double-print tick-marks and axis labels. Eg
The output of
plot(sin); par(new=T); plot( function(x) x**2 ).
Look how messed up the vertical axis labels are! Since the ranges are different you would need to set
ylim=c(lowest point between the two functions, highest point between the two functions), which is less easy than what I'm about to show you---and way less easy if you want to add not just two curves, but many.
What always confused me about plotting is the difference between
lines. (If you can't remember that these are the names of the two important plotting commands, just sing it.)
Here's the big difference between
curve will plot a function, like
lines plots points with x and y values, like:
lines( x=0:10, y=sin(0:10) ).
And here's a minor difference:
curve needs to be called with
add=TRUE for what you're trying to do, while
lines already assumes you're adding to an existing plot.
Here's the result of calling
Behind the scenes, check out
methods(plot). And check
body( plot.function )[]. When you call
plot(sin) R figures out that
sin is a function (not y values) and uses the
plot.function method, which ends up calling
curve is the tool meant to handle functions.
I think that the answer you are looking for is:
plot(first thing to plot) plot(second thing to plot,add=TRUE)
plot(x1,y1,x2,y2) can be translated in R with
ggplot2 for example in this way:
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))
Inspired by Tingting Zhao's Dual line plots with different range of x-axis Using ggplot2.
Rather than keeping the values to be plotted in an array, store them in a matrix. By default the entire matrix will be treated as one data set. However if you add the same number of modifiers to the plot, e.g. the col(), as you have rows in the matrix, R will figure out that each row should be treated independently. For example:
x = matrix( c(21,50,80,41), nrow=2 ) y = matrix( c(1,2,1,2), nrow=2 ) plot(x, y, col("red","blue")
This should work unless your data sets are of differing sizes.
use this if
y2 are evaluated at the same
x points. It scales the Y-axis to fit whichever is bigger (
y2), unlike some of the other answers here that will clip
y2 if it gets bigger than
y1 (ggplot solutions mostly are okay with this).
Alternatively, and if the two lines don't have the same x-coordinates, set the axis limits on the first plot and add:
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")
Am astonished this Q is 4 years old and nobody has mentioned
You can also create your plot using 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')
This will create the following plot:
You can also use
par and plot on the same graph but different axis. Something as follows:
plot( x, y1, type="l", col="red" ) par(new=TRUE) plot( x, y2, type="l", col="green" )
If you read in detail about
R, you will be able to generate really interesting graphs. Another book to look at is Paul Murrel's R Graphics.
# 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))
Full disclosure: I'm on the Plotly team.
if you want to split the screen, you can do it like this:
(for example for 2 plots next together)
par(mfrow=c(1,2)) plot(x) plot(y)