Единичные сферы для различных метрик расстояния (2D) в R - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь построить единичные сферы для различных метрик расстояния (2D) в R.

Я хотел бы визуализировать L_0.1, L_0.5, L_1, L_2, L_4, L_10, L_infinity.

Я надеюсь сделать что-то подобное в R, но с большим количеством метрик.

enter image description here

Следующий код R - моя попытка.

################ Different metrics ##################
fun <- function(x,p=.5){ 
(abs(x)^.5)}
fun1 <- function(x,p=.5){ 
  (2-abs(x)^.5)}

fun2 <- function(x,p=.1){ 
  (abs(x)^.1)}
fun3 <- function(x,p=.1){ 
  (2-abs(x)^.1)}

fun4 <- function(x,p=1){ 
  (abs(x)^1)}
fun5 <- function(x,p=1){ 
  (2-abs(x)^1)}

fun6 <- function(x,p=2){ 
  (abs(x)^2)}
fun7 <- function(x,p=2){ 
  (2-abs(x)^2)}

fun8 <- function(x,p=4){ 
  (abs(x)^4)}
fun9 <- function(x,p=4){ 
  (2-abs(x)^4)}

fun10 <- function(x,p=10){ 
  (abs(x)^10)}
fun11 <- function(x,p=10){ 
  (2-abs(x)^10)}


plot(fun1,1,-1,ylim=c(2,-0),xlim = c(1,-1))   
plot(fun,-1,1,add=T)      
plot(fun2,-1,1,add=T)      
plot(fun3,-1,1,add=T)      
plot(fun4,-1,1,add=T)      
plot(fun5,-1,1,add=T) 
plot(fun6,-1,1,add=T)      
plot(fun7,-1,1,add=T)      
plot(fun8,-1,1,add=T)      
plot(fun9,-1,1,add=T) 
plot(fun10,-1,1,add=T)      
plot(fun11,-1,1,add=T)      
########################################################## 

Я не уверен насчет созданной мной функции.Я имею в виду (2-абс (х)).Если вы заметили оригинальный сюжет, который я прикрепил в вопросе с центром в нуле (ось Y).

Правильно ли мой код воспроизвести тот же график в вопросе?и как дать каждой метрике разные цвета?

1 Ответ

0 голосов
/ 23 октября 2018

Я предлагаю вам создать некоторые универсальные функции и передать их непосредственно в функцию построения графика через цикл lapply:

Например, вы можете сделать две универсальные функции для каждой p:

## The generic functions for every p and x
fun.generic1 <- function(p, x) {
    return(abs(x)^p)
}
fun.generic2 <- function(p, x) {
    return(2-abs(x)^p)
}

И функция построения графика (используя curve вместо plot для передачи x в качестве функции):

## The curve wrapping function
fun.plot <- function(p) {
    curve(fun.generic1(p, x), y = c(-1, 1), add = TRUE)
    curve(fun.generic2(p, x), y = c(-1, 1), add = TRUE)
}

Затем можно создать вектор из всех значений p Вы хотите построить график (включая Inf):

## All the p values
p_vector <- c(0.1, 0.5, 1, 2, 4, 10, Inf)

Затем построить пустой график с заданными пределами x и y:

## Empty plot
plot(NULL, ylim = c(2, -0), xlim = c(1, -1), xlab = "x", ylab = "y")

И построить все параметры, используяпросто lapply (результаты сохраняются в объекте silent, чтобы не мешать вашей R консоли):

## Plot all the parameters
silent <- lapply(p_vector, fun.plot)

Бонус: вы также можете обернуть все это в одну более элегантную функцию:

## Wrapping function
plot.everything <- function(p_vector) {
    plot(NULL, ylim = c(2, -0), xlim = c(1, -1), xlab = "x", ylab = "y")
    lapply(p_vector, fun.plot)
    return(invisible())
} 

## Plotting the vector directly
plot.everything(c(0.1, 0.5, 1, 2, 4, 10, Inf))

example

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