Contourplots on discrete surfaces
You can feed this data almost as-is to ListSliceContourPlot3D
,
surf = MeshRegion[vertices, Map[Polygon, tris]];
ListSliceContourPlot3D[MapThread[Append, {vertices, data}], surf]
straightforward draw a line where each contour cuts each triangle:
conttri[tri_, v_] := Module[{s},
s = Select[ Subsets[tri, {2}] ,
Ordering[ Append[MinMax@data[[#]], v]] == {1, 3, 2} & ];
Line[(Interpolation[Transpose[{data[[#]], vertices[[#]]}],
InterpolationOrder -> 1])[v] & /@ s]
];
cline[v_] := (conttri[#, v] & /@
Select[tris, Ordering[ Append[MinMax@data[[#]], v]] == {1, 3, 2} &])
Show[{g1, Graphics3D[{Hue[#], cline[#]} & /@
Subdivide[Sequence @@ MinMax@data, 10]]}]
( g1
is the Graphics3D
from the OP )