Nivo logo

Nivo

基于 React 的丰富数据可视化组件库,提供 30+ 种精美图表类型,支持 SVG、Canvas 和 HTML 三种渲染模式。

可视化图表ReactSVG

Nivo 是功能极为丰富的 React 数据可视化组件库,提供 30+ 种图表类型和 SVG/Canvas/HTML 三种渲染模式,强调可定制性和视觉表现力,是目前 React 图表库中唯一开箱即满足 WCAG 2.1 AA 无障碍标准的库。

Nivo

基于 React 的丰富数据可视化组件库,提供 30+ 种精美图表类型,支持 SVG、Canvas 和 HTML 三种渲染模式。

技术简介说明

Nivo 是一个功能极为丰富的 React 数据可视化组件库,由 Raphaël Benitte 于 2017 年创建。其最大特色是提供超过 30 种图表类型(从基础的折线图、柱状图到 Sankey、Chord、Icicle 等高级可视化),同时支持 SVG、Canvas 和 HTML 三种渲染引擎,让开发者可根据数据量和场景需求灵活选择渲染方式。

Nivo 的设计理念强调「可定制性」和「视觉表现力」。每个图表组件都提供丰富的配置项,涵盖动画、主题、交互、无障碍等方面。其交互式 Playground 允许开发者在线实时调整参数并即时预览效果,大幅降低了调试成本。Nivo 是目前 React 图表库中唯一开箱即满足 WCAG 2.1 AA 无障碍标准的库,这在企业级应用中是重要优势。

作为一个个人开源项目,Nivo 由 Raphaël Benitte 独立维护(关联 Devographics 组织),通过 Open Collective 接受社区赞助。2025 年项目保持高度活跃,4–5 月期间密集发布了 10 个版本(v0.92.0 → v0.99.0),涵盖 React 19 支持、TypeScript 升级、模块化改进等重要更新。

基本信息

  • 官网https://nivo.rocks
  • GitHubhttps://github.com/plouc/nivo
  • License:MIT
  • 最新版本:v0.99.0(2025 年 5 月 23 日)
  • 主要维护者:Raphaël Benitte(GitHub: plouc)/ Devographics 组织
  • npm 周下载量:~650,000
  • GitHub Stars:~14,000
  • 包体积:按模块安装,单图表包约 30-80KB (gzipped)

快速上手

安装

Nivo 采用模块化设计,每个图表类型是独立的 npm 包,按需安装:

# 核心包(所有图表的公共依赖)
pnpm add @nivo/core
 
# 按需安装所需图表
pnpm add @nivo/bar @nivo/line @nivo/pie
 
# 其他常用模块
pnpm add @nivo/tooltip    # 自定义 Tooltip
pnpm add @nivo/legends    # 图例工具
pnpm add @nivo/scales     # 比例尺工具
pnpm add @nivo/theming    # 主题系统(v0.92.0+ 独立模块)
 
# 或者安装完整包(包含所有图表)
pnpm add @nivo/bar @nivo/line @nivo/pie @nivo/sankey @nivo/heatmap @nivo/chord @nivo/circle-packing @nivo/treemap @nivo/radar @nivo/scatterplot @nivo/funnel @nivo/bump @nivo/waffle @nivo/swarmplot @nivo/radial-bar @nivo/parallel-coordinates @nivo/calendar @nivo/canvas @nivo/annotations @nivo/axes @nivo/colors @nivo/scales @nivo/arcs @nivo/tooltip @nivo/legends @nivo/text @nivo/voronoi @nivo/network @nivo/sunburst @nivo/stream @nivo/marimekko @nivo/mizu @nivo/rects @nivo/sankey-v2 @nivo/icicle

推荐按需安装,避免 bundle 体积膨胀。

基础配置

Nivo 无需全局配置,但可以通过 Theme 对象统一控制所有图表的视觉风格:

// 全局主题配置
const theme = {
  background: 'transparent',
  textColor: '#333',
  fontSize: 11,
  axis: {
    domain: { line: { stroke: '#777', strokeWidth: 1 } },
    ticks: { line: { stroke: '#777', strokeWidth: 1 } },
    legend: { text: { fontSize: 12, fill: '#333' } },
  },
  grid: { line: { stroke: '#ddd', strokeDasharray: '3 3' } },
  legends: { text: { fontSize: 11, fill: '#333' } },
  tooltip: {
    container: {
      background: '#ffffff',
      color: '#333',
      boxShadow: '0 2px 8px rgba(0,0,0,0.15)',
    },
  },
}

最小示例

import { ResponsiveBar } from '@nivo/bar'
 
const data = [
  { country: 'AD', hot: 20, cold: 4, sand: 3 },
  { country: 'AE', hot: 12, cold: 8, sand: 15 },
  { country: 'AF', hot: 18, cold: 5, sand: 7 },
  { country: 'AG', hot: 10, cold: 10, sand: 5 },
  { country: 'AI', hot: 8, cold: 14, sand: 2 },
]
 
export default function BarChartExample() {
  return (
    <div style={{ height: 400 }}>
      <ResponsiveBar
        data={data}
        keys={['hot', 'cold', 'sand']}
        indexBy="country"
        margin={{ top: 40, right: 130, bottom: 40, left: 60 }}
        padding={0.3}
        colors={{ scheme: 'nivo' }}
        axisBottom={{
          tickSize: 5,
          tickPadding: 5,
          tickRotation: 0,
        }}
        labelSkipWidth={12}
        labelSkipHeight={12}
        legends={[
          {
            dataFrom: 'keys',
            anchor: 'bottom-right',
            direction: 'column',
            translateX: 120,
            itemWidth: 100,
            itemHeight: 20,
          },
        ]}
        animate={true}
      />
    </div>
  )
}

核心概念与架构

模块化架构

Nivo 采用高度模块化的 monorepo 架构,每个图表类型和工具集都是独立的 npm 包:

@nivo/
├── core           # 核心工具(主题、渲染、动画基础)
├── theming        # 独立主题系统(v0.92.0+)
├── colors         # 颜色工具(色板、渐变、图案)
├── scales         # 比例尺工具(线性、对数、时间等)
├── axes           # 坐标轴组件
├── legends        # 图例工具
├── tooltip        # Tooltip 基础组件
├── annotations    # 标注工具
├── text           # 文本渲染工具
├── voronoi        # Voronoi 图工具
├── arcs           # 弧形路径工具
├── canvas         # Canvas 渲染工具
├── network        # 网络/关系图
│
├── bar            # 柱状图(SVG / Canvas)
├── line           # 折线图(SVG)
├── pie            # 饼图(SVG / Canvas)
├── sankey         # 桑基图
├── chord          # 弦图
├── heatmap        # 热力图(SVG / Canvas)
├── circle-packing # 圆形打包图
├── treemap        # 矩形树图
├── radar          # 雷达图
├── scatterplot    # 散点图
├── funnel         # 漏斗图
├── bump           # Bump 图(排名变化)
├── waffle         # 华夫图
├── swarmplot      # 群聚图
├── radial-bar     # 径向柱图
├── parallel-coordinates # 平行坐标图
├── calendar       # 日历图
├── sunburst       # 旭日图
├── stream         # 河流图
├── marimekko      # Marimekko 图
├── icicle         # Icicle 图(v0.94.0+)
├── rects          # 矩形工具
└── mizu           # Mizu 图

三种渲染引擎

Nivo 的核心差异化特性是提供三种渲染模式,每种模式各有适用场景:

渲染模式组件后缀特点适用场景
SVG默认完整交互性、CSS 样式控制、动画支持、可访问性最佳中小数据量、需要交互
Canvas*Canvas 后缀高性能、GPU 加速、支持 100,000+ 数据点大数据量、实时数据
HTML*HTML 后缀基于 DOM、支持 SSR、可使用 HTML/CSS 样式SSR 场景、需要 CSS 动画
// 同一图表,三种渲染方式
import { Bar } from '@nivo/bar'            // SVG 版
import { ResponsiveBarCanvas } from '@nivo/bar'  // Canvas 版
import { BarHTML } from '@nivo/bar'        // HTML 版(如支持)

动画系统

Nivo 使用 react-spring 作为动画引擎,所有图表组件默认支持平滑过渡动画:

<ResponsiveBar
  data={data}
  animate={true}              // 启用动画
  motionConfig="gentle"       // 动画配置:'gentle' | 'wobbly' | 'stiff' | 'slow'
  transitionConfig={(spring) => ({ ...spring })}  // 自定义 spring 配置
/>

v0.98.0 升级了 react-spring 版本以支持 React 19。

主题系统

Nivo 提供完整的主题系统,从 v0.92.0 开始拆分为独立的 @nivo/theming 包:

import { ThemeProvider } from '@nivo/theming'
 
const customTheme = {
  // 全局主题配置
}
 
function App() {
  return (
    <ThemeProvider theme={customTheme}>
      {/* 所有内部图表自动继承主题 */}
      <MyChart />
    </ThemeProvider>
  )
}

核心特性

  • 30+ 种图表类型:从基础图表到 Sankey、Chord、Icicle、Bump、Waffle 等高级可视化,种类远超同类库
  • 三种渲染模式:SVG(交互)、Canvas(性能)、HTML(SSR),按数据量灵活选择
  • 精美动画:基于 react-spring 的 spring-based 动画,数据变化时自动平滑过渡
  • WCAG 2.1 AA 无障碍:React 图表库中唯一开箱满足无障碍标准的库,内置 ARIA labels 和键盘导航
  • 交互式 Playground:在线可视化配置工具,实时调整参数并预览效果,自动生成代码
  • 全面主题系统:细粒度的主题配置,支持颜色、字体、间距、边框等全方位定制
  • Patterns & Gradients:支持图案填充(pattern)和渐变填充(gradient),增强视觉表现力
  • 响应式设计:每个图表都提供 Responsive* 变体,自动适配容器尺寸
  • TypeScript 完整支持:所有组件提供强类型定义,TypeScript 5.8.3+ 支持
  • HTTP API:可通过 API 服务端生成图表(适合报告生成场景)
  • 模块化安装:按需安装,避免 bundle 膨胀
  • SSR 支持:支持 Isomorphic / Server-side rendering(HTML 渲染模式)

生态图

关键依赖

依赖用途
react-spring动画引擎
d3-scale比例尺计算
d3-shape图形路径生成
d3-color颜色处理
d3-time-format时间格式化
d3-hierarchy层级布局(treemap、sunburst)
d3-sankeySankey 图布局
d3-chordChord 图布局
react-virtualized-auto-sizer响应式尺寸计算
lodash工具函数(v0.95.0 修复了依赖)

社区生态

资源说明
Playgroundnivo.rocks 内置交互式配置工具
GitHub Discussions功能提议、问答交流
Discord社区 Discord 频道
Open Collectiveopencollective.com/nivo 赞助支持
第三方组件社区贡献的额外图表类型和工具

相关工具

工具说明
nivo-api服务端图表生成 API(Docker 部署)
storybookNivo 使用 Storybook 管理组件示例
chromatic视觉回归测试

适用场景

  • 营销展示页面:Nivo 的精美动画和视觉效果最适合需要「好看」图表的场景,如品牌数据展示、年度报告页
  • 多样化数据仪表盘:30+ 种图表类型覆盖从基础到高级的所有需求,一个库解决所有可视化需求
  • 无障碍要求严格的项目:唯一开箱满足 WCAG 2.1 AA 标准的 React 图表库,适合政府、教育、医疗等合规场景
  • 大数据量可视化:Canvas 渲染模式支持 100,000+ 数据点流畅渲染,适合实时监控和大规模数据展示
  • SSR/SSG 项目:HTML 渲染模式支持服务端渲染,适合 Next.js 等框架的 SEO 友好图表页
  • 需要高级图表类型的项目:Sankey(流量分析)、Chord(关系可视化)、Bump(排名变化)、Icicle(层级数据)等专业图表
  • 数据产品原型快速搭建:Playground 工具允许非开发者快速调整和预览图表效果

开发与工程化

开发流程

# 克隆仓库
git clone https://github.com/plouc/nivo.git
cd nivo
 
# 安装依赖
pnpm install
 
# 启动 Storybook 开发环境
pnpm storybook
 
# 运行测试
pnpm test
 
# 类型检查
pnpm typecheck
 
# 构建所有包
pnpm build

构建配置

Nivo 使用 monorepo 架构(Turborepo),每个包独立构建和发布:

packages/
├── bar/           → @nivo/bar
├── line/          → @nivo/line
├── pie/           → @nivo/pie
├── core/          → @nivo/core
├── theming/       → @nivo/theming
└── ...            → 30+ packages

每个包输出 ES Module 和 CommonJS 格式,支持 tree-shaking。

工程化最佳实践

  1. 按需安装:只安装实际使用的图表包,避免 bundle 膨胀
  2. 共享主题配置:使用 ThemeProvider 统一管理全局主题
  3. Canvas 渲染大数据:数据量超过 1,000 点时切换到 Canvas 变体
  4. TypeScript 严格模式:利用完整的类型定义避免配置错误
  5. Playground 调试:在 Playground 中调试配置后复制代码到项目中

性能与安全

性能特点

渲染模式数据量帧率适用场景
SVG< 1,000 点流畅交互密集型
SVG1,000-5,000 点一般静态展示
Canvas< 100,000 点流畅大数据量实时展示
Canvas100,000+ 点良好大规模数据可视化
HTML< 500 点流畅SSR 场景

性能优化建议

  1. 大数据量使用 Canvas 变体

    // 数据量 > 1,000 点时切换 Canvas
    import { ResponsiveBarCanvas } from '@nivo/bar'
  2. 关闭不需要的动画

    <ResponsiveBar animate={false} />  // 大数据量时关闭动画
  3. Memoize 数据和配置对象

    const data = useMemo(() => rawData.map(transform), [rawData])
    const theme = useMemo(() => createTheme(), [])
  4. 避免在 legends 中使用过多条目

    // 超过 20 个图例条目时考虑分组或分页
  5. 使用 isInteractive 控制交互

    // 静态展示时关闭交互提升性能
    <ResponsiveBar isInteractive={false} />

安全注意事项

  • SVG 和 Canvas 渲染不直接执行用户代码,XSS 风险较低
  • 自定义 tooltiprenderWrapper 时避免使用 dangerouslySetInnerHTML
  • 颜色配置(colors prop)接受函数,注意避免注入

已知性能瓶颈

  • 多图表页面中,每个图表独立的动画可能导致主线程压力
  • SVG 模式下超过 5,000 个数据点时性能急剧下降
  • ResponsiveContainer 在高频 resize 场景下需要 debounce
  • 复杂主题配置在大量图表实例化时可能影响初始化速度

技术对比

维度NivoRechartsVictoryvisxECharts
图表类型数量30+15+10+原语级20+
渲染模式SVG/Canvas/HTML仅 SVG仅 SVG (Web)SVGCanvas/SVG
无障碍WCAG 2.1 AA ✅一般一般需自建一般
动画质量极佳 (react-spring)良好良好需自建优秀
学习曲线中等(配置多)中等中等
配置复杂度高(props 多)中等低(灵活)
Bundle Size按模块安装~140KB~200KB~100KB~300KB
跨平台❌ 仅 Web❌ 仅 Web✅ Web + RN❌ 仅 Web❌ 仅 Web
SSR 支持✅ (HTML 模式)一般一般
Playground✅ 优秀✅ 基础✅ 优秀

选型建议

  • 需要精美视觉效果 → Nivo(动画和主题系统最出色)
  • 快速搭建后台图表 → Recharts(学习成本最低)
  • 无障碍合规要求 → Nivo(唯一满足 WCAG 2.1 AA)
  • 超大规模数据集 → Nivo Canvas 变体 / ECharts
  • Web + React Native → Victory
  • 极致自定义 → visx
  • 需要高级图表类型(Sankey、Chord 等) → Nivo

最佳实践

生产环境推荐模式

  1. 统一主题管理

    // themes/chart-theme.ts
    export const chartTheme = {
      background: 'transparent',
      textColor: 'var(--text-primary)',
      // ...
    }
     
    // app.tsx
    import { ThemeProvider } from '@nivo/theming'
    <ThemeProvider theme={chartTheme}>
      <App />
    </ThemeProvider>
  2. 大数据量自动降级

    function SmartBarChart({ data }) {
      const useCanvas = data.length > 1000
      const Component = useCanvas ? ResponsiveBarCanvas : ResponsiveBar
      return <Component data={data} /* ... */ />
    }
  3. Playground 配置导出

    // 在 Playground 中调试好配置后,导出为代码
    // nivo.rocks → 配置完成 → 复制代码
  4. 图表懒加载

    // 使用 React.lazy 延迟加载非首屏图表
    const SankeyChart = lazy(() => import('./charts/SankeyChart'))

常见陷阱

陷阱说明解决方案
配置项过多Nivo 的 props 数量远超 Recharts使用默认值 + 只覆盖必要配置
Canvas 版不支持某些特性Canvas 版缺少部分 SVG 交互查看文档确认 Canvas 版支持范围
动画与 SSR 冲突动画在 SSR 环境可能导致不匹配SSR 场景使用 animate=&#123;false&#125;
主题嵌套覆盖深层嵌套组件主题不生效使用 ThemeProvider 统一注入
包体积膨胀安装过多模块按需安装,使用 bundle analyzer 检查
Responsive 尺寸问题父容器未设置明确高度确保父容器有 height 或使用 style=&#123;&#123; height: 400 &#125;&#125;

技术局限与边界

已知限制

  1. 无 v1.0 发布计划:目前仍在 0.x 版本阶段,API 可能存在 breaking changes
  2. 个人维护风险:项目高度依赖 Raphaël Benitte 个人投入,长期可持续性存在不确定性
  3. 配置复杂度高:组件 props 数量多,简单图表也需要较多配置
  4. Canvas 版功能不全:Canvas 变体缺少部分 SVG 版的交互和样式功能
  5. 不支持 React Native:仅限 Web 使用
  6. 文档不够完善:部分高级功能缺少详细文档,需要 trial & error 或阅读源码
  7. 社区规模中等:相比 Recharts(900 万周下载量),社区资源和第三方教程较少

不适用场景

  • 极简图表需求:如果只需要简单的柱状图/折线图,Recharts 更轻量
  • React Native 跨平台:需选择 Victory
  • 需要 D3 级别底层控制:考虑 visx 或 D3 直接使用
  • 非 React 项目:Nivo 是 React 专属库,非 React 项目选择 ECharts / Chart.js

迁移注意事项

  • 从 Recharts 迁移:数据格式兼容(都是对象数组),但组件 API 完全不同,需要重写
  • 从 Nivo 0.8x 升级到 0.9x:v0.92.0 引入 @nivo/theming 独立模块,需检查主题配置兼容性
  • 迁移到其他库:数据层迁移成本低,组件层需重写
  • Canvas ↔ SVG 切换:同一图表类型的 SVG 和 Canvas 版 API 基本一致,切换成本较低

学习资源

  • 官方文档与 Playgroundhttps://nivo.rocks(最佳学习入口,交互式配置工具)
  • GitHub 仓库https://github.com/plouc/nivo
  • GitHub Discussions:功能提议和问答交流
  • Discord 社区:实时交流和求助
  • Open Collectiveopencollective.com/nivo(赞助支持)
  • Storybook 示例:本地 pnpm storybook 查看组件示例
  • 博客文章:Raphaël Benitte 在 Medium / Twitter 分享的设计思路
  • YouTube 教程:搜索 "Nivo React" 有视频教程

2026 年现状

最新版本

  • v0.99.0(2025 年 5 月 23 日):当前最新版本
  • 2025 年 4-5 月密集发布了 v0.92.0 → v0.99.0 共 10 个版本
  • 仍处于 0.x 版本阶段,无 v1.0 发布计划

近期重要更新

版本主要变更
v0.99.0@nivo/bar 调整、scales guide 改进
v0.98.0升级 react-spring 支持 React 19
v0.97.0使用 react-virtualized-auto-sizer 改进响应式
v0.96.0多个图表支持 ref 引用
v0.95.0Icicle 图 a11y 改进、lodash 依赖修复
v0.93.0TypeScript 5.8.3、ESLint 升级
v0.92.0引入 @nivo/theming 独立模块

发展趋势

  1. React 19 兼容:已通过 v0.98.0 实现
  2. TypeScript 持续改进:升级到 5.8.3,类型定义不断完善
  3. 无障碍加强:持续改进各图表的 a11y 支持
  4. 模块化深化:将更多功能拆分为独立模块
  5. 社区功能请求:CandleStick、Word Cloud 等图表在讨论中

社区活跃度

  • GitHub Stars ~14,000
  • npm 周下载量 ~650,000
  • Open Issues ~37 个(维护积极)
  • 2025 年保持密集的版本发布节奏
  • 多个 2026 年横评文章推荐 Nivo(LogRocket、PkgPulse、Querio.ai 等)

风险评估

  • 个人项目风险:高度依赖单一维护者,如果维护者无法继续投入,项目可能停滞
  • 版本稳定性:0.x 版本意味着 API 可能在未来出现 breaking changes
  • 企业使用建议:锁定版本、关注更新、必要时做好 fork 准备