3D Data Visualization

3D data visualization renders a dataset as geometry in a browser, drawn by the GPU, so it can be rotated, zoomed and inspected instead of read off a static image. The reason to do it is not that it looks impressive. It is that some datasets have a shape a flat chart cannot show: a network with no meaningful 2D layout, a volume of measurements through a physical object, a simulation over time.

Most data does not qualify. A bar chart in three dimensions is a bar chart with occlusion, a harder-to-read axis and a rotation control nobody asked for. So this page starts with the test I apply before quoting: does the third dimension carry information, or is it decoration? If it is decoration, the honest answer is D3 and a good 2D chart, and I will tell you that.

Built by

Peter Csipkay

Creative frontend developer near Munich, and the person behind this site. I scope, build and ship the work myself.

Live demo

A network graph, which is the case that earns 3D

Building the graph…

Synthetic data, generated in the browser from a seeded function — no dataset is downloaded. Every node is one instanced mesh, hovering resolves a pixel back to a record, and nothing moves unless you press play.

When 3D earns its place, and when it does not

Four cases where the third dimension carries real information:

  • Networks and graphs. Nodes with dense interconnection have no good 2D layout past a few hundred edges; everything crosses everything. In 3D a force-directed layout has somewhere to put the tangle, and rotation reveals clusters that overlap from any single angle.
  • Spatial and volumetric data. Anything measured through a physical thing: geology, medical scans, airflow, a building's sensor readings. The data already has three axes. Flattening it throws one away.
  • Simulations and time-varying fields. Particle systems, fluid, orbital mechanics, agent models. The state is the visualisation.
  • Very large point sets. Above roughly a hundred thousand marks, SVG stops being viable and the GPU is the only thing that will draw it interactively. This is a rendering argument rather than a dimensional one, and it is often the real reason a project needs WebGL.

Cases where a flat chart wins, which is most of them:

  • Comparing quantities across categories. A 3D bar chart makes comparison harder, because perspective means two bars of the same height do not look the same height.
  • Trends over time. A line chart is already optimal.
  • Anything going into a report, a slide or a print. Static beats interactive when the reader cannot interact.
  • Anything where the audience needs to read exact values. Depth makes precise reading worse, not better.

I would rather lose the project at this stage than build something that makes your data harder to understand.

How a browser draws a hundred thousand things

The whole discipline is about not issuing a draw call per data point.

Instancing. One geometry, one material, uploaded once, drawn many times with a per-instance matrix and colour. A hundred thousand cubes cost roughly one draw call rather than a hundred thousand. In Three.js this is InstancedMesh, and it is the single technique that makes browser data visualization possible.

Attribute-driven geometry. Above a few hundred thousand marks even instancing strains, and the data moves into buffer attributes read directly by the vertex shader. The position of a point becomes a value in a texture rather than an object in JavaScript. At that point the visualisation is a shader and the data is its input.

Picking. Making a rendered point clickable is not free, because the GPU has drawn pixels rather than objects. The usual answer is a second render pass into an off-screen buffer where each mark is drawn in a unique colour, then reading a single pixel under the cursor to identify it. It is a well-understood trick and it needs planning for, because it doubles the draw work if implemented carelessly.

Where the data lives. The interesting constraint is rarely rendering, it is transfer. A million rows of JSON is tens of megabytes and blocks the main thread while it parses. Binary formats, typed arrays, aggregation on the server, and streaming in chunks are what make the difference between a two-second load and a thirty-second freeze.

The part that gets underestimated: labels and legibility

Drawing the data is the easy half. Making it readable is the half that decides whether anyone uses it.

Text in a 3D scene has no good default. Rendered as geometry it costs draw calls and looks wrong at distance; rendered as HTML overlays it is crisp and accessible but needs projecting and occlusion-testing every frame; rendered into a texture atlas it is fast and fixed-resolution. Each is right sometimes and there is no option that is right always.

Then the ordinary problems arrive. Axes need to stay oriented as the camera moves. A legend has to be readable against a scene whose background colour changes as you orbit. Labels collide, and something has to decide which one wins. Depth cueing — fog, size falloff, desaturation with distance — is what stops a point cloud reading as noise.

None of this is visible in a screenshot, which is why so many 3D visualisations look wonderful in a case study and are unusable in practice.

What it costs

Three things drive the number:

  1. The state of the data. A clean API returning aggregated JSON is a different project from a 4 GB CSV export that needs a pipeline built before anything can be drawn. This is the biggest variable and the one most often underestimated.
  2. Interaction depth. Rotate and zoom is cheap. Filtering, brushing, linked selection between views, drilling into a point and pulling its record from an API — each of those is a feature with its own state to manage.
  3. How many people need to read it, and how carefully. An internal exploratory tool for five analysts can be rough. A public-facing visualisation that has to be legible, accessible and correct on a phone is a different standard of finish.

The cost that surprises people is the data pipeline. On a typical project the rendering is a minority of the work and the ingestion, aggregation and transfer layer is the majority.

Built with Three.js, WebGPU and TSL

Three.js is the base: instancing, custom shader materials, and a scene graph that handles the camera and interaction so the project is about the data rather than about matrix maths.

WebGPU matters more here than on most 3D work, because of compute shaders. A force-directed graph layout, a particle simulation, or an aggregation over a large buffer can run on the GPU instead of the main thread, which is the difference between a layout that settles in a second and one that locks the tab for thirty. Three.js reaches this through its node system and TSL. I still build WebGL as the fallback path, usually with a smaller dataset or a precomputed layout for browsers without WebGPU.

For flat charts inside the same interface, D3 remains the right tool and the two coexist happily — SVG for the axes and the small multiples, a canvas for the part that needs the GPU.

A worked example

Radix 3D is an interactive 3D network graph built with React Three Fiber. It loads live JSON and re-renders the full node and edge graph every three seconds.

That last detail is the interesting one. A graph that redraws continuously cannot rebuild its scene from scratch each cycle, because allocating and disposing geometry at that rate produces exactly the stutter the visualisation exists to avoid. The work is in updating instance buffers in place, keeping the layout stable so nodes do not jump between frames, and keeping interaction responsive while the data underneath keeps changing.

You can try it — it is linked from the work section below.

What goes wrong

3D chosen for the screenshot. The commonest failure and the most expensive. If the brief starts from wanting something that looks impressive in a deck, the result is a chart that is harder to read than the one it replaced.

No aggregation strategy. Sending every row to the browser because the dataset "is not that big yet". It will be. Decide early what the server aggregates and what the client draws.

Colour used carelessly. A rainbow ramp is the classic error: it implies category boundaries that are not in the data and it fails completely for the ~8% of men with a colour vision deficiency. Perceptually uniform scales exist for a reason.

No empty and loading states. Real data arrives late, arrives partial, or fails. A visualisation that only handles the happy path is a demo.

Interaction without affordance. A scene the user can rotate, with nothing indicating that. People stare at a still image and leave.

Ignoring the flat version. Even a good 3D visualisation usually needs a 2D companion — a table, a filter panel, an export — because at some point someone needs the actual numbers.

Budget

What it costs to work with me

The range here is genuinely wide, and the reason is almost always the data rather than the graphics: a clean API and a defined question is a matter of weeks, while a project that starts with raw exports and an undecided question is a pipeline build with a visualisation on the end. Send me the shape of the data and the question it has to answer and you get a quote against both.

Schedule

How long it takes

  1. 01

    Question and data audit

    3–5 days

    What must the visualisation let someone work out, what data exists, in what state, and how much of it. This is also where 3D gets ruled out if a flat chart is the better answer.

  2. 02

    Prototype the hardest view

    1 week

    One view, real data, at full volume. Rendering a thousand points proves nothing about a hundred thousand, so the prototype uses the real number.

  3. 03

    Data pipeline

    1–3 weeks

    Aggregation, binary transfer, streaming, caching. Usually the largest phase and the one that decides whether the result feels instant.

  4. 04

    Visualisation build

    2–4 weeks

    Instanced rendering, colour scales, labels, axes, picking, filtering, and the states nobody demos: empty, loading, partial and failed.

  5. 05

    Legibility and performance pass

    1 week

    Testing with people who did not build it, on the hardware they actually use, with the dataset at its real size.

Phases overlap in practice, and the ranges assume decisions arrive when they are needed. The one that slips most often is the first.

Proof

Work

Radix 3D

An interactive 3D network graph in React Three Fiber that loads live JSON and re-renders the full node and edge graph every three seconds — a study in keeping interaction responsive while the underlying data keeps changing.

  • React Three Fiber
  • Network graph
  • Live data

Client projects I can show publicly are on the services page. Some work sits under NDA — ask on a call and I will say what I can.

F.A.Q

Frequently asked questions

When is 3D actually better than a normal chart?

When the third dimension carries information. Densely connected networks, spatial or volumetric measurements, simulations over time, and point sets large enough that SVG cannot draw them interactively. For comparing categories, showing a trend, or letting someone read exact values, a flat chart is better and I will say so. A 3D bar chart is the clearest example of the mistake: perspective means two bars of equal height do not look equal, so the depth actively costs you accuracy.

How much data can a browser actually handle?

With instanced rendering, a hundred thousand marks is comfortable on ordinary hardware and a million is achievable when the data moves into buffer attributes read by the vertex shader. The real ceiling is usually transfer and parsing rather than drawing: a million rows of JSON is tens of megabytes and freezes the main thread while it parses. Binary formats, typed arrays, server-side aggregation and streaming are what make large datasets feel instant, and they are where most of the engineering goes.

Can it use our live data?

Yes, and that changes the architecture rather than just the data source. A visualisation that updates continuously cannot rebuild its scene each cycle — allocating and disposing geometry at that rate causes the stutter the visualisation exists to avoid. Instead the instance buffers are updated in place and the layout is kept stable so marks do not jump between frames. Radix 3D does exactly this, re-rendering a full network graph from live JSON every three seconds.

Do you work with D3, or is this a replacement?

Both, usually in the same interface. D3 is the right tool for axes, scales, small multiples and any flat chart, and it stays the right tool. WebGL takes over for the part with too many marks for SVG or a genuine third dimension. A well-built data tool normally has both: SVG for the parts that need crisp text and precise reading, a GPU canvas for the part that needs volume.

Will it work on a phone?

It can, but it should be designed for one rather than shrunk to fit. Mobile GPUs have less memory and throttle under sustained load, so the point budget is lower, and a dense interactive scene is genuinely hard to use on a small touch screen without a rethink of the interaction. The usual answer is a reduced or pre-aggregated view on mobile with the full version on desktop, which is a content decision worth making early rather than a technical afterthought.

How do labels and axes work in a 3D scene?

There is no free option, which is why this gets underestimated. Text as geometry costs draw calls and reads badly at distance. Text as HTML overlays is crisp and accessible but must be projected and occlusion-tested every frame. Text baked into a texture atlas is fast but fixed-resolution. On top of that, axes need to stay oriented as the camera moves, colliding labels need a rule for which one wins, and depth cueing is what stops a point cloud reading as noise. None of it shows in a screenshot, and all of it decides whether the thing is usable.

Is a 3D visualization accessible?

The canvas itself is not, so the data has to be reachable another way: a table, a downloadable dataset, or a text summary of what the visualisation shows. That is not a consolation prize, it is the version most people will actually use to get exact numbers. Beyond that, colour choices matter more than usual — a rainbow ramp implies boundaries the data does not have and fails for viewers with a colour vision deficiency, so perceptually uniform scales are the default.

What do you need from us to start?

A sample of the real data, at realistic size, and the question the visualisation has to answer. The sample matters because rendering a thousand rows proves nothing about a hundred thousand. The question matters more: "we want to visualise our data" is not yet a brief, and the projects that go wrong are almost always the ones where it never became one.

What question does the data have to answer?

Send me a realistic sample and the decision someone needs to make from it. If a flat chart answers it better, that is what I will tell you, and it costs you nothing to find out.

Get In Touch

Let's talk about your project

Tell me what you're trying to build, big or small. I'll reply personally within 24 hours, usually same day.

I reply personally within 24 hours — usually same day.

Peter Csipkay

Peter Csipkay

Creative Frontend Developer

Let's connect

Three.js developer and creator of threejsresources.com. I scope, build, and ship the work myself — no middlemen, no handoffs.

Based in

Munich, Germany

Testimonials

What Clients Say

Don't just take my word for it — here's what people I've worked with have to say.

Peter is different from other front end developers. He understands design along with the tech stack. He successfully resolved bugs and optimized the webapp quickly. I appreciate his good work ethic. He is very logical and manages to capture ideas perfectly.
AhmedCEODubai, UAE
Amazing work with super fast turn around. I'm thrilled!
RobertFounder, 3D AgencyTampa, Florida
Peter is a great resource. I enjoyed working with him. I will definitely work with him again.
ThomasProduct LeadBerlin, Germany
Was a pleasure to work with. Very reliable and motivated to deliver great work. I can highly recommend him.
SarahMarketing ManagerLondon, UK

Keep reading

Related services

Free tools

Useful before you commission anything