Developers log
It is clear, that not everyone is happy with WLJS rendering engine. Some styles might be different or look different from the traditional Mathematica's plots. For this reason we have MMAView
allowing to use built-in raster rendering engine of Wolfram Engine.
But is it possible to animate things or use Manipulate
together with MMAView
?
Short answer: kinda
MMAView[]
acts indirectly using parallel kernel to build and render the given expression, which is already async operation. Having it inside Manipulate
or Animate
makes it 2x async, which is not possible in Wolfram Kernel. Therefore most likely you will get
Timeout!
Animationβ
Utilizing raster dynamics of Image
and manually updating pixel data, one can achieve the desired effect:
- prepare frames of animation
frames = Table[MMAView @ Plot[Sin[y x], {y,0,10}], {x, 0.1, 1.0, 0.05}];
- animate frames
Module[{buffer = ImageData[frames//First, "Byte"]},
Animate[Image[buffer // Offload, "Byte"], {i, 1, Length[frames], 1},
"UpdateFunction" -> Function[i,
(* stabilize raw image size *)
buffer = ImageData[ImageCrop[frames[[i]], ImageDimensions[frames // First]], "Byte"];
False (* prevent full refresh *)
]
]
]
Manipulateβ
Here we need to forget about Manipulate
or ManipulatePlot
and define directly all sliders and etc. Also MMAView
is a blocking function and does not provide a control over the rasterization process. However we can do it all at the low level anyway
With[{function = Plot[Sin[#1 x], {x,0,10}]&},
With[{firstImage = MMAView[function[1]]},
With[{dims = ImageDimensions[firstImage]},
Module[{buffer = ImageData[firstImage, "Byte"]},
{
EventHandler[InputRange[0, 2, 0.1, "Label"->"w"], Function[w,
Then[ParallelSubmitFunctionAsync[Function[{args, cbk},
cbk @ ImageData[ImageCrop[Rasterize[function @ w], dims], "Byte"]
], {all}], Function[imgData,
buffer = imgData;
]];
]],
Image[buffer // Offload, "Byte"]
} // Column
]
]
]
]
Viola
PS: Most probably we need to make a wrapper for such things π§πΌββοΈ
UPDβ
Screw that! We made it π
Graphics3Dβ
We have a special wrapper for Graphics3D -like plots to make them interactive in the session
With[{p = Plot3D[f[x] y, {x,0,10}, {y,0,10}]},
MMAView[p]
]
Note, that it is important to pass it using With
, since MMAView
has HoldFirst
attribute. Otherwise the direct pass will give your a static plot
See more examples in the documentation!