如何在R中绘制概率密度函数?分区间绘图遇长度不匹配错误求解
解决R绘图中"x和y长度不同"的报错问题
这个报错的核心原因很明确:你在调用plot()的时候,传给y轴的是函数本身,而不是函数在x取值上计算出的结果。
让我们拆解一下问题:
- 你定义的
x1是从-1到0、步长0.01的序列,一共有101个元素 - 但你写
plot(x1, eq1)时,eq1是一个函数对象,不是计算后的数值向量,它的长度是1,自然和x1的101个元素长度不匹配,就触发了'x' and 'y' lengths differ的错误
修正后的代码
下面是修复后的代码,同时我也优化了绘图逻辑,用lines()替代par(new=TRUE),避免重复绘制坐标轴:
# 定义x的取值范围 x1 = seq(-1, 0, 0.01) x2 = seq(0, 1, 0.01) # 定义概率密度函数 eq1 = function(x) {(1+x)^2} eq2 = function(x) {(1+x)^3} # 先绘制第一个曲线,设置好坐标轴范围 plot(x1, eq1(x1), col="red", type="l", xlim=c(-1,1), ylim=c(min(eq1(x1), eq2(x2)), max(eq1(x1), eq2(x2))), xlab="x", ylab="Probability Density") # 添加第二个曲线 lines(x2, eq2(x2), col="green")
关键改进点
- 把
eq1改成eq1(x1),eq2改成eq2(x2),这样就能得到和x长度匹配的y值向量 - 用
plot()先画第一个曲线时,通过xlim和ylim设置好整个图的坐标轴范围,确保两个曲线都能完整显示 - 使用
lines()添加第二条曲线,比par(new=TRUE)更简洁,也不会出现重复的坐标轴标签
如果你还是想用par(new=TRUE)的方式,也需要修正函数调用的问题,同时手动对齐坐标轴范围,比如:
x1 = seq(-1, 0, 0.01) x2 = seq(0, 1, 0.01) eq1 = function(x) {(1+x)^2} eq2 = function(x) {(1+x)^3} plot(x1, eq1(x1), col="red", type="l", xlim=c(-1,1), ylim=c(0, 8)) par(new = TRUE) plot(x2, eq2(x2), type = "l", col = "green", xlim=c(-1,1), ylim=c(0,8), axes=FALSE, xlab="", ylab="")
不过第一种方法更推荐,代码更清晰易维护。
内容的提问来源于stack exchange,提问作者compsciman
相关产品推荐
相关产品推荐

