Matplotlib 如何用pyplot在Julia中绘制两个变量的函数

Matplotlib 如何用pyplot在Julia中绘制两个变量的函数,matplotlib,plot,julia,Matplotlib,Plot,Julia,我试图用Julia中的pyplot绘制两个变量的函数。工作起点如下(见StackOverflow): 这对我来说很合适,并且正是我想要的: 我自己的职能如下: ## needed functions ## const gamma_0 = 6 const Ksch = 1.2 const Kver = 1.5 function Kvc(vc) if vc <= 0 return 0 elseif vc < 20 return (

我试图用Julia中的pyplot绘制两个变量的函数。工作起点如下(见StackOverflow):

这对我来说很合适,并且正是我想要的:

我自己的职能如下:

## needed functions ##

const gamma_0 = 6
const Ksch = 1.2
const Kver = 1.5

function Kvc(vc)
    if vc <= 0 
        return 0
    elseif vc < 20 
        return (100/vc)^0.1
    elseif vc < 100
        return 2.023/(vc^0.153)
    elseif vc == 100
        return 1
    elseif vc > 100
        return 1.380/(vc^0.07)
    else 
        return 0
    end
end 

function Kgamma(gamma_t)
    return 1-((gamma_t-gamma_0)/100)
end

function K(gamma_t, vc)
    return Kvc(vc)*Kgamma(gamma_t)*Ksch*Kver
end
i = linspace(0,45,10)
j = linspace(0,200,10)
for i_val in i
    plot(i,K(i,j))
end
这给了我以下错误:

isless
没有与isless匹配的方法(::Int64,::数组{Float64,1}) 在[51]中加载时,在从第3行开始的表达式中

在[17]中的Kvc中:2在匿名中没有文件:4

显然,我的函数不能处理数组

下一次尝试:

i = linspace(0,200,11)
j = linspace(0,45,11)
for i_val in i
    plot(i_val,map(K,i_val,j))
end
给我一个只有轴的空图

谁能给我一个提示

编辑 一个简单的例子:

using PyPlot
function P(n,M)
    return (M*n^3)/9550
end
M = linspace(1,5,5)
n = linspace(0,3000,3001)

for M_val in M
    plot(n,P(n,M_val))
end
show()
解决方案 好的,在您的帮助下,我找到了适用于缩短示例的解决方案,该解决方案符合我的预期:

function P(n,M)
    result = Array(Float64, length(n))
    for (idx, val) in enumerate(n)
        result[idx] = (M*val^3)/9550
    end
    return result
end
n = linspace(0,3000,3001)

for M_val = 1:5
    plot(n,P(n,M_val))
end
show()
这给了我很多。剩下的问题是:是否可以用一种更简单更优雅的方式来完成


我将尝试将其应用于原始示例,并在成功后发布。

我并不完全了解您尝试完成的所有细节,但以下示例介绍如何修改两个函数,以便它们接受和返回数组:

function Kvc(vc)
    result = Array(Float64, length(vc))
    for (idx, val) in enumerate(vc)
        if val <= 0
            result[idx] = 0
        elseif val < 20
            result[idx] = (100/val)^0.1
        elseif val < 100
            result[idx] = 2.023/(val^0.153)
        elseif val == 100
            result[idx] = 1
        elseif val > 100
            result[idx] = 1.380/(val^0.07)
        else
            result[idx] = 0
        end
    end
    return result
end 

function Kgamma(gamma_t)
    return ones(length(gamma_t))-((gamma_t - gamma_0)/100)
end
而不是
plot(i,K(i,j)
,因为那样会反复打印相同的内容。

x<3
真的
julia>x<[3 4]
错误:MethodError:没有方法匹配isless(::Int64,::数组{Int64,2})
最接近的候选人是:
isless(::Real,::AbstractFloat)
无岛(::真实,::真实)
无岛(::整数,::字符)
在x中。<[3 4]
1x2位数组{2}:
千真万确

谢谢你的快速回答。我想实现的是一个像[this]()这样的情节。取自[here]()。我将缩短并简化我的原始问题,以使我的意图更清楚。@MarcelRüdiger你要求得到一个提示,所以这就是我给出的:)在我看来,你更新的实现很好。我不认为有什么明显的事情要做,以改善你所做的。
function Kvc(vc)
    result = Array(Float64, length(vc))
    for (idx, val) in enumerate(vc)
        if val <= 0
            result[idx] = 0
        elseif val < 20
            result[idx] = (100/val)^0.1
        elseif val < 100
            result[idx] = 2.023/(val^0.153)
        elseif val == 100
            result[idx] = 1
        elseif val > 100
            result[idx] = 1.380/(val^0.07)
        else
            result[idx] = 0
        end
    end
    return result
end 

function Kgamma(gamma_t)
    return ones(length(gamma_t))-((gamma_t - gamma_0)/100)
end
for i_val in i
    plot(i_val,K(i_val,j))
end
julia> x = 2
2

julia> x < 3
true

julia> x < [3 4]
ERROR: MethodError: no method matching isless(::Int64, ::Array{Int64,2})
Closest candidates are:
  isless(::Real, ::AbstractFloat)
  isless(::Real, ::Real)
  isless(::Integer, ::Char)
 in <(::Int64, ::Array{Int64,2}) at .\operators.jl:54
 in eval(::Module, ::Any) at .\boot.jl:234
 in macro expansion at .\REPL.jl:92 [inlined]
 in (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at .\event.jl:46

julia> x .< [3 4]
1x2 BitArray{2}:
 true  true