让我们考虑以下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
的曲线在底部显示为直线,而对应于{{的曲线没有问题1}}。
有没有什么方法可以在同一个图表中正确绘制具有范围的曲线,这些曲线在很大程度上有所不同?
答案 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")
您可以使用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")
答案 1 :(得分:1)
在绘制具有两种不同尺度的单个图表时,有很多很好的例子,例如: 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)