Nivo logo

Nivo

A rich set of highly customizable dataviz components for React, built on top of D3.

npm install nivo
13.9K4.0K/weekv0.31.00BUnknown64 issues
Last updated: 2017-12-05
Star history chart for plouc/nivo

TL;DR

A comprehensive visualization library that provides a diverse set of charts with support for SVG, Canvas, and HTML rendering strategies.

It stands out for its exceptional design defaults, interactive documentation playground, and native support for Server-Side Rendering (SSR).

Why Nivo?

Nivo takes a different approach than many React charting libraries. Instead of composing charts from tiny pieces, Nivo provides highly configurable, "battery-included" components that look professional immediately. It bridges the gap between the raw power of D3 and the ease of use of React.

  • Multiple Rendering Strategies: Most Nivo charts allow you to switch between SVG (best for interactivity/tooltips), Canvas (best for large datasets/performance), and even HTML (best for text-heavy layouts) just by changing the import.
  • Interactive Documentation: The official documentation is a playground. You can toggle every single prop in the UI to see the effect in real-time, then copy the generated code directly into your project.
  • Motion & Transitions: Built on top of react-spring, Nivo charts feature smooth, physics-based animations for data updates and entry transitions out of the box.
  • Server-Side Rendering (SSR): Nivo supports SSR natively, allowing you to render charts on the server for SEO or generating static reports/images.
  • Theming System: It offers a robust theming architecture that allows you to define a consistent visual language (fonts, colors, grid styles) across all charts in your application.

Code Snippet

Nivo uses a "configuration object" pattern. You import a specific chart type (like ResponsiveBar) and control every aspect of it via props.

import { ResponsiveBar } from '@nivo/bar'

const MyResponsiveBar = ({ data }) => (
  <div style={{ height: 400 }}>
      <ResponsiveBar
          data={data}
          keys={['hot dog', 'burger', 'sandwich', 'kebab', 'fries', 'donut']}
          indexBy="country"
          margin={{ top: 50, right: 130, bottom: 50, left: 60 }}
          padding={0.3}
          valueScale={{ type: 'linear' }}
          indexScale={{ type: 'band', round: true }}
          colors={{ scheme: 'nivo' }}
          axisBottom={{
              tickSize: 5,
              tickPadding: 5,
              tickRotation: 0,
              legend: 'country',
              legendPosition: 'middle',
              legendOffset: 32
          }}
          enableLabel={false}
          role="application"
          ariaLabel="Nivo bar chart demo"
      />
  </div>
)

In this example, the chart is fully responsive and defined entirely by the props passed to <ResponsiveBar />.

Pros and Cons

No library is perfect; understanding the trade-offs is key to selecting the right tool.

Pros

  • Aesthetics: It is widely considered the best-looking chart library by default. If you have no design team, Nivo makes your app look polished.
  • Canvas Support: For charts with thousands of data points (e.g., a complex scatterplot or heatmap), Nivo's Canvas implementations offer significantly better performance than SVG-based alternatives like Recharts.
  • Developer Experience: The "copy-paste" workflow from the interactive documentation reduces the learning curve for complex configurations.

Cons

  • Prop Bloat: Because it uses a configuration pattern rather than composition, the prop list for a single component can become massive (30+ lines), making the code harder to scan.
  • Bundle Size: While it supports tree-shaking, importing heavy chart packages can add up. You must be careful to import only what you need (e.g., @nivo/bar instead of the whole library).
  • Customization Limits: If you need to render something truly custom inside the chart that isn't supported by the configuration API, "hacking" Nivo can be more difficult than using a composable library.

Comparison with Other Charting Libraries

The table below outlines the positioning differences between Nivo and other popular visualization libraries:

LibraryDesign PhilosophyBest ForPain Points
NivoConfiguration & Variety
High-level components, supports SVG/Canvas, distinct packages.
Polished UI
Marketing pages, public-facing dashboards, and apps requiring high-design fidelity.
Prop Complexity
Managing massive configuration objects can feel overwhelming.
RechartsComposition
Build charts like Lego blocks using React components.
Rapid Dev
Internal tools and dashboards where ease of modification beats raw performance.
Performance
Lacks Canvas support, making it slow for large datasets.
VictoryCross-Platform
Unified API for React and React Native.
Mobile Apps
Teams sharing code between web and React Native apps.
Styling
Styling API can be idiosyncratic and verbose compared to CSS-in-JS.

Verdict: When to Adopt

Choose Nivo if visual polish and performance are your top priorities. It is the ideal choice for public-facing applications where the charts need to look professional and animate smoothly. It is also your best option if you anticipate needing to render large datasets using Canvas but don't want to write low-level code.