Skip to main content

Applying an ArrayPlot as a texture to the surface of a cylinder


I would like to apply a matrix plot to the surface of a 3D cylinder. The matrix plot is the output from a custom cellular-automata, and it would be nice to see the lefthand side of the plot connected to the righthand side.


Edit


This is the solution I ended up using:


mrt =
ArrayPlot[CellularAutomaton[30, RandomInteger[{0, 1}, 100], 30],

Frame -> False,
ImagePadding -> 0,
PlotRangePadding -> 0];
ParametricPlot3D[{Sin[t]/2Pi, Cos[t]/2Pi,u},{t,0,2Pi},{u,0,2},
Boxed -> False,
Axes -> False,
PerformanceGoal -> "Quality",
ImageSize -> {300, 300},
Lighting -> "Neutral",
PlotStyle -> Texture[mrt],

Mesh -> None,
ViewPoint -> {0, 3, 1}]

enter image description here



Answer



You can use the raster image produced by MatrixPlot as Texture directive if you construct Cylinder using ParametricPlot3D or ContourPlot3D.


 mplt = MatrixPlot[Table[Sin[x y/100], {x, -10, 10}, {y, -10, 10}], 
ColorFunction -> "Rainbow", Frame -> False, ImagePadding -> 0,
PlotRangePadding -> 0]


enter image description here


ParametricPlot3D


 ParametricPlot3D[{Cos[theta], Sin[theta], rho}, {theta, -Pi, Pi}, {rho, 0, 2}, 
PlotStyle -> Directive[Specularity[White, 30], Texture[mplt]],
TextureCoordinateFunction -> ({#1, #3} &), Lighting -> "Neutral",
Mesh -> None, PlotRange -> All, TextureCoordinateScaling -> True]

enter image description here


Update: To wrap the matrix plot around the cylinder


Change the setting for TextureCoordinateFunction to



TextureCoordinateFunction -> ({#4, #5} &)  (*Thanks: @Rahul *)

enter image description here


Or leave out the TextureCoordinate... options out and use PlotStyle -> Texture[mplt] (thanks: @DROP TABLE):


ParametricPlot3D[{Cos[theta], Sin[theta], rho}, {theta, -Pi, Pi}, {rho, 0, 2},
PlotStyle -> Texture[mplt], Lighting -> "Neutral", Mesh -> None,
PlotRange -> All, ImageSize -> 400]

enter image description here


ContourPlot3D



ContourPlot3D[x^2 + y^2 == 1, {x, -1, 1}, {y, -1, 1}, {z, -1, 1}, 
Mesh -> None, Lighting -> "Neutral",
ContourStyle -> Directive[Specularity[White, 30], Texture[mplt]],
TextureCoordinateFunction -> ({#1, #3} &)]

enter image description here


Related:


How to Texturize Disk/Circle/Rectangle


Heike's answer MathGroup: Texture on Disk in Mathematica 8


Wraping a Rectangle to Form a Cylinder



ColorFunction and ColorFunctionScaling Issue with ParametricPLot3D


Comments