ツリーマップライブラリ比較

5つの人気ライブラリで階層データの構成比を面積で表示し、実装方法とスタイルを比較

1. Recharts

RechartsのTreemapコンポーネントで階層データをそのまま渡すだけで面積比のタイル表示を実現。contentプロパティにカスタムコンポーネントを渡すことでセル内のラベルや色を自由にカスタマイズ可能。aspectRatioで縦横比の調整もできる。

✓ Treemap標準搭載✓ 宣言的API✓ カスタムコンテンツ

チャートを読み込み中...

特徴: Treemapコンポーネントが標準搭載されており追加パッケージ不要。 contentプロパティでカスタムSVG要素を使い、ラベルや色を自在に制御できる。
tsx
'use client';
import { Treemap, ResponsiveContainer, Tooltip } from 'recharts';

const data = [
  { name: '製品A', size: 4200, fill: '#3b82f6' },
  { name: '製品B', size: 3800, fill: '#10b981' },
  { name: '製品C', size: 2100, fill: '#8b5cf6' },
  { name: '製品D', size: 1500, fill: '#f97316' },
  { name: '製品E', size: 900, fill: '#ec4899' },
];

export function RechartsTreemap() {
  return (
    <ResponsiveContainer width="100%" height={300}>
      <Treemap data={data} dataKey="size" nameKey="name" aspectRatio={4 / 3}>
        <Tooltip formatter={(value) => [`¥${value.toLocaleString()}`, '売上']} />
      </Treemap>
    </ResponsiveContainer>
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、Rechartsを使ったツリーマップを実装してください。

- 使用ライブラリ: recharts の Treemap コンポーネント(dynamic importでSSR無効化)、ResponsiveContainer
- サンプルデータ: ECサイトのカテゴリー別売上(3大カテゴリー・各4子カテゴリーの階層構造)を用意すること
- 階層表示: contentプロパティにカスタムコンポーネントを渡してラベルと色をカスタマイズすること
- インタラクティブ: ホバー時にツールチップでカテゴリー名と売上金額を表示すること
- レスポンシブ: ResponsiveContainerで親要素の幅に応じてチャートサイズが変わるよう対応すること
- カラーリング: カテゴリーごとに色を設定し値の大きさに応じて濃淡をつけること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

2. Nivo

@nivo/treemapパッケージでツリーマップをネイティブサポート。tileプロパティでsquarify・slice・diceなど複数のタイリングアルゴリズムを選択可能。ホバー時のアニメーションやツールチップが標準で充実しており、identityとvalueの指定だけで美しいツリーマップが完成。

✓ D3.jsベース✓ 美しいデザイン✓ インタラクティブ

チャートを読み込み中...

特徴: D3.jsベースで滑らかなアニメーションとホバーインタラクションが標準装備。 tileアルゴリズムの切り替えでレイアウトのバリエーションを簡単に試せる。
tsx
'use client';
import { ResponsiveTreeMap } from '@nivo/treemap';

const data = {
  name: 'root',
  children: [
    { name: '製品A', value: 4200 },
    { name: '製品B', value: 3800 },
    { name: '製品C', value: 2100 },
    { name: '製品D', value: 1500 },
    { name: '製品E', value: 900 },
  ],
};

export function NivoTreemap() {
  return (
    <div style={{ height: 300 }}>
      <ResponsiveTreeMap
        data={data}
        identity="name"
        value="value"
        margin={{ top: 10, right: 10, bottom: 10, left: 10 }}
        colors={{ scheme: 'category10' }}
        borderWidth={2}
        borderColor={{ from: 'color', modifiers: [['darker', 0.5]] }}
        labelSkipSize={12}
      />
    </div>
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、Nivoを使ったツリーマップを実装してください。

- 使用ライブラリ: @nivo/treemap の ResponsiveTreeMap(dynamic importでSSR無効化)
- サンプルデータ: ECサイトのカテゴリー別売上(3大カテゴリー・各4子カテゴリーの階層構造)を用意すること
- 階層表示: identity・valueプロパティで階層構造を自動的に視覚化すること
- tileアルゴリズム: tileプロパティでsquarify・slice・diceなどのタイリングアルゴリズムを選択すること
- インタラクティブ: ホバー時にツールチップでカテゴリー名と売上金額を表示すること
- レスポンシブ: ResponsiveTreeMapで親要素の幅に応じてチャートサイズが変わるよう対応すること
- カラーリング: カテゴリーごとに色を設定し値の大きさに応じて濃淡をつけること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

3. Chart.js (react-chartjs-2)

Chart.jsにはツリーマップの専用タイプはないが、chartjs-chart-treemapプラグインを使用することで実現可能。Canvas描画のためセル数が多くても高いパフォーマンスを維持。keyとgroupsを指定するシンプルな設定でグループ化表示にも対応。

✓ Canvas描画✓ プラグイン対応✓ 高パフォーマンス

チャートを読み込み中...

特徴: chartjs-chart-treemapプラグインをChartJS.registerするだけで利用可能。 フラットなデータをkeyとgroupsで階層化でき、既存Chart.jsプロジェクトへの追加が容易。
tsx
'use client';
import { Chart } from 'react-chartjs-2';
import { Chart as ChartJS, Tooltip, Legend } from 'chart.js';
import { TreemapController, TreemapElement } from 'chartjs-chart-treemap';

ChartJS.register(Tooltip, Legend, TreemapController, TreemapElement);

const rawData = [
  { category: '製品A', value: 4200 },
  { category: '製品B', value: 3800 },
  { category: '製品C', value: 2100 },
  { category: '製品D', value: 1500 },
  { category: '製品E', value: 900 },
];

const data = {
  datasets: [{
    label: '売上構成',
    tree: rawData,
    key: 'value',
    groups: ['category'],
    backgroundColor: (ctx: any) => {
      const colors = ['#3b82f6', '#10b981', '#8b5cf6', '#f97316', '#ec4899'];
      return colors[ctx.dataIndex % colors.length];
    },
    borderWidth: 2,
    borderColor: 'white',
  }],
};

export function ChartJSTreemap() {
  return (
    <Chart type={"treemap" as any} data={data as any}
      options={{ responsive: true, maintainAspectRatio: false }} />
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、Chart.js(chartjs-chart-treemap)を使ったツリーマップを実装してください。

- 使用ライブラリ: chartjs-chart-treemap プラグイン(dynamic importでSSR無効化)、ChartJS.register でTreemapControllerを登録
- サンプルデータ: ECサイトのカテゴリー別売上(3大カテゴリー・各4子カテゴリー)を用意すること
- 階層表示: keyとgroupsプロパティでフラットなデータを階層化して表示すること
- インタラクティブ: ホバー時にツールチップでカテゴリー名と売上金額を表示すること
- レスポンシブ: responsive: true、maintainAspectRatio: falseで親要素に合わせたサイズにすること
- カラーリング: カテゴリーごとに色を設定し値の大きさに応じて濃淡をつけること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

4. ApexCharts (react-apexcharts)

type="treemap"を指定するだけで面積比のタイル表示を実現。distributed: true で各セルに自動的に異なる色が割り当てられる。

✓ ネイティブ対応✓ 自動カラー割り当て✓ シンプルな設定

チャートを読み込み中...

特徴: { x: '製品名', y: 値 } の配列を渡すだけのシンプルな構造。distributed: true で各タイルの色を自動的に差別化できる。
tsx
'use client';
import dynamic from 'next/dynamic';
const Chart = dynamic(() => import('react-apexcharts'), { ssr: false });

export function ApexTreemap() {
  const options = {
    chart: { type: 'treemap' as const, toolbar: { show: false } },
    colors: ['#3b82f6', '#10b981', '#8b5cf6', '#f97316', '#ec4899'],
    dataLabels: { enabled: true, style: { fontSize: '12px' } },
    plotOptions: { treemap: { distributed: true, enableShades: false } },
    tooltip: { y: { formatter: (val: number) => `¥${val.toLocaleString()}` } },
  };
  const series = [{
    data: [
      { x: '製品A', y: 4200 },
      { x: '製品B', y: 3800 },
      { x: '製品C', y: 2100 },
      { x: '製品D', y: 1500 },
      { x: '製品E', y: 900 },
    ],
  }];
  return <Chart type="treemap" options={options} series={series} height={300} width="100%" />;
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、ApexCharts(react-apexcharts)を使ったツリーマップを実装してください。

- 使用ライブラリ: react-apexcharts の Chart コンポーネント(dynamic importでSSR無効化)
- サンプルデータ: 5製品の売上データ(製品A〜E)を用意すること
- データ形式: series配列に { data: [{x: '製品A', y: 4200}, ...] } 形式のオブジェクトを渡すこと
- グラフ設定: type="treemap"、chart.type: "treemap"、toolbar非表示
- カラーリング: plotOptions.treemap.distributed: trueで各セルに異なる色を自動割り当てすること
- ツールチップ: tooltip.y.formatterで「¥XX,XXX」形式で表示すること

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

5. @mantine/charts

Mantine v9.1.0で追加されたTreemapコンポーネント。Mantineのテーマカラーが自動適用され、withTooltipでツールチップが組み込みで動作。フラットな配列を渡すだけで面積比タイル表示を実現する。

✓ Mantineテーマ自動適用✓ ツールチップ組み込み✓ シンプルなAPI

チャートを読み込み中...

特徴: dataKeyで値フィールドを指定し、valueFormatterでツールチップの表示形式をカスタマイズ。Mantineを既に導入済みのプロジェクトなら追加設定なしで使用できる。
tsx
'use client';
import { MantineProvider } from '@mantine/core';
import { Treemap } from '@mantine/charts';
import '@mantine/core/styles.css';
import '@mantine/charts/styles.css';

const data = [
  { name: 'JavaScript', size: 420 },
  { name: 'Python', size: 380 },
  { name: 'TypeScript', size: 290 },
  { name: 'Java', size: 260 },
  { name: 'C#', size: 210 },
  { name: 'Go', size: 160 },
  { name: 'Rust', size: 120 },
  { name: 'Kotlin', size: 90 },
  { name: 'Swift', size: 80 },
  { name: 'Ruby', size: 60 },
];

export function MantineTreemap() {
  return (
    <MantineProvider>
      <Treemap
        data={data}
        dataKey="size"
        height={300}
        withTooltip
        valueFormatter={(v) => `${v} 万人`}
      />
    </MantineProvider>
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、@mantine/chartsを使ったツリーマップを実装してください。

- 使用ライブラリ: @mantine/charts の Treemap コンポーネント(dynamic importでSSR無効化)、MantineProvider でラップ
- インストール: npm install @mantine/charts
- スタイル: @mantine/core/styles.css と @mantine/charts/styles.css を両方インポートすること
- サンプルデータ: プログラミング言語の利用者数(name + size キーのフラット配列)を用意すること
- データ設定: dataKey="size" で値フィールドを指定すること
- ツールチップ: withTooltip={true}、valueFormatter で単位付きフォーマットを指定すること
- 高さ: height={300}

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

ライブラリ比較

ライブラリレンダリングツリーマップ対応タイリング選択おすすめ用途
RechartsSVG◎ 標準搭載Reactアプリ全般
NivoSVG◎ 専用パッケージデザイン重視のダッシュボード
Chart.jsCanvas◯ プラグイン大量データ・高パフォーマンス
ApexChartsSVG◎ ネイティブ対応シンプルなダッシュボード
@mantine/chartsSVG◎ ネイティブ対応Mantine導入済みプロジェクト

選択のポイント

  • Recharts: Treemapが標準搭載されており追加パッケージ不要。contentプロパティで自由なカスタマイズが可能で、Reactプロジェクトへの導入が最も手軽。
  • Nivo: @nivo/treemapで洗練されたデザインと豊富なタイリングアルゴリズムを提供。インタラクションやアニメーションにこだわりたい場合に最適。
  • Chart.js: chartjs-chart-treemapプラグインで対応。既にChart.jsを使用しているプロジェクトへの追加が容易で、大量のセルでもCanvas描画でパフォーマンスが安定。
  • ApexCharts: treemapがネイティブ対応で追加パッケージ不要。{ x, y } 配列を渡すだけのシンプルな構造で、distributed: true で各タイルに色を自動割り当て。手軽に導入したい場合に最適。
  • @mantine/charts: v9.1.0で追加されたTreemapコンポーネント。Mantineのテーマカラーが自動適用され、withTooltip でツールチップが組み込みで動作。Mantineを既に導入済みのプロジェクトに最適。

典型的な使用例

  • 📊売上構成の可視化:カテゴリー・サブカテゴリー別の売上シェアを面積で直感的に把握
  • 💰ポートフォリオ分析:資産クラス・銘柄別の保有比率を一覧表示
  • 💾ストレージ使用量:フォルダ・ファイル別のディスク使用量を階層的に可視化
  • 🌍市場シェア分析:業界・企業別の市場占有率を面積で比較

⚠️ 使用時の注意点

  • 面積の小さいセルはラベルが読みにくくなるため、最小サイズ以下のカテゴリーは「その他」にまとめることを検討する
  • 階層が深すぎると視認性が低下するため、2〜3階層程度に抑えるのが望ましい
  • 色の使い方が重要で、同じカテゴリーグループは同系色にするなど視覚的なグルーピングを意識する
  • 正確な値の比較には棒グラフの方が適しており、ツリーマップは全体の構成把握に向いている

ツリーマップは、階層データを入れ子の矩形で表現するグラフ。各矩形の面積がデータの大きさを表し、色で分類を示す。

ディスク使用量の内訳・ポートフォリオの資産構成・組織の人員構成など、階層的なデータの構成比を可視化する場面で使われる。

主なバリエーション
  • フラット型(1階層)
  • 階層型(ドリルダウン)
  • カラーグラデーション型
  • ラベル付き型
  • インタラクティブ型(クリックで展開)

📊 使用しているサンプルデータ(クリックで表示)

ECサイトのカテゴリー別売上(大カテゴリー3つ、各カテゴリーに子カテゴリーを持つ階層構造)のデータを使用しています。

関連する逆引きリファレンス