A little late to the party. Have you considered a "web ui"?
It's where all the cool kids are these days, snow boarders and such. jk. Well, it does have easy to use components, can create full "GUI" apps quickly.
In that model you would build the UI in mostly Javascript and HTML5, you can run 90% of things in the browser.
The interface to be backend is, traditionally, HTTP with JSON REST-like. For "streaming" data you have web sockets or just keep alive connections.
The browser opens you to features like dynamic SVG XML which also support animation, there are a multitude of "widget" libraries for things like guages, including ones where momentum, "springiness" etc can be modelled like "steam punk gauges" and the like.
The interface over REST gives you a solid UI/Backend separation, allowing both to exist.
If you are sending data from an MCU like an ESP32, REST-like HTTP API is easy. Just try and avoid needing HTTPS and full OAUTH.
I spent 2 years writing a front (and back) end for a monitoring system for ePON head-end "OLT"s for ISPs while in Pace. I got the fun task of doing the live gauges showing system load and a few other key metrics. Was a lot of fun. Out lib at the time only did basic animations, but I extended them to have inertia and acceleration to smooth them out and stop thme just jittering on each update on the websocket.
Sounds like a lot of code, but "Flask" in python will give you a REST API in 2 lines and your handler function. Creating basic "bootstrap like" web UI is an afternoons tutorial type thing.
UI JS Layer: Angular, React or higher level wrapped frameworks based on them.
BE REST Layer: Python+Flash or node.js (serverside JS, I know, yuk)
MCU layer: An ESP32 will do HTTP REST-like calls with ease, it should handle websockets for streaming, or the alternative is a serial gateway which takes the MCU requests/data updates as basic serial data and converts them into REST calls. Python has direct wrappers around C struct and union expansion and packing (hint).
Each is replacable, isolated and have additional benefits which may come in handy. Like multiple simultaneous clients. Authentication. Remote access. Security.
MCU(*) <-> RaspberryPI(HTTP Server) <-> User's browser <-> Angular application
Here is an example of an SVG JS Library at work:
https://svgjs.dev/docs/3.0/tutorials/Mores specific to guages.
https://github.com/naikus/svg-gaugeNote.... If you have that HTTP layer, it's a very easy step to send updates to InfluxDB and point Grafana at it. You can then import big boy grafana charts into your front end.