Контурный график с использованием gr () с интерполированной функцией в Julia - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь ознакомиться с пакетами в Julia, такими как Interpolations.jl и Plots.jl.Контурный график в Julia с использованием бэкэнда GR очень прост, как показано в ссылке: 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)

Результат: a

Кажется, что интерполяция работает нормально, но результат из контурного графикапохоже, не передает то же сообщение.

1 Ответ

3 голосов
/ 23 сентября 2019

Вам необходимо указать, в каких точках вы хотите, чтобы выполнялась интерполяция - в противном случае вы просто получите входное разрешение интерполированного объекта, которое отличается от разрешения для новых xc и yc (попробуйте size(gitp_quad2d).t Рецепт, встроенный в Графики для автоматического выполнения этого на входах 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)

...