我正在尝试熟悉Julia中的软件包,例如Interpolations.jl
和Plots.jl
。使用GR后端的Julia中的轮廓图非常简单,如链接所示:
https://docs.juliaplots.org/latest/examples/gr/#contours
并使用Interpolations.jl
进行插值:
https://github.com/JuliaMath/Interpolations.jl/blob/master/doc/Interpolations.jl.ipynb
我试图使用内插函数绘制轮廓图,如下所示:
using Interpolations
using Plots
gr()
xs = 1:5
ys = 1:8
g = Float64[(3x + y ^ 2) * abs(sin(x) + cos(y)) for x in xs, y in ys]
gitp_quad2d = interpolate(g, BSpline(Quadratic(Line(OnCell()))))
xc = 1:0.1:5
yc = 1:0.1:5
p1 = contour(xc, yc, gitp_quad2d, fill=true)
plot(p1)
但是,这将给出一个没有任何轮廓曲线的图,并显示一条消息:“数组的长度或尺寸不正确。”。但是contour
函数似乎接受上面的链接中的任意x,y数组和x,y函数,并返回等高线图。这不应引起任何尺寸问题。代码有什么问题?
[编辑]
using Interpolations
using Plots
gr()
xs = 1:0.5:5
ys = 1:0.5:8
g = Float64[(3x + y ^ 2) for x in xs, y in ys]
f(x, y) = (3x + y ^ 2)
g_int = interpolate(g, BSpline(Quadratic(Line(OnCell()))))
gs_int = scale(g_int, xs, ys)
xc = 1:0.1:5
yc = 1:0.1:5
println("gs_int(3.2, 3.2) = ", gs_int(3.2, 3.2))
println("f(3.2, 3.2) = ", f(3.2, 3.2))
p1 = contour(xs, ys, gs_int(xs, ys), fill=true)
p2 = contour(xc, yc, f, fill=true)
plot(p1, p2)
结果:
插值似乎工作正常,但等高线图的结果似乎无法传达相同的信息。
答案 0 :(得分:3)
您需要指定要在哪个点进行插值-否则,您将只获得插值对象的输入分辨率,这与新的xc和yc的输入分辨率不同(尝试size(gitp_quad2d)
。不是在Plots中内置的用于在x和y输入上自动执行此操作的配方。
试试
contourf(xc, yc, gitp_quad2d[xc, yc])
编辑:已更新以反映问题的更新
在绘图上,轮廓看起来奇怪的原因是插值矩阵相对于x和y变量进行了转置。轮廓图/热图的期望换位始终是绘图中的讨论(它应该与矩阵相同,作为正态图还是作为图像?-有关此问题的详细讨论,请参见https://github.com/JuliaPlots/Makie.jl/issues/205)。无论如何,将其放回原位都会有所帮助(p1 = contourf(xs, ys, gs_int(xs, ys)')
或p1 = contourf(xs, ys, gs_int(xs, ys), transpose = true)