echarts 實現立體柱子圖


一、圖例
圖例

二、記錄點
1、二維坐標+立體柱子
2、立體柱子設計:除了主要呈現的數據平面柱使用了bar類型,其他三面采用象形柱圖pictorialBar類型構建。也可以通過數據柱狀圖加上下兩個象形柱圖使之呈現視覺上的立體效果。
3、通過silent: true限制象形柱圖的事件相應效果。
4、symbol設置圖形類型;symbolOffset設置圖形的位置;symbolSize設置圖形的大小;symbolPosition是圖形的定位位置。
5、注釋的label是文本顯示。

三、完整代碼

import React, { Component } from 'react';
import * as echarts from 'echarts';
import '../../stylus/charts/charts-com.less';
interface Props {}
type StateType = {
    dataList: number[],
    dataArray: any
    dataArray2: any
}
class CubeBar3 extends Component<Props, StateType> {
    constructor(props) {
        super(props);
        this.state = {
            dataList: [200,182, 191, 234, 290, 330, 310],
            dataArray: [],
            dataArray2: [],
        }
    }
    componentWillMount() {
        // 渲染前
        let color1 = ['#FF3333', '#FF7744', '#FFCC22', '#33FF33','#33CCFF', '#7744FF','#E93EFF'],
        color2 = ['#FF8888', '#FFA488', '#FFDD55', '#66FF66', '#77DDFF', '#9F88FF', '#E38EFF'],
        color3 = ['#FFCCCC', '#FFC8B4', '#FFEE99', '#99FF99', '#CCEEFF', '#CCBBFF', '#F0BBFF'];
        console.log('Component WILL MOUNT!');
        let aar = [], aar2 = [];
        this.state.dataList.map((item, index) => {
            let obj = {
                value: item,
                itemStyle: {
                    color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
                        offset: 0,
                        color: color1[index] // 0% 處的顏色
                    }, {
                        offset: 0.6,
                        color: color2[index] // 60% 處的顏色
                    }, {
                        offset: 1,
                        color: color3[index] // 100% 處的顏色
                    }], false),
                    
                }
            };
            aar.push(Object.assign({}, obj))
        });
        this.state.dataList.map((item, index) => {
            let obj = {
                value: item,
                itemStyle: {
                    color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
                        offset: 0,
                        color: color1[index] // 0% 處的顏色
                    }, {
                        offset: 0.6,
                        color: color2[index] // 60% 處的顏色
                    }, {
                        offset: 1,
                        color: color3[index] // 100% 處的顏色
                    }], false),
                    borderWidth: 1,
                    borderColor: color1[index],
                    shadowColor: 'rgba(0, 0, 0, 0.2)',
                    shadowBlur: 1,
                }
            };
            aar2.push(Object.assign({}, obj))
        });
        this.setState({
            dataArray: aar,
            dataArray2: aar2
        });
    }
    componentDidMount() {
        // 渲染后
        console.log('ccccccccc', this.state.dataArray);
        let barWidth = 800 / 40;
        let option = {
            backgroundColor: '#010d3a',
            xAxis: {
                type: 'category',
                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                axisLine: {
                    lineStyle: {
                        color: '#fff'
                    } 
                }
            },
            yAxis: {
                type: 'value',
                axisLine: {
                    lineStyle: {
                        color: '#fff'
                    } 
                }
            },
            tooltip:{
                show: true,
                orient: 'vertical',
                formatter: '{b0}: {c0}'
            },
            series: [
                {
                    type: 'bar',
                    barWidth: barWidth,
                    z: 1,
                    // label: {
                    //     show: true,
                    //     position: 'top',
                    //     padding: [0, 0, 0, 10],
                    //     formatter: '{b}: {c}',
                    //     color: '#fff'
                    // },
                    data: this.state.dataArray
                },
                {
                    z: 1,
                    type: 'pictorialBar',
                    barWidth: barWidth / 2,
                    symbol: 'rect',
                    symbolOffset: ['50%', 0],
                    symbolRepea: false,
                    data: this.state.dataArray2,
                    silent: true
                },
                {
                    z: 3,
                    type: 'pictorialBar',
                    symbolPosition: 'start',
                    data: this.state.dataArray,
                    symbol: 'diamond',
                    symbolOffset: [0, '55%'],
                    symbolSize: [barWidth, barWidth * 0.5],
                    silent: true
                },
                {
                    z: 3,
                    type: 'pictorialBar',
                    symbolPosition: 'end',
                    data: this.state.dataArray,
                    symbol: 'diamond',
                    symbolOffset: [0, '-55%'],
                    symbolSize: [barWidth, barWidth * 0.5],
                    silent: true
                }
            ]
        };
        let myChart = echarts.init(document.getElementById('canvasBox'));
        myChart.setOption(option);
        window.addEventListener("resize", myChart.resize);
    }
    render() {
        return (
            <div>
                <div className="cube-bar">
                    <h1>立體柱子</h1>
                    <div className="chart-area">
                        <div id="canvasBox" className='canvasBox'></div>
                    </div>
                </div>
            </div>
        );
    }
}
export default CubeBar3;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM