0

react-vis を使用して単純なデータ ビジュアライザーを作成していますが、最近マウスオーバーしたシリーズの y 値のみを十字線に表示する方法がわかりません。また、react-vis のドキュメントで指定されているイベント オブジェクトに関するドキュメントが見つからないようです。例えば:

<LineSeries
    ...
  onSeriesMouseOver={(event)=>{
      // does something on mouse over
      // you can access the value of the event
  }}

イベントにはどのようなプロパティがありますか? これについては何も見つかりません。

これは、私がこれまでに持っている Chart コンポーネントのコードです。各シリーズの選択状態を配列に保存し(現在はコメントアウトされています)、そのシリーズの状態がtrueの場合にのみ十字線の値をそのシリーズに設定してみました:

import React from 'react';
import {XYPlot, XAxis, YAxis, VerticalGridLines, HorizontalGridLines, 
    LineSeries, DiscreteColorLegend, Crosshair} from 'react-vis';

function hslToHex(h, s, l) {
    h /= 360;
    s /= 255;
    l /= 255;
    let r, g, b;
    if (s === 0) {
        r = g = b = l; // achromatic
    } 
    else {
        const hue2rgb = (p, q, t) => {
            if (t < 0) t += 1;
            if (t > 1) t -= 1;
            if (t < 1 / 6) return p + (q - p) * 6 * t;
            if (t < 1 / 2) return q;
            if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
            return p;
        };
        const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
        const p = 2 * l - q;
        r = hue2rgb(p, q, h + 1 / 3);
        g = hue2rgb(p, q, h);
        b = hue2rgb(p, q, h - 1 / 3);
    }
    const toHex = x => {
        const hex = Math.round(x * 255).toString(16);
        return hex.length === 1 ? '0' + hex : hex;
    };
    return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
}
const series = [];
const invisiSeries = [];
const seriesColor = [];
const Chart = (props) => {

    const [crossVals, setCrossVals] = React.useState([]);
    const dataArr = [];
    for (var i = 0; i < props.data.length; i++) {
        dataArr.push(props.data[i].map((d)=> {
            return {x: d.TIME, y: d.Value};
        }));
    }
    const seriesNames = props.items.map(e => {
        return e.LOCATION + ' ' + e.SUBJECT; 
    });
    const isSelected = Array(dataArr.length).fill(false);

    for (i = 0; i < dataArr.length; i++) {
        if (seriesColor.length <= i) {
            seriesColor.push(hslToHex( (i * 360 * 3/10) % 360, 255, 128));
        }
        series.push(<LineSeries
            data={dataArr[i]}
            style={{stroke: seriesColor[i], strokeWidth: 3}}
            /*
            onSeriesMouseOver={(d) => {
                isSelected.fill(false);
                isSelected[i] = true;
            }}
            onSeriesMouseOut={(event)=>{
                isSelected[i] = false;
            }}
            */
            onNearestX={(value, {index}) => {
                // Tried only setting crossvals for the single LineSeries that has
                // its isSelected[i] set to true
                //if(isSelected[i] == true) {
                //  setCrossVals([d]));
                //}
                setCrossVals(dataArr.map(d => d[index]));
            }}/>);
        /*invisiSeries.push(<LineSeries
            data={dataArr[i]}
            style={{opacity: 0, strokeWidth: 10}}
            onNearestX={v => {
                setCrossVals([v]);
            }}/>);
            */
    }
    return (
        <div>
            <XYPlot
                xType="ordinal"
                width={1000}
                height={500}
                onMouseLeave={() => {setCrossVals([])}}>
                <VerticalGridLines />
                <HorizontalGridLines />
                <XAxis title="Year" tickLabelAngle={35} tickPadding={24}/>
                <YAxis title="KG per Capita" />
                    {series}
                <Crosshair values={crossVals}>
                </Crosshair>
            </XYPlot>
            <DiscreteColorLegend height={200} width={300} 
                items={props.items.map(e => {
                    return {title: e.LOCATION + ' ' + e.SUBJECT,
                    color: seriesColor[e.INDEX],
                    strokeWidth: 3}})} />
        </div>
    );
}
export default Chart;
4

1 に答える 1