HoloViews: annotate your data and let it visualize itself
With Holoviews, your data visualizes itself.
At a glance
- What is it?
- HoloViews separates the description of a dataset from the act of drawing it, so the same object can render through Bokeh, Matplotlib or a Datashader-backed raster. Here is how the mechanism works, how to install it, and where the abstraction stops paying for itself.
- Who is it for?
- HoloViews suits analysts and scientists who need the same dataset rendered through different backends, or who want widgets, linked axes and Datashader rasterization without writing that plumbing themselves. It is the wrong tool for a one-off static figure, for a team that needs a stable plotting API with no HoloViz dependencies, and for anyone unwilling to learn the element and options model.
- Can I use it commercially?
- Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 5 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 25, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What problem HoloViews solves, and for whom
Most plotting libraries make you decide the drawing call before you have finished exploring. You write a scatter call, then a histogram call, then a curve call, and each one carries its own conventions for labels, colour and axes. HoloViews inverts that. The README states the intent plainly: stop plotting your data, annotate your data and let it visualize itself. You declare that a set of arrays is a Scatter, a Curve or a Histogram, and the library decides what to draw.
The audience is the PyData user who already has pandas or NumPy objects and wants composition, linked axes, widgets and large-data rendering without assembling that machinery by hand. The project targets Python 3.12 through 3.15 according to its classifiers, and it is classified as Production/Stable. It is not aimed at someone who wants a single PNG for a slide. It is aimed at someone who will build a figure, change their mind about it, and expect the change to be cheap.
The element and options mechanism behind HoloViews
The core idea is a declarative object. You wrap data in an element such as Scatter, Curve or Histogram, and that element is a description rather than a rendering. Elements compose into containers: overlays place several elements on shared axes, layouts arrange them side by side, and these nest. The README's own framing is that you can usually express what you want in very few lines of code.
Rendering is deferred to a backend. Bokeh is a hard dependency in pyproject.toml, alongside panel, param, colorcet, narwhals, numpy, pandas, python-dateutil and pyviz_comms. Matplotlib is declared only as a framework classifier, not as a dependency, which tells you the Bokeh path is the default one and anything else is an extra you install yourself. The same element object can be handed to a different backend, which is the practical payoff of the split.
Styling goes through an options system rather than through arguments on a plot call. Options are attached to an element or a container, either inline or in bulk, and they are namespaced by backend, so a Bokeh option and a Matplotlib option do not collide. That namespacing is also the sharp edge: an option that exists for one backend may simply be ignored by another, and the library will not always tell you loudly.
Installing HoloViews and drawing a first scatter
The README gives two install paths and no others. Either works on Linux, Windows or Mac, and the README notes that HoloViews works with Jupyter Notebook and JupyterLab. Note the requires-python constraint before you start: pyproject.toml sets it to >=3.12.
conda install holoviewspip install holoviewsOnce installed, the README points to the HoloViews web site for extensive examples and documentation, and the repository ships its teaching material under examples/, split into examples/getting_started/, examples/user_guide/, examples/gallery/ and examples/reference/. The user guide is where the element and container model is actually explained; the README itself does not reproduce those examples. In a notebook, the README states that HoloViews works with Jupyter Notebook and JupyterLab, and the package depends on pyviz_comms for that live display path.
The getting started material under examples/getting_started/ is the first place to look for a working scatter, curve or histogram. Reading it before writing your own elements is worth the time, because the options syntax is layered on top of the element model and the two are easier to learn together than separately.
Where HoloViews gets in the way
The abstraction has a cost, and it shows up in three places.
First, the options system is a second language. You learn Python, then you learn HoloViews elements, then you learn the options syntax on top. When a plot looks wrong, the failure is often in an option applied at the wrong level of the container tree, and the error message is not always pointed. Debugging a nested layout is materially harder than debugging a Matplotlib call that did the wrong thing on one line.
Second, backend portability is not free. Because options are namespaced per backend and Matplotlib is not even a declared dependency, code written against Bokeh options will not transfer cleanly. If your requirement is one specific output format, the declarative layer buys you less than it costs.
Third, the dependency surface is real. Bokeh, Panel, Param, Narwhals, pandas, NumPy, colorcet and pyviz_comms all arrive with the package. Param is pinned to >=2.0,<3.0, so a major Param release will require a HoloViews release to follow. For a small script that draws one chart, that is a lot of surface area for the benefit.
HoloViews compared with Matplotlib and Plotly
Matplotlib is imperative. You create a figure, create axes, call methods on those axes, and the result is whatever you asked for. It has no element model, no backend abstraction and no automatic widget layer, and it does not need any of that to draw a line. The difference in approach is that Matplotlib asks you to describe the drawing, while HoloViews asks you to describe the data and then accepts a loss of direct control over the drawing. If you want to reach into the axes object and nudge a tick, Matplotlib is the shorter path.
Plotly is also declarative in the sense that figures are described as data structures, but the description is a figure specification rather than a typed element, and it is tied to its own rendering stack. HoloViews elements are typed and composable, and the same element can be sent to a different backend. The trade is that Plotly's figure spec is a stable, documented interchange format you can serialise, whereas a HoloViews element is a Python object whose rendering depends on which backend you selected in the session. If your output has to be a portable JSON figure, the HoloViews model is not the one you want.
The HoloViz ecosystem is the other axis. hvPlot is a separate project that offers a pandas-style plotting API, and the README here does not describe it. What the README does describe is the relationship to Datashader through the gallery, where large datasets are rasterized before display. That combination, declarative elements plus server-side rasterization, is the case where HoloViews is doing something the alternatives do not attempt in the same way.
Maintenance, releases and the BSD-3-Clause licence
The repository is not archived. Its last push was on 2026-09-23, so the project is being worked on now rather than merely preserved. Releases are frequent: v1.23.0 on 2026-06-24, v1.23.1 on 2026-07-02 and v1.23.2 on 2026-08-24. The changelog lives at doc/releases.md, linked from pyproject.toml as the Changelog URL.
Upgrade cost is dominated by the dependency pins rather than by HoloViews' own API. Param is constrained to >=2.0,<3.0, Bokeh to >=3.1, Panel to >=1.0 and Narwhals to >=2, so a major bump in any of those will gate a HoloViews upgrade. The requires-python floor of >=3.12 also means upgrading HoloViews can force a Python upgrade in environments still on 3.11.
Licensing is BSD-3-Clause, declared in pyproject.toml and shipped as LICENSE.txt. For most users that means permissive reuse with attribution and without a copyleft obligation on your own code. This is a description of what the repository declares, not legal advice; if you are redistributing HoloViews inside a commercial product, read LICENSE.txt and your own counsel's guidance.
Editorial conclusion
HoloViews suits analysts and scientists who need the same dataset rendered through different backends, or who want widgets, linked axes and Datashader rasterization without writing that plumbing themselves. It is the wrong tool for a one-off static figure, for a team that needs a stable plotting API with no HoloViz dependencies, and for anyone unwilling to learn the element and options model. Before adopting it, check that your Python is 3.12 or newer, since pyproject.toml sets requires-python to >=3.12, and confirm which backend package you will actually ship.
Frequently asked questions
How do you install HoloViews?
The README gives two options: conda install holoviews or pip install holoviews. Both work on Linux, Windows and Mac, and the package requires Python 3.12 or newer.
What is HoloViews in Python?
It is an open-source Python library for data analysis and visualization in which you annotate your data with typed elements and let the library render it. The README describes the goal as letting you express what you want in very few lines of code.
How does HoloViews compare with Matplotlib?
Matplotlib is called imperatively: you create a figure and axes and issue drawing commands. HoloViews is declarative: you wrap data in an element such as Scatter or Curve and hand rendering to a backend, with Bokeh as the default dependency.
How does HoloViews compare with Altair?
The README does not describe Altair, so no comparison can be made from it. What the repository does show is that HoloViews elements are Python objects rendered through a selected backend, with Bokeh declared as a dependency and Matplotlib listed only as a framework classifier.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/holoviz-holoviews)