在react中使用Bizcharts 仪表盘(多色)[通俗易懂]

在react中使用Bizcharts 仪表盘(多色)[通俗易懂]上代码importReact,{useEffect,useState}from’react’;import{Chart,Axis,Coord,Geom,Guide,Shape}from’bizcharts’;const{Html,Arc}=Guide;//自定义Shape部分-指针Shape.registerShape(‘point’,’pointer’,{drawShape(cfg,group){letpoin

大家好,欢迎来到IT知识分享网。

效果图

1. 核心代码

2. 使用

效果图

核心代码

import React, { 
    useEffect, useState } from 'react';
import { 
    Chart, Axis, Coord, Geom, Guide, Shape } from 'bizcharts';

const { 
    Html, Arc } = Guide;


// 自定义Shape 部分 - 指针
Shape.registerShape('point', 'pointer', { 
   
  drawShape(cfg, group) { 
   
    let point = cfg.points[0]; // 获取第一个标记点
    point = this.parsePoint(point);
    const center = this.parsePoint({ 
    // 获取极坐标系下画布中心点
      x: 0,
      y: 0,
    });
    // 绘制指针
    group.addShape('line', { 
   
      attrs: { 
   
        x1: center.x,
        y1: center.y,
        x2: point.x,
        y2: point.y,
        stroke: cfg.color,
        lineWidth: 1,
        lineCap: 'round',
      },
    });
    return group.addShape('circle', { 
   
      attrs: { 
   
        x: center.x,
        y: center.y,
        r: 6,
        stroke: cfg.color,
        lineWidth: 1,
        fill: '#fff',
      },
    });
  },
});

const color = ['#0fb746', '#00b0f0', '#1d41d5', '#ffff00', '#ff0000'];
// const arcNUM = [[0, 0.5], [0.50, 0.8], [0.8, 1], [1, 1.3], [1.3, 2]]; // 范围值
// const cols = { 
   
// value: { 
   
// min: 0,
// max: daNum,
// ticks: [0.2, 0.7, 0.9, 1.2, 1.8],
// },
// };


/** * value 数值 number * arcNUM 范围值 [[0, 0.5], [0.50, 0.8], [0.8, 1], [1, 1.3], [1.3, 2]] * arcColor 颜色 ['#0fb746', '#00b0f0', '#1d41d5', '#ffff00', '#ff0000'] * daNum 上限值 number 上限值*基数 === 真正的上限值 * ticks 刻度值 [0.2, 0.7, 0.9, 1.2, 1.8] * Text 刻度文字 ['1', '2'] * base 基数 number 其实就是倍数默认是100 上限值*基数 === 真正的上限值 * keyName 文字 string */
export default ({ 
    value, arcNUM, arcColor: arcCol = [], daNum, ticks, Text: ticksText = [], base: baseNum = 100, keyName }) => { 
   

    const [data, setData] = useState([{ 
    value: 0 }])
    const [values, setValues] = useState('')
    const lineWidth = 10

    useEffect(() => { 
   
        if (value || value === 0) { 
   
          setData([{ 
    value: value/baseNum }])
        }
    }, [value])

    const val = data[0].value;
    return (
      <>
        { 
   /* <input value={values} onChange={e => setValues(e.target.value)} /><button onClick={() => setData([{ value: +values }])} type="button">btn</button> */}
        <Chart height={ 
   120} data={ 
   data} scale={ 
   { 
   value : { 
    min: 0, max: daNum, ticks }}} padding={ 
   [0, 0, 10, 0]} forceFit>
            <Coord type="polar" startAngle={ 
   -9 / 8 * Math.PI} endAngle={ 
   1 / 8 * Math.PI} radius={ 
   0.75} />
            <Axis
                name="value"
                zIndex={ 
   2}
                line={ 
   null}
                label={ 
   { 
   
                    offset: -8,
                    textStyle: { 
   
                        fontSize: 12,
                        fill: '#CBCBCB',
                        textAlign: 'center',
                        textBaseline: 'middle',
                    },
                    formatter: (it) => { 
   
                        if (+it === ticks[0]) { 
   
                          return ticksText[0] || '优';
                        } if (+it === ticks[1]) { 
   
                          return ticksText[1] || '良';
                        } if (+it === ticks[2]) { 
   
                          return ticksText[2] || '中';
                        } if (+it === ticks[3]) { 
   
                            return ticksText[3] || '差';
                        }
                        return ticksText[4] || '重';
                    },
                }}
                tickLine={ 
   { 
   
                    // length: -24,
                    stroke: '#fff',
                    strokeOpacity: 1,
                }}
            />
            <Axis name="1" visible={ 
   false} />
            <Guide>
                <Arc
                    zIndex={ 
   0}
                    start={ 
   [0, 0.965]}
                    end={ 
   [daNum, 0.965]}
                    style={ 
   { 
    // 底灰色
                        stroke: 'rgba(0, 0, 0, 0.09)',
                        lineWidth,
                    }}
                />

                { 
   /* 正常 */}
                { 
    val >= arcNUM[0][1] &&
                <Arc
                    zIndex={ 
   1}
                    start={ 
   [0, 0.965]}
                    end={ 
   [val, 0.965]}
                    style={ 
   { 
   
                        stroke: arcCol[0] || color[0],
                        lineWidth,
                    }}
                />}
                { 
    val < arcNUM[0][1] &&
                <Arc
                    zIndex={ 
   1}
                    start={ 
   [0, 0.965]}
                    end={ 
   [val, 0.965]}
                    style={ 
   { 
   
                        stroke: arcCol[0] || color[0],
                        lineWidth,
                    }}
                />}

                { 
   /* 偏高 */}
                { 
    val >= arcNUM[1][1] &&
                <Arc
                    zIndex={ 
   1}
                    start={ 
   [arcNUM[1][0], 0.965]}
                    end={ 
   [arcNUM[1][1], 0.965]}
                    style={ 
   { 
   
                        stroke: arcCol[1] || color[1],
                        lineWidth,
                    }}
                />}
                { 
    val >= arcNUM[1][0] && val < arcNUM[1][1] &&
                <Arc
                    zIndex={ 
   1}
                    start={ 
   [arcNUM[1][0], 0.965]}
                    end={ 
   [val, 0.965]}
                    style={ 
   { 
   
                        stroke: arcCol[1] || color[1],
                        lineWidth,
                    }}
                />}

                { 
   /* 超标 */}
                { 
    val >= arcNUM[2][1] &&
                <Arc
                    zIndex={ 
   1}
                    start={ 
   [arcNUM[2][0], 0.965]}
                    end={ 
   [arcNUM[2][1], 0.965]}
                    style={ 
   { 
   
                        stroke: arcCol[2] || color[2],
                        lineWidth,
                    }}
                />}
                { 
    val >= arcNUM[2][0] && val < arcNUM[2][1] &&
                <Arc
                    zIndex={ 
   1}
                    start={ 
   [arcNUM[2][0], 0.965]}
                    end={ 
   [val, 0.965]}
                    style={ 
   { 
   
                        stroke: arcCol[2] || color[2],
                        lineWidth,
                    }}
                />}

                { 
   /* 污染 */}
                { 
    val >= arcNUM[3][1] &&
                <Arc
                    zIndex={ 
   1}
                    start={ 
   [arcNUM[3][0], 0.965]}
                    end={ 
   [arcNUM[3][1], 0.965]}
                    style={ 
   { 
   
                        stroke: arcCol[3] || color[3],
                        lineWidth,
                    }}
                />}
                { 
    val >= arcNUM[3][0] && val < arcNUM[3][1] &&
                <Arc
                    zIndex={ 
   1}
                    start={ 
   [arcNUM[3][0], 0.965]}
                    end={ 
   [val, 0.965]}
                    style={ 
   { 
   
                        stroke: arcCol[3] || color[3],
                        lineWidth,
                    }}
                />}

                { 
   /* 有害 */}
                { 
   val >= arcNUM[4][0] && <Arc
                    zIndex={ 
   1}
                    start={ 
   [arcNUM[4][0], 0.965]}
                    end={ 
   [val, 0.965]}
                    style={ 
   { 
   
                        stroke: arcCol[4] || color[4],
                        lineWidth,
                    }}
                />}
                <Html
                    position={ 
   ['50%', '90%']}
                    html={ 
   () => (`<div style="width: 150px;text-align: center;font-size: 12px!important;"><p style="font-size: 0.75em; color: rgba(0,0,0,0.43);margin: 0;">${ 
     keyName}</p><p style="font-size: 1em;font-weight: 600;color: rgba(0,0,0,0.85);margin: 0;">${ 
     val === 0 ? val : (Math.floor(val*baseNum) || '')}</p></div>`)}
                />
            </Guide>
            <Geom
                type="point"
                position="value*1"
                shape="pointer"
                color="#1890FF"
                active={ 
   false}
                style={ 
   { 
    stroke: '#fff', lineWidth: 1 }}
            />
        </Chart>
      </>
    );
}

使用

这是一个封装好的

/** * value 数值 number 真正的数值 = value/base(基数) * arcNUM 范围值 [[0, 0.5], [0.50, 0.8], [0.8, 1], [1, 1.3], [1.3, 2]] * arcColor 颜色 ['#0fb746', '#00b0f0', '#1d41d5', '#ffff00', '#ff0000'] * daNum 上限值 number 真正的上限值 = 上限值*基数 * ticks 刻度值 [0.2, 0.7, 0.9, 1.2, 1.8] * Text 刻度文字 ['1', '2'] * base 基数(倍数) number 其实就是倍数默认是100 上限值*基数 === 真正的上限值 * keyName 文字 string */
<PointerChart { 
   ...{ 
   
   value: 200,
   arcNUM: [[0, 0.5], [0.50, 0.8], [0.8, 1], [1, 1.3], [1.3, 2]],
   arcColor: ['#00b050', '#ffff00', '#ff6c0d', '#000000', '#ff0000'],
   daNum: 3,
   ticks: [0.2, 0.65, 0.9, 1.2, 1.8],
   Text: ['正常', '偏高', '超标', '污染', '有害'],
   keyName: 'PM2.5',
}} />

3. 回到顶部

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24371.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信