When I try to implement a solution from my last question, I run into new problems: p1
and p2
(generated below) result in two completely different plots. I expected that they would look very similar except for the fact that p1
would account for the non-linear spacing of the x
and y
grids while p2
would just uses the indices of the grids. p2
looks as expected but p1
looks like it has been run in a blender
# 1 - INPUT DATA: generate non-linear grids and z variables
n = 20
x = zeros(n)
for i in 2:n
x[i] = x[i-1] + (1 - x[i-1]) / (n-i+1)^1.25
end
n2 = 30
y = zeros(n2)
for i in 2:n2
y[i] = y[i-1] + (2 - y[i-1]) / (n2-i+1)^1.3
end
r = @. x^2 + y'^2
z = @. sin(10*r) / (1 + r)
using Plots
p1 = heatmap(
x, y, z;
clims=clims,
cb=false,
xlims=extrema(x),
ylims=extrema(y),
tick_dir=:out,
c=:viridis
)
p2 = heatmap(
z;
clims=clims,
cb=false,
tick_dir=:out,
c=:viridis
)
You seem to have mixed rows and colums, try the transpose:
p1 = heatmap(
x, y, z';
1 Like
But the logic of that defies me. I would have thought that size(z) == (size(x, 1), size(y, 1))
would imply that inputting simply x, y, z
would get the job done
Julia is column-major and size(z) = (20,30)
tells us that the first index of matrix z
runs over 1:20 vertically along the columns direction. If you want x
to display horizontally you have to transpose z
1 Like
Alright. I just realized that p2
didn’t look as I should have expected. It has 30 nodes on the horizontal axis and 20 on the vertical, which makes perfect sense after your comment. Thanks!
Now, the strange thing becomes why heatmap
doesn’t object when the supplied grids have the wrong number of nodes. Perhaps there is some deep reason for this The correct call when z
wasn’t transposed should have been heatmap(y, x, z)
.
Indeed this is confusing and I’ve no idea about the rationale behind it.
There should be somewhere a reshape()
being applied, as heatmap(x,y,z)
seems to consume any matrix z
with 600 elements (= 20 x 30) in your example, for instance z = rand(10,60)
1 Like