BizCharts柱状图、折线图混合展示数据

代码

import React, { useState } from "react";
import {
  Axis,
  Chart,
  Tooltip,
  Interval,
  View,
  Line,
  Legend,
  Point,
  getTheme,
} from "bizcharts";

const theme = getTheme();

const data = [
  {
    name: "orderCount",
    date: "2021-07-23",
    value: 150,
  },
  {
    name: "refundCount",
    date: "2021-07-23",
    value: 131,
  },
  {
    name: "orderCount",
    date: "2021-07-24",
    value: 180,
  },
  {
    name: "refundCount",
    date: "2021-07-24",
    value: 121,
  },
];
const data2 = [
  {
    name: "orderAmount",
    date: "2021-07-24",
    amount: 1000,
  },
  {
    name: "refundAmount",
    date: "2021-07-24",
    amount: 888,
  },
  {
    name: "orderAmount",
    date: "2021-07-23",
    amount: 250,
  },
  {
    name: "refundAmount",
    date: "2021-07-23",
    amount: 46,
  },
];

const _aiChartDoc = {
  "order-count": "订单数",
  "refund-count": "退单数",
  "order-amount": "订单金额",
  "refund-amount": "退单金额",
};

const colors = theme.colors10;
/**
 * 图例开关状态
 */
let legendMap = {};
/**
 * 图表实例
 */

let chartIns;
function Grouped() {
  const formatTitle = (title) => {
    return title + "(数量看左侧Y轴;金额看右侧Y轴;)";
  };

  const formatName = (name) => {
    // 英换中
    let formatName = name;
    if (name == "orderCount") {
      formatName = _aiChartDoc["order-count"];
    } else if (name == "refundCount") {
      formatName = _aiChartDoc["refund-count"];
    } else if (name == "orderAmount") {
      formatName = _aiChartDoc["order-amount"];
    } else if (name == "refundAmount") {
      formatName = _aiChartDoc["refund-amount"];
    }
    return formatName;
  };

  const scale = {
    date: {
      sync: true,
    },
    amount: {
      min: 0,
      tickCount: 5,
      type: "linear-strict",
    },
    value: {
      min: 0,
      tickCount: 5,
      type: "linear-strict",
    },
    name: {
    	formatter: (name) => formatName(name),
    },
  };
  return (
    <Chart
      padding={[50, 60]}
      scale={scale}
      data={data}
      height={240}
      autoFit
      onGetG2Instance={(c) => (chartIns = c)}
    >
      <Tooltip shared crosshairs={{ type: "line" }} />
      {/* 分组柱状图 */}
      <Interval
        adjust={[
          {
            type: "dodge",
            marginRatio: 0,
          },
        ]}
        color={["name", colors]}
        position="date*value"
        tooltip={[
          "date*name*value",
          (date, name, value) => {
            return {
              title: formatTitle(date),
              name: formatName(name),
              value: value,
            };
          },
        ]}
      />
      <Axis name="date*value" position="left" />

      <View data={data2} scale={scale} padding={0}>
        <Axis name="amount" position="right" />
        {/*折线图*/}
        <Line
          position="date*amount"
          color={["name", colors]}
          size={3}
          shape="smooth"
        />
        <Point
          position="date*amount"
          color={["name", colors]}
          size={3}
          shape="circle"
        />
      </View>

      <Legend
        custom={true}
        items={[
          {
            name: "订单数",
            value: "orderCount",
            marker: {
              symbol: "square",
              style: { fill: colors[0] },
            },
          },
          {
            name: "退单数",
            value: "refundCount",
            marker: {
              symbol: "square",
              style: { fill: colors[1] },
            },
          },
          {
            name: "订单金额",
            value: "orderAmount",
            marker: {
              symbol: "hyphen",
              style: { stroke: colors[3], lineWidth: 2 },
            },
          },
          {
            name: "退单金额",
            value: "refundAmount",
            marker: {
              symbol: "hyphen",
              style: { stroke: colors[4], lineWidth: 2 },
            },
          },
        ]}
        onChange={(ev) => {
          const { item } = ev;
          const { value } = item;
          const checked = !item.unchecked;
          // 设置图例项状态
          legendMap[value] = checked;
          if (
            // value === "interactiveamount" ||
            value === "orderAmount" ||
            value === "refundAmount"
          ) {
            // 通过filter控制元素显示隐藏
            const view = chartIns.views[0];
            view.filter("name", (val) => {
              return legendMap[val] !== false;
            });
            // 重新渲染,触发filter
            view.render(true);
          } else {
            // 通过filter控制元素显示隐藏
            chartIns.filter("name", (val) => {
              return legendMap[val] !== false;
            });
            // 重新渲染,触发filter
            chartIns.render(true);
          }
        }}
      />
    </Chart>
  );
}

ReactDOM.render(<Grouped />, mountNode);

展示:

鼠标移入效果:

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AntV G2 可以通过多种方式实现分组柱折线图混合画法,以下是其中一种实现方法: 1. 首先,定义数据格式,包括 x 轴数据、柱数据折线图数据。 2. 然后,使用 G2 的表配置方法,设置 x 轴和 y 轴的属性。 3. 接下来,使用 G2 的表创建方法,创建柱折线图对象。 4. 最后,将柱对象和折线图对象添加到同一个视中,实现分组柱折线图混合画法。 以下是一个示例代码,实现了分组柱折线图混合画法: ```javascript import { Chart } from '@antv/g2'; // 定义数据格式 const data = [ { x: '一月', y1: 10, y2: 20 }, { x: '二月', y1: 20, y2: 30 }, { x: '三月', y1: 30, y2: 40 }, { x: '四月', y1: 40, y2: 50 }, { x: '五月', y1: 50, y2: 60 }, { x: '六月', y1: 60, y2: 70 }, ]; // 创建表对象 const chart = new Chart({ container: 'container', autoFit: true, height: 500, }); // 设置 x 轴和 y 轴的属性 chart.scale({ x: { range: [0, 1] }, y: { min: 0 }, }); // 创建柱对象 const bar = chart .interval() .position('x*y1') .color('x') .adjust([{ type: 'dodge', marginRatio: 0.1 }]); // 创建折线图对象 const line = chart .line() .position('x*y2') .color('x'); // 添加柱对象和折线图对象到同一个视中 chart.render(); bar.render(); line.render(); ``` 该示例代码创建了一个包含两组数据的分组柱和一组数据折线图,其中柱折线图共享 x 轴,分别对应 y1 和 y2,柱折线图的颜色按照 x 轴分组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值