Как сделать контурный график в R более эффективным - PullRequest
0 голосов
/ 18 мая 2019

Мне нужна помощь в переписывании моего кода. У меня есть код, который я написал в R для контурного графика, который я хочу. Код работает, однако, он очень неэффективен в том смысле, что ему приходится строить тысячи точек, чтобы получить именно то, что я хочу (серая область), и поэтому я хотел бы посмотреть, есть ли более простой способ сделать то, что мой код делает.

Я в основном хочу построить функцию

f = x1 + x2

при условии соблюдения следующих функций ограничения

c1 = 3/2 - x1 - 2x2 - 1/2 * sin (2 * pi (x1 ^ 2 - 2x2)) <0 </p>

c2 = x1 ^ 2 + x2 ^ 2-3 / 2 <0 </p>

И поэтому, когда c1 и c2 оба больше нуля, я хотел бы выделить эти области серым цветом и показать только функцию f, где c1 и c2 меньше 0. А области x1 и x2 находятся между 0 и 1.

Вот мой текущий код R:

x1 = seq(0,1,.001) 
x2 = seq(0,1,.001)

f = function(x1,x2){   
ans = x1 + x2   
return(ans) }


h = function(x1,x2){   
ans1 = 1.5-x1-2*x2-.5*sin(2*pi*(x1^2-2*x2))   
ans2 = x1^2+x2^2-1.5   
ans1 = sapply(ans1,function(x){max(x,0)})   
ans2 = sapply(ans2,function(x){max(x,0)})   
ans = ans1 + ans2   
return(ans) }

z = outer(x1,x2,f) 
w = outer(x1,x2,h)

image(x1,x2,z,xlab=expression(x[1]),ylab=expression(x[2])) 
contour(x1,x2,z,add=TRUE)

X = cbind(expand.grid(x1,x2),c(w)) 
points(X[X[,3]!=0,1],X[X[,3]!=0,2],pch=19,col="lightgrey")

1 Ответ

0 голосов
/ 20 мая 2019

Вы можете сделать это с помощью .filled.contour, рабочая функция за filled.contour. (Полное filled.contour затрудняет аннотирование вашего графика.) Например

x1 = seq(0,1,.001) 
x2 = seq(0,1,.001)

f = function(x1,x2){   
  ans = x1 + x2   
  return(ans) }


h = function(x1,x2){   
  ans1 = 1.5-x1-2*x2-.5*sin(2*pi*(x1^2-2*x2))   
  ans2 = x1^2+x2^2-1.5   
  ans1 = pmax(ans1,0)   
  ans2 = pmax(ans2,0)  
  ans = ans1 + ans2   
  return(ans) }

z = outer(x1,x2,f) 
w = outer(x1,x2,h)

# Set up the plot, .filled.contour doesn't do that
plot(x1, x2, type="n", xlab=expression(x[1]),ylab=expression(x[2]))

# Set a gray background
rect(min(x1), min(x2), max(x1), max(x2), col = "gray")

# Make parts transparent
z[ w != 0 ] <- NA

# Choose the contour levels
levels <- pretty(z)

# Plot them
.filled.contour(x1,x2,z,levels, 
               hcl.colors(length(levels)-1, "ylOrRd", rev = TRUE)) 

# If your device does antialiasing, plot the filled contours twice to avoid 
# ugly effects

.filled.contour(x1,x2,z,levels, 
               hcl.colors(length(levels)-1, "ylOrRd", rev = TRUE)) 

contour(x1,x2,z, levels = levels, add=TRUE)

Это дает мне

screenshot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...