Построение нескольких кривых одного графика и одного масштаба - PullRequest
20 голосов
/ 28 июля 2011

Это продолжение этого вопроса .

Я хотел построить несколько кривых на одном графике, но чтобы мои новые кривые соответствовали той же шкале оси Y, сгенерированнойпервая кривая.

Обратите внимание на следующий пример:

y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)

# first plot
plot(x, y1)

# second plot
par(new = TRUE)
plot(x, y2, axes = FALSE, xlab = "", ylab = "")

Это фактически отображает оба набора значений в одинаковых координатах графика (потому что я скрываю новую ось Y, котораябудет создан со вторым графиком).

Мой вопрос в том, как сохранить тот же масштаб оси Y при построении второго графика.

Ответы [ 5 ]

34 голосов
/ 28 июля 2011

(Типичным методом будет использование plot только один раз для установки пределов, возможно, для включения диапазона всех серий, а затем использование points и lines для добавления отдельных серий.)Чтобы использовать plot несколько раз с par(new=TRUE), вам необходимо убедиться, что на вашем первом графике есть правильный ylim, чтобы принять все серии (и в другой ситуации вам также может понадобиться использовать ту же стратегию для xlim):

# first plot
plot(x, y1, ylim=range(c(y1,y2)))

# second plot  EDIT: needs to have same ylim
par(new = TRUE)
plot(x, y2, ylim=range(c(y1,y2)), axes = FALSE, xlab = "", ylab = "")

enter image description here

Этот следующий код будет выполнять задачу более компактно, по умолчанию вы получаете числа в виде точек, а второй дает вам типичные "точки" R-типа:

  matplot(x, cbind(y1,y2))
  matplot(x, cbind(y1,y2), pch=1)
6 голосов
/ 28 июля 2011

points или lines пригодится, если

  • y2 будет сгенерировано позже, или
  • новые данные не будут иметь такой же x, но все же должныперейдите в ту же систему координат.

Поскольку ваши y s имеют одинаковые x, вы также можете использовать matplot:

matplot (x, cbind (y1, y2), pch = 19)

matplot (x, cbind (y1, y2), pch = 19)

(без pch matplopt будет отображаться номер столбца матрицы y вместо точек).

5 голосов
/ 28 июля 2011

Вы не совсем понимаете, что вам нужно, поскольку я думаю, что @ DWin's технически верен, учитывая ваш пример кода. Я думаю, что вы действительно хотите, это:

y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)

# first plot
plot(x, y1,ylim = range(c(y1,y2)))

# Add points
points(x, y2)

Решение DWin работало в неявном предположении (на основе вашего примера кода), что вы хотели построить второй набор точек с наложением в исходном масштабе. Вот почему его изображение выглядит так, как будто точки нанесены на 1, 101 и т. Д. Повторный вызов plot - это не то, что вам нужно, вы хотите добавить к графику, используя points. Таким образом, приведенный выше код на моей машине производит это:

enter image description here

Но главное утверждение DWin об использовании ylim правильное.

3 голосов
/ 26 сентября 2013

Мое решение - использовать ggplot2.Он заботится об этих типах вещей автоматически.Самое главное - правильно расположить данные.

y1 <- c(100, 200, 300, 400, 500)
y2 <- c(1, 2, 3, 4, 5)
x <- c(1, 2, 3, 4, 5)
df <- data.frame(x=rep(x,2), y=c(y1, y2), class=c(rep("y1", 5), rep("y2", 5)))

Затем используйте ggplot2, чтобы построить их

library(ggplot2)
ggplot(df, aes(x=x, y=y, color=class)) + geom_point()

Это означает, что данные наносятся на df и разделяютсяпунктов на class.

Сгенерированный график: enter image description here

1 голос
/ 28 июля 2011

Я не уверен, что вы хотите, но я буду использовать решетку.

x = rep(x,2)
y = c(y1,y2)
fac.data = as.factor(rep(1:2,each=5))
df = data.frame(x=x,y=y,z=fac.data)
# this create a data frame where I have a factor variable, z, that tells me which data I have (y1 or y2)

Тогда просто заговор

xyplot(y ~x|z, df)
# or maybe
xyplot(x ~y|z, df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...