# PGFPlotsX a matrix of RGB

I have an image – a matrix of RGBs. The number of pixels is relatively small (e.g. 20×20), so I want to plot it as an array of colored squares. This way the dimensions of the resulting figure won’t be dictated by the low resolution of the image.

I think I need a combination of this and this, but I’m not sure.

For the sake of a MWE:

``````img = rand(RGB{Float64}, 20, 20)
``````

I am not sure what you mean by a combination. If you are asking for section 4.6.7 (Surface Plots with Explicit Color) in the pgfplots manual, this we don’t currently support. You can work around it with eg

``````using PGFPlotsX, Colors
img = rand(RGB{Float64}, 20, 20)
xy = Pair.(1:20, (1:20)')
col2tex(c) = "rgb=\$(red(c)),\$(green(c)),\$(blue(c))"
c = Coordinates(vec(first.(xy)), vec(last.(xy));
meta = [col2tex(c) for c in vec(img)])
@pgf Axis({ enlargelimits = false },
PlotInc({ matrix_plot, no_marks, "mesh/color input" = "explicit",
"mesh/cols" = 20 },
c))
``````

1 Like

Opened an issue for discussion of supporting this directly:

1 Like

That’s perfect, thank you!

I am happy that it solves your immediate problem. I also plan to add this feature soon, after some discussion.

pgfplots (the LaTeX package) is so feature-rich (with a 500+ page manual) that we have not covered all possible constructs in PGFPlotsX, but try to add them on demand.

1 Like

I personally find PGFPlots really useful for publication-quality figures. The fact it’s so feature rich means I can do almost anything I want, which is also horrible in its own right… PGFPlotsX is therefore ultra useful, I bet adjusting a Julia-dialect API for PGFPlots and TikZ is really tricky…

@Tamas_Papp, I can’t get rid of the flipped y-axis, I tried with `y_dir=normal` (and `reverse` just in case) and it’s still flipped… I guess that does fit with the standard of images where the top left corner is `(0,0)`, but… Any way I can have the y-axis (and corresponding data) go from small to large?

Please refer to the pgfplots manual, in particular `matrix plot*` in 4.6.12. Eg

``````using PGFPlotsX, Colors
img = rand(RGB{Float64}, 20, 20)
xy = Pair.(1:20, (1:20)')
col2tex(c) = "rgb=\$(red(c)),\$(green(c)),\$(blue(c))"
c = Coordinates(vec(first.(xy)), vec(last.(xy));
meta = [col2tex(c) for c in vec(img)])
@pgf Axis({ enlargelimits = false },
PlotInc({ "matrix_plot*", no_marks,
"mesh/color input" = "explicit",
"mesh/cols" = 20},
c))
``````
2 Likes

Perfect, thanks*!

This feature was added with the latest (0.3.7) release of PGFPlotsX, with worked example in the manual.

1 Like

A post was split to a new topic: How to make a heatmap with pgfplotsx?