bizchart图表封装之多条折线图

多条折线图:

         顾名思义,有多条折线

封装:

   数据源、坐标轴、是否显示坐标轴标题、横纵坐标范围限定、自定义图例及颜色

注意:

     1、代码使用TypeScript实现

     2、本次代码实现的均是曲线折线图,若只想是折线图,将去掉  中的shape="smooth"即可,即默认是折线图,增加shape="smooth"可将其变为曲线折线;

    3、数据源data最好处理成类似{type:'type',name:'name',value:'value'}这种格式,不需要使用transform,就可以直接使用

代码:

import React from 'react';
import { Chart, Geom, Axis, Tooltip, Legend } from 'bizcharts';

/**
 *分组折线图
 */
interface ICurvedProps {
  data: any; // 数据源
  xAxis: string; // x轴坐标
  yAxis: string; // y轴坐标
  showTitle?: boolean; // 是否显示坐标轴的title
  titleOffset?: number | undefined;
  xNickName?: string;
  yNickName?: string;
  legendName: string; // 图例对应的变量
  color?: string[];
  yRang?: number[]; // 限定y轴的数据范围
  format?: string; // 格式化文本内容--单位  比如 m 、kg、%
}
const Curved: React.FC = props => {
  const {
    data,
    xAxis,
    yAxis,
    showTitle,
    xNickName,
    yNickName,
    legendName,
    color,
    yRang,
    format,
  } = props;
  const cols: {
    [key: string]: { [key: string]: string | number | string[] | number[] | any };
  } = {};
  cols[xAxis] = {
    alias: showTitle && xNickName ? xNickName : xAxis,
  };
  cols[yAxis] = {
    min: 0,
    alias: showTitle && yNickName ? yNickName : yAxis,
    formatter: (val: number): number | string => {
      if (format && val > 0) {
        return `${val}${format}`;
      }
      return val;
    }, // 格式化文本内容,会影响到轴的label格式;
  };
  if (yRang) {
    cols[yAxis].ticks = yRang;
  }
  /* 坐标轴字体样式 */
  const axisLabelStyle: G2.AxisLabel = {
    textStyle: {
      fill: '#FFFFFF', // 文本的颜色
    },
  };
  return (
    
{showTitle ? ( ) : ( )} {showTitle ? ( ) : ( )}
); }; export default Curved;

如果数据多了,显示不下怎么办?

    带滚动条的多条曲线折线图:

       思考:滚动条的数据条数和折线图的数据条数一样吗?

import React from 'react';
import { Chart, Geom, Axis, Tooltip, Legend } from 'bizcharts';
import DataSet from '@antv/data-set';
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
// @ts-ignore
import Slider from 'bizcharts-plugin-slider';
/**
 *分组折线图
 */
interface ISliderCurvedProps {
  data: any; // 数据源
  sliderData: any[]; // 滚动条数据源
  xAxis: string; // x轴坐标
  yAxis: string; // y轴坐标
  showTitle?: boolean; // 是否显示坐标轴的title
  titleOffset?: number | undefined;
  xNickName?: string;
  yNickName?: string;
  legendName: string; // 图例对应的变量
  color?: string[];
  yRang?: number[]; // 限定y轴的数据范围
  format?: string; // 格式化文本内容--单位  比如 m 、kg、%
  max: number; // 多长以后出现滚动条
}
const SliderCurved: React.FC = props => {
  const {
    data,
    sliderData,
    xAxis,
    yAxis,
    showTitle,
    xNickName,
    yNickName,
    legendName,
    color,
    yRang,
    format,
    max,
  } = props;
  const cols: {
    [key: string]: { [key: string]: string | number | string[] | number[] | any };
  } = {};
  cols[xAxis] = {
    alias: showTitle && xNickName ? xNickName : xAxis,
  };
  cols[yAxis] = {
    min: 0,
    alias: showTitle && yNickName ? yNickName : yAxis,
    formatter: (val: number): number | string => {
      if (format && val > 0) {
        return `${val}${format}`;
      }
      return val;
    }, // 格式化文本内容,会影响到轴的label格式;
  };
  if (yRang) {
    cols[yAxis].ticks = yRang;
  }
  /* 坐标轴字体样式 */
  const axisLabelStyle: G2.AxisLabel = {
    textStyle: {
      fill: '#FFFFFF', // 文本的颜色
    },
  };
  const len = sliderData.length;
  let ds: any;
  let dv: any;
  if (len > max) {
    const startLength = 0;
    const endLength = max - 1;
    ds = new DataSet({
      state: {
        start: sliderData[startLength][xAxis],
        end: sliderData[endLength][xAxis],
      },
    });
  } else {
    ds = new DataSet({
      state: {
        start: '',
        end: '',
      },
    });
  }
  // eslint-disable-next-line prefer-const
  dv = ds.createView().source(data);
  if (len > max) {
    dv.transform({
      type: 'filter',
      // eslint-disable-next-line consistent-return
      callback: (obj: any) => {
        if (len > max) {
          // 获取开始节点的下标值
          const { start } = ds.state;
          const startIndex = sliderData.findIndex((value: any) => value[xAxis] === start);
          // 获取末尾节点下标值
          const { end } = ds.state;
          const endIndex = sliderData.findIndex((value: any) => value[xAxis] === end);
          if (startIndex > -1 && endIndex > -1) {
            const filterData = sliderData.slice(startIndex, endIndex + 1);
            const filterIndex = filterData.findIndex((value: any) => value[xAxis] === obj[xAxis]);
            if (filterIndex > -1) {
              return obj;
            }
          }
        } else {
          return obj;
        }
      },
    });
  }
  function onChange(obj: any) {
    const { startValue, endValue } = obj;
    ds.setState('start', startValue);
    ds.setState('end', endValue);
  }
  return (
    
{showTitle ? ( ) : ( )} {showTitle ? ( ) : ( )} {sliderData.length > max ? ( ) : ( '' )}
); }; export default SliderCurved;

 

你可能感兴趣的:(bizchart)