Подтвердить что ты не робот

Построение нескольких кривых одного и того же графика и одной шкалы

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

Я хотел построить несколько кривых на одном графике, но так, чтобы мои новые кривые соответствовали той же оси оси 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 при построении второго графика.

4b9b3361

Ответ 1

(Типичным методом было бы использовать 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)

Ответ 2

points или lines подходит, если

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

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

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

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

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

Ответ 3

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

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.

Ответ 4

Мое решение - использовать 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

Ответ 5

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

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)