如何在R中绘制函数曲线

93

您好,这是一段关于绘制简单曲线的选择问题,特别是针对函数如何绘制曲线的问题。

eq = function(x){x*x}

在R中如何绘制函数?

这似乎是一个很明显的问题,但我只能在stackoverflow上找到这些相关问题,但它们都更具体。

我希望我没有写重复的问题。


相关 https://dev59.com/asPra4cB1Zd3GeqPckdm#70636329 - tjebo
7个回答

116

我在网上进行了一些搜索,找到了以下几种方法:

最简单的方法是使用没有预定义函数的曲线。

curve(x^2, from=1, to=50, , xlab="x", ylab="y")

enter image description here

当你有预定义的函数时,你也可以使用曲线。

eq = function(x){x*x}
curve(eq, from=1, to=50, xlab="x", ylab="y")

enter image description here

如果你想使用ggplot,

library("ggplot2")
eq = function(x){x*x}
ggplot(data.frame(x=c(1, 50)), aes(x=x)) + 
  stat_function(fun=eq)

输入图像描述


4
FYI,“qplot”示例不再可用:为了鼓励用户使用“ggplot()”,“qplot()”函数被弱化了,例如,它不再接受“fun”参数(自v3以来?)。 - tim

52

你是指像这样吗?

> eq = function(x){x*x}
> plot(eq(1:1000), type='l')

在1:1000的范围内绘制方程的图

(或者根据您的函数绘制相应范围的值)


37

plot具有plot.function方法。

plot(eq, 1, 1000)

或者

curve(eq, 1, 1000)

1
有趣的是,我在其他地方没有看到过你的例子 plot(eq, 1, 1000)。我也看到了 curve(eq, 1, 100) 的例子。它们有什么区别吗? - sjdh
4
没多少。plot.function 实际上是在做一些参数检查后调用 curve 函数。此外,curve 函数可以接受表达式作为输入,但 plot 函数需要一个函数作为输入来调用 plot.function - GSee

2
这里是一个格子版本:
library(lattice)
eq<-function(x) {x*x}
X<-1:1000
xyplot(eq(X)~X,type="l")

Lattice output


2
正如sjdh所提到的,ggplot2是一个很好的解决方案。一种更直观的方法是使用xlim,而不需要创建虚拟数据集:
library(ggplot2)
eq <- function(x){sin(x)}
base <- ggplot() + xlim(0, 30)
base + geom_function(fun=eq)

此外,为了使图形更加平滑,我们可以使用 n 设置图形进行插值的点数:
base + geom_function(fun=eq, n=10000)

2

我需要的额外设置的Lattice解决方案:

library(lattice)
distribution<-function(x) {2^(-x*2)}
X<-seq(0,10,0.00001)
xyplot(distribution(X)~X,type="l", col = rgb(red = 255, green = 90, blue = 0, maxColorValue = 255), cex.lab = 3.5, cex.axis = 3.5, lwd=2 )
  1. 如果您需要以与1不同的增量(例如0.00001)绘制x值范围,则可以使用以下代码:

X<-seq(0,10,0.00001)

  1. 您可以通过定义rgb值来更改线条的颜色:

col = rgb(red = 255, green = 90, blue = 0, maxColorValue = 255)

  1. 您可以通过设置以下内容来更改绘制线条的宽度:

lwd = 2

  1. 您可以通过缩放标签来更改标签的大小:

cex.lab = 3.5, cex.axis = 3.5

示例图


0

包含参数的函数

我有一个涉及三个参数(a、b和h)的函数(emax()),我想绘制它的线:

emax = function(x, a, b, h){
  (a * x^h)/(b + x^h)
}
curve(emax, from = 1, to = 40, n=40 a = 1, b = 2, h = 3)

出现错误:Error in emax(x) : argument "a" is missing, with no default error

通过使用以下语法将命名参数放在函数内部来解决此问题:

curve(emax(x, a = 1, b = 2, h = 3), from = 1, to = 40, n = 40)

这与文档中写的curve(expr, from, to, n, ...)相反,而不是curve(expr(x,...), from, to, n)


这并不违反文档。expr只是该参数的名称,而不是函数本身。它被定义为“函数的名称,或者写成x的函数调用或表达式,将计算为与x相同长度的对象。”这意味着如果你有更多的函数名,它将评估整个参数作为一个表达式。 - tjebo
嗨@tjebo,我同意expr参数是正确的,但他们在语法中如何编写“…”表明curve(expr = fun,...)也可以工作,这是不正确的。curve(expr = fun(x,...))似乎是唯一的方法。 - Timothy M Pollington
不,这些...是针对“绘图函数方法”的(这只是R允许编程更灵活的方式)-请参见?curve。在此,文档甚至指定对于绘图的“函数”方法,...可以包括curve的任何其他参数,除了expr.-这使得它相当清楚它与表达式无关。我认为在这种情况下该文档非常清楚。 - tjebo
我猜你的困惑来自于其他函数可以使用 ... 添加额外参数(例如,lapply)的情况。然而,这只是它们设计的一种方式,而 ... 在每种情况下都扮演着不同的角色,具体取决于底层函数的设计。此外,方法通常是函数的特殊情况,有时甚至可以包含没有任何意义的 ...。因此,如果你不确定 ... 在该函数中的作用,最好避免盲目使用。 - tjebo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接