data = RandomSample[ResourceData["MNIST", "TestData"], 1000];
pts = DimensionReduce[data[[All, 1]], 3, Method -> "TSNE"];
imgs = data[[All, 1]]; classes = data[[All, 2]]; pr = MinMax /@ Transpose[pts];
mm = MinMax[(1/EuclideanDistance[{pr[[1, 2]], pr[[2, 1]], pr[[3, 2]]}, #]) & /@ pts];
vp = {1.3`, -2.4`, 2.`}; vp = {0, -2, 2};
ir[pt : {x_, y_, z_}, img_, class_] := {Opacity[1],
Glow[ColorData["Rainbow"][(class + 1)/10.]],
Texture[ImageMultiply[img, ColorData["Rainbow"][(class + 1)/10.]]], EdgeForm[{Thin}],
Tooltip[GeometricTransformation[
GeometricTransformation[GeometricTransformation[
Polygon[{{-1, -1, 0}, {1, -1, 0}, {1, 1, 0}, {-1, 1, 0}},
VertexTextureCoordinates -> {{0,
0}, {1, 0}, {1, 1}, {0, 1}}],
TranslationTransform[{x, y, z}]],
RotationTransform[45 \[Degree], {1, 0, 1}]],
ScalingTransform[{1, 1, 1}]], pt]};
g = Graphics3D[MapThread[ir, {pts, imgs, classes}],
ImageSize -> 400, Axes -> True, AxesLabel -> {"x", "y", "z"}]