Двух диаграммах в одном участке в р

Я хотел бы построить Y1 и y2 в одном и том же сюжете.

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

но когда я делаю это так, они не строятся в одном и том же сюжете вместе.

в Matlab можно сделать hold on, но кто-нибудь знает, как это сделать в R?

15 ответов


lines() или points() добавит к существующему графику, но не создаст новое окно. Так что вам нужно сделать

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

вы также можете использовать par и график на том же графике, но с другой осью. Что-то вроде:

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

если Вы читаете подробно о par на R, вы сможете создавать действительно интересные графики. Еще одна книга, чтобы взглянуть на графики Павла Murrel Р.


при построении многослойных участков следует учитывать ggplot пакета. Идея состоит в том, чтобы создать графический объект с базовой эстетикой и постепенно улучшить его.

ggplot стиль требует, чтобы данные были упакованы в data.frame.

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

базовый вариант:

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

здесь + operator используется для добавления дополнительных слоев для основного объекта.

С ggplot у вас есть доступ к графическому объекту на каждом этапе построения. Скажем, обычный пошаговая настройка может выглядеть так:

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 производит сюжет, и вы можете увидеть его на каждом этапе (ну, после создания хотя бы одного слоя). Дальнейшие чары сюжета также делаются с созданным объектом. Например, мы можем добавить метки для осей:

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

финал g выглядит так:

enter image description here

обновление (2013-11-08):

как указано в комментариях,ggplotфилософия предлагает использовать данные в длинном формате. Вы можете обратиться к этому ответу https://stackoverflow.com/a/19039094/1796914 для того, чтобы увидеть соответствующий код.


Я думаю, что ответ, который вы ищете это:

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

использовать matplot функция:

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

используйте этот параметр, если y1 и y2 оцениваются на том же x точки. Он масштабирует ось Y, чтобы соответствовать тому, что больше (y1 или y2), в отличие от некоторых других ответов здесь, что будет клип y2 если он становится больше, чем y1 (решения ggplot в основном в порядке с этим).

альтернативно, и если две линии не имеют одинаковых X-координат, установите пределы оси на первом графике и добавить:

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

я удивлен, что этому Q 4 года, и никто не упомянул matplot или x/ylim...


tl; dr: вы хотите использовать curveadd=TRUE) или lines.


я не согласен с par(new=TRUE) потому что это будет дважды печатать галочки и метки оси. Например!--28-->

sine and parabola

выход plot(sin); par(new=T); plot( function(x) x**2 ).

посмотрите, как перепутались метки вертикальной оси! Поскольку диапазоны различны, вам нужно будет установить ylim=c(lowest point between the two functions, highest point between the two functions), что менее просто, чем то, что я собираюсь показать вам- - - и путь менее легко, если вы хотите, чтобы добавить не только две кривые, но многие.


что всегда смущало меня в заговоре, так это разница между curve и lines. (если вы не можете вспомнить, что это имена двух важных построение команды, просто петь его.)

вот большая разница между curve и lines.

curve построит функцию, например curve(sin). lines земельные участки точки со значениями X и y, например: lines( x=0:10, y=sin(0:10) ).

и вот небольшая разница:curve необходимо вызвать с add=TRUE за то, что вы пытаетесь сделать, в то время как lines уже предполагает, что вы добавляете к существующему участку.

id & sine

вот результат вызова plot(0:2); curve(sin).


за кулисами, проверить methods(plot). И проверьте body( plot.function )[[5]]. Когда вы звоните plot(sin) R выясняет, что sin функция (не значения y) и использует plot.function метод, который заканчивается вызовом curve. Так что curve - Это инструмент, предназначенный для обработки функций.


Если вы используете базовую графику (т. е. не графику решетки/ сетки), вы можете имитировать функцию удержания MATLAB, используя функции точек/линий/полигонов, чтобы добавить дополнительные детали к вашим участкам без запуска нового участка. В случае компоновки multiplot вы можете использовать par(mfg=...) выбрать, какой сюжет вы добавляете вещи.


как описано @redmode, вы можете построить две строки в одном графическом устройстве с помощью ggplot. Однако данные в этом ответе были в "широком" формате, тогда как в ggplot обычно наиболее удобно хранить данные в фрейме данных в "длинном" формате. Затем, используя различные "группирующие переменные" в aesаргументы thetics, свойства строки, такие как тип строки или цвет, будут варьироваться в зависимости от переменной группировки, и появятся соответствующие легенды. В этом случай мы можем использовать colour aessthetics, который соответствует цвету линий различным уровням переменной в наборе данных (здесь: y1 vs y2). Но Сначала нам нужно расплавить данные из широкого в длинный формат, используя функцию "расплавить" из 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()

enter image description here


Если вы хотите разделить экран, вы можете сделать это так:

(например, для 2 участков рядом друг с другом)

par(mfrow=c(1,2))

plot(x)

plot(y) 

Ссылка


вы можете использовать точки для построить, то есть.

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

points(x2,y2,col='blue')

вместо того, чтобы хранить значения, которые будут отображаться в массиве, сохраните их в матрице. По умолчанию вся матрица будет рассматриваться как один набор данных. Однако, если вы добавите такое же количество модификаторов к графику, например col(), как у вас есть строки в матрице, R выяснит, что каждая строка должна обрабатываться независимо. Например:

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

Это должно работать, если ваши наборы данных имеют разные размеры.


Idiomatic Matlab plot(x1,y1,x2,y2) можно перевести в R с ggplot2 например, таким образом:

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

enter image description here

вдохновленный Tingting Zhao's двойные линейные графики с различным диапазоном оси x с использованием ggplot2.


вы также можете создать свой сюжет с помощью 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')

это создаст следующий сюжет:

enter image description here


можно использовать Plotly R API в этом стиле. Ниже приведен код для этого, а живая версия этого графика -здесь.

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

полное раскрытие: я в команде Plotly.

Graph


мы также можем использовать решетки библиотека

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

для каждого цвета

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

enter image description here