先看效果:




grafana在柱状图上面显示数字_ecmascript


grafana在柱状图上面显示数字_echarts_02


如何实现顶部和内部的数值显示并且计算出两个柱状图的百分比:

首先是全部源码:

<div ref="country" id="country" class="drawing"></div>

<script setup>
    // 引入图表
    import * as echarts from "echarts";
    const country = ref(null);

    // 在项目中countryEcharts里面的data是我请求过来的数据,这里我就用json数据模拟了
    // function countryEcharts(data) {
    function countryEcharts() {
    // 后台模拟数据
    let data = {
        countryType: [
            {name: '总体',count:897},
            {name: '个人',count:331},
            {name: '法人',count:83},
            {name: '自然人/法人',count:483},
        ],
        unCountryType: [
            {name: '总体',count:384},
            {name: '个人',count:109},
            {name: '法人',count:185},
            {name: '自然人/法人',count:90},
        ],
    }
    const dataList = []; // x轴标签
    const dataList1 = []; // 国家级
    const dataList2 = []; // 我省覆盖
    data.countryType.forEach(item => {
        dataList.push(item.name) // x轴标签
        dataList1.push(item.count) // 国家级
    })
    data.unCountryType.forEach(item => {
        dataList2.push(item.count) // 我省覆盖
    })
    const myChart = echarts.init(country.value);
    myChart.setOption({
        tooltip: {
            trigger: 'axis',
            axisPointer: {
                type: 'shadow'
            }
        },
        legend: {
            data: ['国家级','我省覆盖']
        },
        color: ['#73a0fa','#ff7100'],
        grid: {
            left: '2%',
            right: '2%',
            top: '14%',
            bottom: '3%',
            containLabel: true
        },
        xAxis: {
            type: 'category',
            data: dataList,
            axisLine:{
                lineStyle:{
                    color: '#7e7b7b' // x轴颜色
                }
            },
            axisTick: { show: false }, // x轴坐标刻度样式(显示或者隐藏)
            axisLabel: {
                interval: 0,// 使x轴上的文字显示完全
            },
        },
        yAxis: {
            type: 'value'
        },
        series: [
            {
                barWidth: '30%',
                name: '国家级',
                type: 'bar',
                data: dataList1,
                //显示数值
                /*itemStyle: {
                    normal: {
                        label: {
                            show: true, //开启显示
                            position: 'inside', //内部显示
                            formatter:function (params) {
                                return params.value/100 + '%';
                            },
                            textStyle: {
                                //数值样式
                                color: 'black',
                                fontSize: 12,
                            },
                        },
                    },
                },*/
                markPoint: {
                    symbol: 'image://http://example.website/a/b.png',
                    data: [
                        {coord: [0,dataList1[0]]},{coord: [1,dataList1[1]]},{coord: [2,dataList1[2]]},{coord: [3,dataList1[3]]}
                    ],
                    label: {
                        show: true, //开启显示
                        formatter:function (params) {
                            // dataIndex是当前柱状图的索引
                            return dataList1[params.dataIndex];
                        },
                    },
                    symbolOffset: [0, '-30%'] // 偏移量
                }
            },
            {
                barWidth: '30%',
                name: '我省覆盖',
                type: 'bar',
                data: dataList2,
                //显示数值
                itemStyle: {
                    normal: {
                        label: {
                            show: true, //开启显示
                            position: 'inside', //内部显示
                            formatter:function (params) {
                                // dataIndex是当前柱状图的索引
                                let num = (dataList1[params.dataIndex] + dataList2[params.dataIndex])/dataList2[params.dataIndex]
                                num = Math.round(num*100)/100 // 保留两位小数,不四舍五入
                                return num + '%';
                            },
                            textStyle: {
                                //数值样式
                                color: 'black',
                                fontSize: 12,
                            },
                        },
                    },
                },
                markPoint: { // 标注
                    symbol: 'image://http://example.website/a/b.png',
                    data: [
                        {coord: [0,dataList2[0]]},{coord: [1,dataList2[1]]},{coord: [2,dataList2[2]]},{coord: [3,dataList2[3]]}
                    ],
                    label: {
                        show: true, //开启显示
                        formatter:function (params) {
                            // dataIndex是当前柱状图的索引
                            return dataList2[params.dataIndex];
                        },
                    },
                    symbolOffset: [0, '-30%'] // 偏移量
                }
            }
        ]
    })
}
<script/>

蓝色柱子只在顶部显示数值(两种方法):

series: [
            {
                barWidth: '30%',
                name: '国家级',
                type: 'bar',
                data: dataList1,
                /*
                itemStyle这种比较简单,直接通过position属性设置对应的位置就可以了
                */
                itemStyle: {
                    normal: {
                        label: {
                            show: true, //开启显示
                            position: 'top', //顶部显示
                            textStyle: {
                                //数值样式
                                color: 'black',
                                fontSize: 12,
                            },
                        },
                    },
                },
                /*
                下面这种是通过markPoint图表标注的方法来实现的
                */
                /*markPoint: { // 图表标注
                    symbol: 'image://http://example.website/a/b.png',// 标注图形
                    // data是标注的数据数组
                    data: [
                        // coord是标注坐标[x,y]
                        // x轴的值就是根据你dataList1数组的索引
                        // y轴的值就是根据你dataList1数组索引所对应的值(在这里相当于y轴的高度)
                        {coord: [0,dataList1[0]]},{coord: [1,dataList1[1]]},{coord: [2,dataList1[2]]},{coord: [3,dataList1[3]]}
                    ],
                    label: {
                        show: true, //开启显示
                        formatter:function (params) {  // 这里就是标注所显示的值
                            // dataIndex是当前柱状图的索引
                            return dataList1[params.dataIndex];
                        },
                    },
                    symbolOffset: [0, '-30%'] // 标注偏移量
                }*/
            }
        ]

橘色柱子要在顶部和内部都要显示并且内部显示百分比:

series: [
            {
                barWidth: '30%',
                name: '我省覆盖',
                type: 'bar',
                data: dataList2,
                //itemStyle对象里面显示的是内部的数据
                itemStyle: {
                    normal: {
                        label: {
                            show: true, //开启显示
                            position: 'inside', //内部显示
                            formatter:function (params) {
                                // dataIndex是当前柱状图的索引
                                // 这里柱状图的数值是dataList1(国家级数量)+dataList2(我省覆盖)的和除以dataList2(我省覆盖)
                                let num = (dataList1[params.dataIndex] + dataList2[params.dataIndex])/dataList2[params.dataIndex]
                                num = Math.round(num*100)/100 // 保留两位小数,不四舍五入
                                return num + '%';
                            },
                            textStyle: {
                                //数值样式
                                color: 'black',
                                fontSize: 12,
                            },
                        },
                    },
                },
                // markPoint对象里面是顶部的数据
                markPoint: { // 图表标注
                    symbol: 'image://http://example.website/a/b.png',// 标注图形
                    data: [
                        //coord是标注坐标
                        {coord: [0,dataList2[0]]},{coord: [1,dataList2[1]]},{coord: [2,dataList2[2]]},{coord: [3,dataList2[3]]}// 标注坐标
                    ],
                    label: {
                        show: true, //开启显示
                        formatter:function (params) {
                            // dataIndex是当前柱状图的索引
                            return dataList2[params.dataIndex];
                        },
                    },
                    symbolOffset: [0, '-30%'] // 标注偏移量
                }
            }
        ]

在 markPoint 图表标注中通过 formatter 显示数值要用 dataList2[params.dataIndex] 来获取.


grafana在柱状图上面显示数字_javascript_03


Documentation - Apache ECharts

顶部显示多行数据:


grafana在柱状图上面显示数字_echarts_04


series: [
            {
                barWidth: '20%', // 柱子宽度
                data: dataList2,
                type: 'bar',
                itemStyle: { // 显示数值
                    normal: {
                        borderRadius: [3, 3, 0, 0], // 圆角
                        label: {
                            show: true, //开启显示
                            position: 'top', //顶部显示
                            formatter:function (params) {
                                // dataIndex是当前柱状图的索引
                                // 这里柱状图的数值是dataList1(国家级数量)+dataList2(我省覆盖)的和除以dataList2(我省覆盖)
                                let num = (dataList1[params.dataIndex] + dataList2[params.dataIndex])/dataList2[params.dataIndex]
                                num = Math.round(num*100)/100 // 保留两位小数,不四舍五入
                                let num1 = dataList2[params.dataIndex]
                                // num(百分比) num1(数值)
                                return num1 + '\n' + '(' + num + '%)';// 用 '\n' 换行
                            },
                            textStyle: {
                                color: 'black',
                                fontSize: 12,
                            },
                        },
                    },
                }
            }
        ]

柱体圆角:

itemStyle:{
    normal: {
        borderRadius: [3, 3, 0, 0], // 左上 右上 右下 左下
    }
}