在一个图形中绘制两条以上的曲线,曲线具有不同的范围

时间:2017-04-12 04:45:24

标签: r plot range yaxis

让我们考虑以下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")

此处,y1y2的范围与y3的范围不同。因此,当我创建此matplot时,y1y2的曲线在底部显示为直线,而对应于{{的曲线没有问题1}}。

有没有什么方法可以在同一个图表中正确绘制具有范围的曲线,这些曲线在很大程度上有所不同?

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用y轴的对数刻度:

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

结果: enter image description here

您可以使用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()

结果: enter image description here

如果您不想要日志轴,另一个选项是具有自由轴刻度的面:

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

结果: enter image description here

答案 1 :(得分:1)

在绘制具有两种不同尺度的单个图表时,有很多很好的例子,例如: https://www.r-bloggers.com/r-single-plot-with-two-different-y-axes/但是,那些通常需要使用par(new=t),这通常需要稍微调整一下,即数据探索并不总是直观的。

我建议使用ggplotfacet_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)

enter image description here