Рисование более двух кривых на одном графике с кривыми, имеющими разные диапазоны

Рассмотрим следующий R-код:

x=seq(1,10,1)
y1=runif(10,0,1)
y2=runif(10,0,1)
y3=runif(10,100,200)
matplot(x,cbind(y1,y2,y3),type="l")

Здесь диапазон y1 и y2 отличается от диапазона y3. В результате, когда я создаю этот matplot, кривые y1 и y2 получаются прямыми линиями внизу, тогда как с кривой, соответствующей y3, проблем нет.

Есть ли какой-либо способ, с помощью которого мы можем правильно изобразить кривые, имеющие диапазоны, которые сильно различаются, на одном и том же графике?


person Dwaipayan Gupta    schedule 12.04.2017    source источник


Ответы (2)


Самый простой способ - использовать логарифмическую шкалу для оси Y:

matplot(seq(1, 10, 1), cbind(runif(10, 0, 1), runif(10, 0, 1), runif(10, 100, 200)),
        type = "l", log = "y")

Результат: введите здесь описание изображения

Вы можете добиться аналогичного результата, используя ggplot2:

library(tidyr)
library(ggplot2)
df1 = data.frame(x = seq(1, 10, 1),
                 y1 = runif(10, 0, 1), 
                 y2 = runif(10, 0, 1), 
                 y3 = runif(10, 100, 200))

df1 %>% 
  gather(y, value, -x) %>% 
  ggplot(aes(x, value)) + geom_line(aes(color = y)) + scale_y_log10()

Результат: введите здесь описание изображения

Если вам не нужны логарифмические оси, другим вариантом являются грани со свободными шкалами осей:

df1 %>% 
  gather(y, value, -x) %>% 
  ggplot(aes(x, value)) + geom_line() + facet_grid(y ~ ., scales = "free")

Результат: введите здесь описание изображения

person neilfws    schedule 12.04.2017

Есть много хороших примеров построения одного графика с двумя разными масштабами, например. https://www.r-bloggers.com/r-single-plot-with-two-Different-y-axes/ Однако для них обычно требуется использование par(new=t), что обычно требует небольшой настройки, т.е. не всегда интуитивно понятно для исследования данных.

Я бы рекомендовал использовать ggplot и facet_wrap для построения линий в разных кадрах на одном изображении:

library(ggplot2)
out <- data.frame(x=rep(x,3), y=c(y1, y2, y3), gp=unlist(lapply(c("y1", "y2", "y3"), rep, 10)))
ggplot(out, aes(x, y)) + geom_line()+ facet_wrap(~gp, scales="free_y", nrow=3)

введите здесь описание изображения

person Adam Quek    schedule 12.04.2017