すべてのプロダクト
Search
ドキュメントセンター

Quick BI:完全な例: EChartsチャートを作成する

最終更新日:Jan 21, 2025

このトピックでは、Quick BI で ECharts を使用して、丸みを帯びたリングチャートのカスタムウィジェットを開発する方法について説明します。

チャート例

效果图詳細なコードについては、「完全なコード例」をご参照ください。

ステップ 1: プロジェクトを作成する

  1. カスタムウィジェットプロジェクトを作成し、依存関係をインストールして初期化します。

    詳細については、「はじめに」をご参照ください。

    npm init qbi-app myEcharts
    cd myEcharts
    yarn
  2. 下の図に示すように、またはQuick BI 国際コンソールでウィジェットを登録します。

    image

    説明

    開発モードで [プロフェッショナルモード] を選択します。

    オンライン編集チュートリアルについては、「チュートリアル: オンライン編集モードで ECharts コードをすばやく挿入する」をご参照ください。

  3. ECharts をインストールします。

    1. 次のコマンドを実行して、ECharts タイプ定義をインストールします。

      yarn add -D @types/echarts
    2. 次のいずれかの方法で ECharts をインストールします。

      • サードパーティ CDN の導入: この方法により、読み込みパフォーマンスが向上します。

        カスタムウィジェットのサードパーティライブラリの依存関係を含めるには、指定されたフィールドに echarts CDN アドレスを入力します。詳細については、「参照ドキュメント」をご参照ください。

        image

        プロジェクトのルートディレクトリにある webpack.config.js を構成し、externals 構成を追加します。

         // webpack.config.js
         externals: {
            lodash: '_',
            react: 'React',
            'react-dom': 'ReactDOM',
            moment: 'moment',
            echarts: 'echarts', // 新しい項目を追加する
          },
      • npm インストール: npm または yarn を使用してインストールします。

        yarn add echarts
  4. ウィジェット管理リストで、ターゲットウィジェットを見つけて、[デバッグ] アイコンをクリックします。

    image

    システムはデバッグのために対応するダッシュボードに自動的にリダイレクトします。詳細については、「ウィジェットのデバッグ」をご参照ください。

ステップ 2: meta を構成する

Meta 構成には、データパネルとスタイルパネルの設定が含まれます。

データパネルの構成

meta.tsdataSchema をカスタマイズして、チャートがデータをどのように取得するかを定義します。多くの場合、テンプレートベースのプロジェクトで提供される meta を変更できます。一般的な変更点は次のとおりです。

  • areaName: フィールドの表示名

  • required: フィールドが必須かどうか

  • maxColumn: 含めることができるフィールドの最大数

1 つのディメンションと 3 つのメジャーを表示するには、対応する maxColumn を調整するだけです。次に例を示します。

// meta.ts
const componentMeta: Interfaces.ComponentMeta = {
  propsSchema: {
    dataSchema: {
      areas: [
        {
          id: "drill",
          name: "ドリル/ディメンション",
          queryAxis: "drill",
          rule: {
            fieldTypes: ["dimension"],
            required: false, // チャートの更新に必要なフィールドかどうか
            /** 数を制限する */
            maxColNum: 3,
          },
        },
        {
          id: "area_row",
          name: "ディメンション",
          queryAxis: "row",
          rule: {
            fieldTypes: ["dimension"],
            maxColNum: 1, // 許可されるフィールドの最大数
            required: true, // アイコンの更新に必要なフィールドかどうか
          },
        },
        {
          id: "area_column",
          name: "メジャー",
          queryAxis: "column",
          rule: {
            fieldTypes: ["dimension", "measure"],
            maxColNum: 3, // 許可されるフィールドの最大数
            required: true, // アイコンの更新に必要なフィールドかどうか
          },
        },
        {
          id: "filters",
          name: "フィルター", // 名前
          queryAxis: "filters",
          rule: {
            fieldTypes: ["dimension", "measure"],
            required: false,
          },
        },
      ],
      resultDisplay: {
        /** 行数を制限する */
        upLimit: 1000,
      },
    },
  },
};
                

以下に示すように、データパネルを作成できます。Configuration Panel 詳細な構成手順については、dataSchema を参照してください。詳細については、「参照ドキュメント」をご参照ください。

スタイルパネルの構成

styleSchema は、スタイルパネルの構成を定義します。これは、特定のシナリオに合わせてカスタマイズできます。この例のスタイルパネルの要件は次のとおりです。

  • 凡例を表示するか非表示にするかを選択できます。

  • 開始角度を数値で指定できます。

要件を分析すると、checkboxnumber エディターを定義する必要があることが明らかになります。したがって、styleSchema 内で、type: 'switch'type: 'number' を設定します。(現在サポートされているエディターのリストについては、「schema.type」をご参照ください。)

const componentMeta: Interfaces.ComponentMeta = {
  propsSchema: {
    styleSchema: {
      schema: {
        type: 'object',
        className: 'tabs-uischema-container',
        props: { mode: 'collapse' },
        properties: {
          // ここに必要なカスタムプロパティを入力します
          display: {
            type: 'object',
            title: '表示設定',
            properties: {
              showLegend: {
                type: 'switch',
                id: 'showLegend',
                defaultValue: true,
                props: {
                  mode: 'checkbox',
                  label: '凡例を表示',
                },
              },
              startAngle: {
                title: '開始角度',
                id: 'startAngle',
                type: 'number',
                defaultValue: 0,
                props: {
                  placeholder: '開始角度を入力してください',
                  maxLength: 140,
                },
              },
            },
          },
        },
      },
    },
  },
};

この段階では、スタイルパネルはこれらの 2 つのエディターを自動的に生成します。カスタムウィジェット内の customProps.viewConfig から、エディターに入力された値を取得できます。

ステップ 3: echarts チャートを開発する

チャートを開発するには、setOption(option) メソッドを呼び出す必要があります。以下は、Quick BI からのプロパティを echarts が受け入れることができるパラメーターに変換する方法のガイダンスです。

  1. ECharts インスタンスを初期化します。

    mount メソッドでは、echarts インスタンスを作成できます。

        // src/component.ts
      mount(props: Interfaces.LifecycleProps<Interfaces.ComponentProps>) {
        // ...
        this.chart = echarts.init(props.container as HTMLDivElement);
        this.setOption(props);
      }
  2. データを変換します。

    マウントフェーズと更新フェーズで呼び出しを容易にするために、setOption メソッドをカプセル化します。

    customProps.data は 2 次元配列です。customProps.data[i] はデータベーステーブルのデータの行を表し、各行には構成されたディメンションフィールドとメジャーフィールドに対応する値が含まれます。

    customProps.data[i][j] は、データベーステーブルのセルの値を表します。データ構造については、「カスタムウィジェット API」をご参照ください。fieldId は、ディメンションとメジャーのフィールド ID です。

    fieldId から配列インデックスへのマップを作成して、fieldId を介して値を簡単に取得できるようにします。

    // src/component.ts
        setOption(props: Interfaces.LifecycleProps<Interfaces.ComponentProps>) {
        // チャートデータ
        const data = props.customProps.data;
        // データパネルの形式設定
        const fieldSettingMap = props.customProps.viewConfig.fieldSettingMap;
        // データの最初の行
        const [firstRow] = data;
        // 各データ行の位置は固定されています。配列インデックスと fieldId の間のマッピング関係を確立することにより、fieldId を介して値を取得するのが便利です。
        const fieldColumnIndexMap: {
          [key: string]: number;
        } = firstRow.reduce(
          (prev, curr, i: number) => ({
            ...prev,
            [curr.fieldId]: i,
          }),
          {},
        );
        }
  3. シリーズを構成します。

    データパネルで設定されたディメンションフィールドとメジャーフィールドのシリーズ設定を取得するには、customProps.dataConfig を使用します。

    // src/component.ts
        setOption(props: Interfaces.LifecycleProps<Interfaces.ComponentProps>) {
            // ... data
        // すべてのメジャーをフィルターで除外する
        const columnsFields = props.customProps.dataConfig.find(each => each.areaType === 'column')?.fields ?? [];
        // データパネルデータ形式設定
        const fieldSettingMap = props.customProps.viewConfig.fieldSettingMap;
        // 形式を変換する
        const series = columnsFields.map((each, i) => {
          const filedSetting = fieldSettingMap[each.fieldId];
          return {
            id: each.fieldId,
            type: 'bar',
            // fieldId と配列インデックスのマッピングに従って、各行のデータ値
            data: data.map(row => row[fieldColumnIndexMap[each.fieldId]]?.value),
              coordinateSystem: 'polar',
              // エイリアスを設定する
              name: filedSetting?.aliasName ?? each.showName,
          };
        });
        // ...
        this.chart.setOption({
          series,
          // ...
        });
        }
  4. 丸みを帯びたリングチャートは 1 つのディメンションしか受け入れないため、最初のディメンションを取得してカテゴリを設定します。

    カテゴリを指定します。丸みを帯びたリングチャートは 1 つのディメンションしか受け入れないため、最初のディメンションを選択します。

    // src/component.ts
        setOption(props: Interfaces.LifecycleProps<Interfaces.ComponentProps>) {
        // すべてのメジャーをフィルターで除外する
        const rowFields = props.customProps.dataConfig.find(each => each.areaType === 'row')?.fields ?? [];
        // メタは 1 つのディメンションのみを制限します
        const [onlyRow] = rowFields;
        const category = data.map(row => row[fieldColumnIndexMap[onlyRow?.fieldId]]?.value);
        // ...
        this.chart.setOption({
          radiusAxis: {
            type: 'category',
            data: category,
            z: 10,
          },
          // ...
        });
        }
  5. スタイルパネルの設定を確認します。

    スタイルパネルで設定されたフォームの値は、customProps.viewConfig を使用して取得できます。たとえば、チェックボックスエディターのフォーム名は showLegend で、数値入力ボックスのフォーム名は startAngle です。どちらも表示カテゴリにあるため、customProps.viewConfig.display?.showLegend を介してアクセスできます。

    // src/component.ts
        setOption(props: Interfaces.LifecycleProps<Interfaces.ComponentProps>) {
        const showLegend = props.customProps.viewConfig.display?.showLegend;
            const startAngle = props.customProps.viewConfig.display?.startAngle;
        // echarts を設定する
        this.chart.setOption({
          angleAxis: {
            startAngle,
          },
          legend: {
            show: viewConfig.display?.showLegend,
            data: legend,
            top: 10,
            padding: 0,
          },
          // ...
        });
        }
  6. ドリルダウン、フィルターの相互作用、ジャンプなどの効果を作成します。

    Quick BI は、ドリルダウン、フィルターの相互作用、ジャンプなどのアクションを実行できる customProps.dispatch メソッドを提供します。dataIndex は、customProps.data 内に表示されるディメンションの配列インデックスを指します。

    // component.ts
        const dispatch = props.customProps.dispatch;
        if (typeof dispatch === 'function') {
          // ドリルダウン/フィルターの相互作用/ジャンプイベント
          echarts.on('click', (serie: any) => {
            dispatch({
              type: 'select',
              payload: {
                dataIndex: serie.dataIndex, // dataIndex は、クリックされた行の data 内の配列インデックスです
              },
            });
          });
          // 空白のクリックイベント。モバイルドリルダウンに適応するために使用されます
          echarts.getZr().on('click', function (e) {
            if (!e.target) {
              dispatch({
                type: 'cancelSelect',
              });
            }
          });
        }

これらの手順を完了すると、チャートが表示されます。必要に応じて、スタイルを変更し、データ形式を調整します。詳細については、「完全なコード例」のコメントをご参照ください。

ステップ 4: パッケージング

開発が完了したら、カスタムウィジェットをパッケージ化します。

npm run pack

出力は build フォルダにあります。カスタムウィジェットプラットフォームからこれをアップロードして、ウィジェットを公開できます。

imageパッケージ化と公開の詳細については、「Quick BI でのウィジェットのパッケージ化と公開」をご参照ください。