R

时间:2018-10-20 16:15:50

标签: r plot graph

我正在尝试绘制R中不同距离度量(2D)的单位球体。

我想可视化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-abs(x))。如果您注意到我在问题中附加的原始图以0(y轴)为中心。

我的代码对问题中的相同情节是否正确?以及如何为每个指标赋予不同的颜色?

1 个答案:

答案 0 :(得分:1)

我建议您创建一些通用函数并将它们通过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