如何使用反应图在同一图表上配置多个条形图 [英] How to configure multiple bars on same chart using react-charts

查看:87
本文介绍了如何使用反应图在同一图表上配置多个条形图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个反应,可以显示.为此,我正在使用react-charts库.

I have a react wherein I am able to display the. For this i am using react-charts library.

要填充图表数据,我正在进行API调用,然后更新状态.我想为YAxis显示多个值.

To populate chart data I am making a API call and thereafter updating the state. I want to display multiple values for YAxis.

我的示例API响应是:

My sample API response is:

{
"result": 1,
"data": [
    {
        "data1": "1272.00",
        "data2": "1183.00",
        "price": "131.00"
    },
    {
        "data1": "1328.00",
        "data2": "1468.00",
        "price": "132.00"
    },
    {
        "data1": "1829.00",
        "data2": "1445.00",
        "price": "133.00"
    },
 ]
}

我想要YAxis的data1和data2值以及XAxis的价格.

I want data1 and data2 values forYAxis and price for XAxis.

反应代码:

import React, { Component } from "react";
import Sidebar from "./Sidebar";
import { Chart } from "react-charts";
import axios from "axios";

const qs = require("qs");

class Home extends Component {
  state = {
    datelist: [],
    chart_data: []
  };

  componentDidMount() {
    this.getDatesList();
    axios
      .post(
        `http://127.0.0.1:8000/pricedata/`,
        qs.stringify({ date: "2019-01-11" })
      )
      .then(res => {
        if (res.data.result === 1) {
          this.setState({
            chart_data: [
              {
                label: "Strike",
                data: res.data.data.map(Object.values)
              }
            ]
          });
        } else {
          this.setState({ chart_data: [] });
        }
      });
  }

  getDatesList() {
    axios.get("http://127.0.0.1:8000/dateslist/").then(res => {
      if (res.data.result === 1) {
        this.setState({ datelist: res.data.data });
      } else {
        this.setState({ datelist: [] });
      }
    });
  }

  handleChange = event => {
    var dateval = event.target.value;
    axios
      .post(`http://127.0.0.1:8000/pricedata/`, qs.stringify({ date: dateval }))
      .then(res => {
        if (res.data.result === 1) {
          this.setState({
            chart_data: [
              {
                label: "Strike",
                data: res.data.data.map(Object.values)
              }
            ]
          });
        } else {
          this.setState({ chart_data: [] });
        }
      });
  };

  render() {
    return (
      <div className="container container_padding">
        <div className="row">
          <Sidebar />
          <div className="col-md-9 col-sm-9 col-xs-12">
            <select
              className="form-control"
              style={{ width: "120px", marginBottom: "10px" }}
              onChange={this.handleChange}
            >
              {this.state.datelist.map((date, i) => (
                <option value={date} key={i}>
                  {date}
                </option>
              ))}
            </select>
            <div
              style={{
                width: "400px",
                height: "300px"
              }}
            >
              <Chart
                data={this.state.chart_data}
                series={{ type: "bar" }}
                axes={[
                  { primary: true, type: "ordinal", position: "bottom" },
                  { type: "linear", position: "left", stacked: true }
                ]}
                primaryCursor
                tooltip
              />
            </div>
          </div>
        </div>
      </div>
    );
  }
}

export default Home;

我该如何实现?

谢谢.

推荐答案

修改以下几行:

handleChange = event => {
    var dateval = event.target.value;
    axios
      .post(`http://127.0.0.1:8000/pricedata/`, qs.stringify({ date: dateval }))
      .then(res => {
        if (res.data.result === 1) {
          this.setState({
            chart_data: [
              {
                label: "bar1",
                data: res.data.data.map((d) => ({ x: d.price, y: d.data1 })
              },
              {
                label: "bar2",
                data: res.data.data.map((d) => ({ x: d.price, y: d.data2 })
              }
            ]
          });
        } else {
          this.setState({ chart_data: [] });
        }
      });
  };

和内部渲染:

<Chart
  data={this.state.chart_data}
  series={{ type: 'bar' }}
  axes={[
    { primary: true, position: 'bottom', type: 'ordinal' },
    { position: 'left', type: 'linear', min: 0 },
  ]}
  primaryCursor
  secondaryCursor
  tooltip
/>

这篇关于如何使用反应图在同一图表上配置多个条形图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆