Hi, I’m struggling with plotting a simple matrix with log-scales for x, y and/or color-axis.
Consider e.g. a random 5*5 matrix a
, with associated values for x
and y
axis (these values are always regularly spaced, either in linear or log space).
a = 10 .^(3*randn(5,5))
x = 10 .^(1:5)
y = 1:5
So given these values, it makes sense to use logarithmic x- and color-scales.
I tried with Plots.jl, first with GR backend:
heatmap(10 .^(1:5), 1:5, a, xscale=:log10)
which produces:
here the xticks are perfect, but not the rendering of the matrix…
Without the xscale=:log10
option, the xticks are wrong… but the cells sizes well rendered:
Now, independently from this xticks behavior, let’s check the colors (these are probably two different problems, but I need to find a solution fixing the two together).
The zscale=:log10
seems to be ineffective, so I tried to play with the color gradient to yield a good color rendering:
heatmap(10 .^(1:5), 1:5, a, cgrad=(scale=:log10))
I don’t quite understand how the transformation is computed, but it looks worse than before, so I also tried:
heatmap(10 .^(1:5), 1:5, a, cgrad=(scale=:exp))
which is better, but still not what I expect:
This should be compared to the range of colors you get when manually computing the log:
heatmap(10 .^(1:5), 1:5, log10.(a))
which produces:
The colors are much better, but the colorbar is now useless.
Now I also tried with PyPlot backend and xscale=:log10
:
The matrix display is great, but same problem with the colors.
Then I tried to use directly PyPlot, without Plots. I used the keyword argument norm=matplotlib[:colors][:LogNorm]
which solves the color problem, but I can’t get the ticks to render correcly.
First with imshow
, I have trouble with the xaxis, even when using xscale("log")
:
PyPlot.imshow(a, cmap=:RdBu, norm=matplotlib[:colors][:LogNorm](),extent=[1, 10^5, 1, 5])
Then with
pcolor
, I have a bug with the first column, and also the ticks are now aligned to the begin/end of the axis, but they should be aligned with the centers of the bins. With a lin-scale I could use that and play manually with xticks, but with a log-scale it us much more annoying.
PyPlot.pcolor(10 .^(1:6),1:6, a, cmap=:RdBu, norm=matplotlib[:colors][:LogNorm]())
So none of these options works properly to me, does anyone know how to get that working?
I’m using julia 1.1.0, Plots 0.25.3, PyPlot 2.8.1.