我已经使用splinefun的值生成了一个ggplot,但不应认为该值在0附近的区域内为负,如下图所示。

我想知道当splinefun中的值是负数时如何将其强制为0?谢谢!

sigma <- c(0,1,2,3,4,5,6,7,8,9,10,11,12)
sigma <- matrix(sigma,ncol=1)

myFunc_sig <- function(sigma){
  exp(-2/sigma^2)
}

output_sigma <- apply(sigma, 1, myFunc_sig)
spl_fun <- splinefun(sigma, output_sigma)

ggplot(data.frame(x = sigma, y = output_sigma), aes(x, y))+
  stat_function(fun = spl_fun, color = "orange")+
  scale_x_continuous(expand = c(0, 0)) +
  scale_y_continuous(expand = c(0, 0))

最佳答案

您可以通过在method="monoH.FC"中指定method="hyman"splinefun来要求样条函数是单调的。例如:

library(tidyverse)

myFunc_sig <- function(sigma){
  exp(-2/sigma^2)
}

sigma = 0:12
output_sigma <- myFunc_sig(sigma)
spl_fun <- splinefun(sigma, output_sigma, "monoH.FC")

ggplot(data.frame(x=sigma,y=output_sigma),aes(x,y)) +
  stat_function(fun = spl_fun, color = "orange") +
  geom_point() +
  scale_x_continuous(expand = c(0, 0.1)) +
  scale_y_continuous(expand = c(0, 0.02)) +
  theme_bw()

r - 如何强制splinefun值为正?-LMLPHP

使用method="hyman"时,情节如下所示:

r - 如何强制splinefun值为正?-LMLPHP

如果出于某种原因您确实想要对值进行人为调整,则可以在ggplot之外计算它们,并使用geom_line对其进行绘制。例如:
x = seq(min(sigma),max(sigma),length=100)
y = spl_fun(x)

# Set negative values to zero
y[y<0] = 0

ggplot() +
  geom_line(data=data.frame(x,y), aes(x,y), colour="orange") +
  geom_point(data=data.frame(x=sigma, y=output_sigma), aes(x,y)) +
  scale_x_continuous(expand = c(0, 0.1)) +
  scale_y_continuous(expand = c(0, 0.02)) +
  theme_bw()

r - 如何强制splinefun值为正?-LMLPHP

关于r - 如何强制splinefun值为正?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47839053/

10-12 14:06