• Echarts图表插件(4.x版本)使用(二、带分类筛选的多个图表/实例化多个ECharts,以关系图/force为例)


    导读

    如果想在一个页面里实例化带分类筛选的多个Echarts该怎么做呢?

    曾探讨了带分类选择的关系图显示为自定义图片的需求实现,传送门ECharts图表插件(4.x版本)使用(一、关系图force节点显示为自定义图像/图片,带分类选择)

    本篇将着重介绍如何根据后台返回的列表数据,实例化多个Echarts,对应所用技术点:Asp.Net MVC & Razor 视图引擎

    最终产品效果图

    产品需求几经变化,由加载全部图表到默认只展示一个图表,再到节点展示改为图像等;

    加载全部图表,多个ECharts

    默认只展示一个图表,有分类筛选功能

    默认只展示一个图表,节点展示改为图像,有分类筛选功能

    实现思路

    带有筛选功能展示不同Echarts图表,而不是一个ECharts图表里的筛选功能,此需求实现,采用一次性实例化多个ECharts,隐藏掉其余实例,而不是切换分类时请求数据,进行实例化。

    后台返回数据在razor视图模板里接收

    @{
        Layout = "~/Views/Shared/_xkLayout.cshtml";
        
        List<xk_group> listGroup = ViewBag.Group;
        List<ScholarDto> list = ViewBag.List;
        List<IGrouping<long?, ScholarDto>> listGrouping = ViewBag.Grouping;
    }

    html代码,含c#语法

      <div class="rc left" id="ResultData">
                <!--学者-->
                <div class="scholar">
    
                    <div class="choose clearfix">
                        @if (listGrouping != null && listGrouping.Count > 0)
                        {
                            foreach (var item in listGrouping)
                            {
                        <a href="javascript:;" data-groupid="@item.Key" data-groupname="@item.FirstOrDefault().GroupName">@item.FirstOrDefault().GroupName</a>
                            }
                        }
                    </div>
                    @if (listGroup != null && listGroup.Count > 0)
                    {
                        foreach (var item in listGroup)
                        {
                            <div name="scholarRechart">
                                @*<h1>研究“@(item.GroupName)”的学者</h1>*@
                                <div id="relationChart_@item.GroupId"  data-groupid="@item.GroupId" data-groupname="@item.GroupName" style=" 600px; height: 400px;">
    
                                </div>
                            </div>
    
                        }
                    }                
                </div>
            </div>

    js代码 实例化多个ECharts

        @if (listGrouping != null && listGrouping.Count > 0)
        {
    
            foreach (var item in listGrouping)
            {
                <text>
        @*var groupName = "@item.FirstOrDefault().GroupName";*@
        $(function () {
            var nodes_@item.Key = [{
                //category: 0,
                name: "@item.FirstOrDefault().GroupName",
                //color: "green",
    
                symbol: "circle",//"image://http://thumb12.jfcdns.com/2018-06/bce5b231ad7df722.png",
                symbolSize: 100,
                size: 100,
                label: "@item.FirstOrDefault().GroupName",
                x: null,
                y: null,
                draggable: true,
                //cursor:"pointer",
                label: {
                    show: true,
                    textStyle: {
                        color: '#333',
                        fontSize: 18,
                        fontWeight: "bolder"
    
                    },
                    position: 'inside',//标签位置
                    //distance: 50//标签距离图形的距离
                },
            }];
            var links_@(item.Key) = [];
            @*var legendData_@(item.Key) = [];*@
            @{
                var subList = item.ToList();
                if (subList != null && subList.Count > 0)
            {
    
    
                foreach (var subItem in subList)
                {
                <text>
    
            nodes_@(item.Key).push({
                //category: 1,
                name: "@subItem.RealName",
                //color:"green",
                symbol: 'image://@ProductConfigHelper.DomainXinKeUrl/imagesTemp/potrait/0@(random.Next(1,6)).png',
                symbolSize: 60,
                size: 60,
                x: null,
                y: null,
                //draggable: true,
                scholarUrl: "@subItem.Link"
            });
            links_@(item.Key).push(
                                    {
                                        source: "@subItem.RealName",
                                        target: "@subItem.GroupName",
                                        weight: 6,
                                        name: "@subItem.RealName"
                                    });
    
    
    
            </text>
                }
               <text>
            //// 基于准备好的dom,初始化echarts实例
            var myChart_@(item.Key) = echarts.init(document.getElementById('relationChart_@item.Key'));
            option_@(item.Key) = {
                title: {
                    text: '研究“@(item.FirstOrDefault().GroupName)”的学者',
                    subtext: '',
                    //x: 'middle',
                    //y: 'top',
                    //textStyle: {
                    //    align: "center",
                    //}
                    //top: "middle",
                    //bottom: "150",
                    left: "center"
                },
                tooltip: {
                    trigger: 'item',
                    formatter: '{b}'
                },
                toolbox: {
                    show: true,
                    feature: {
                        //restore: { show: true },
                        magicType: { show: true, type: ['force', 'chord'] },
                        //saveAsImage: { show: true }
                    }
                },
                @*legend: {
                    x: 'left',
                    data: legendData_@(item.Key)//['作者', '家人', '朋友']
                },//分类*@
                //edgeLength: [500, 100],
                series: [
                    {
                        type: 'graph',
                        //name: "相关学者",
                        cursor: "pointer",
                        draggable: false,
                        layout: 'force',
                        //symbol: 'pin',
                        ribbonType: false,
                        //categories: seriesCategories,
                        cursor:'pointer',
                        itemStyle: {
                            normal: {
                                color: "#2ec7c9",//节点颜色
                                label: {
                                    show: true,
                                    textStyle: {
                                        color: '#333'
                                    },
                                    position: 'bottom',//标签位置
                                    distance: 5//标签距离图形的距离
                                },
                                nodeStyle: {
                                    brushType: 'both',
                                    borderColor: 'rgba(255,215,0,0.4)',
                                    borderWidth: 1
                                },
                                linkStyle: {
                                    type: 'line'
                                }
                            },
                            emphasis: {
                                label: {
                                    show: false
                                    // textStyle: null      // 默认使用全局文本样式,详见TEXTSTYLE
                                },
                                nodeStyle: {
                                    //r: 30
                                },
                                linkStyle: {}
                            }
                        },
                        //useWorker: false,
                        minRadius: 15,
                        maxRadius: 25,
                        //gravity: 0.1,
                        //scaling: 0.1,
                        roam: 'scale',//设置成可缩放
                        nodes: nodes_@(item.Key),
                        links: links_@(item.Key),
    
                        force: {
                            repulsion: 1000
                        }
                    }
                ]
            };
    
            // 使用刚指定的配置项和数据显示图表。
            myChart_@(item.Key).setOption(option_@(item.Key));
            //节点点击事件
            myChart_@(item.Key).on('click', function (param) {
                if (param.data.scholarUrl) {
                    window.open(param.data.scholarUrl);
                }
            });
            </text>
            }
        }
        })
    
    
        </text>
            }
        }

    在script标签里,使用razor视图模板语法,在C#代码里输出js代码,使用<text></text>标签即可。

    后台获取Echarts所需相关数据的方法及相关model

    #region 获取相关学者列表
            /// <summary>
            /// 获取相关学者列表
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public JsonpResult GetScholarRelation(ScholarDto p)
            {
                if (string.IsNullOrEmpty(p.BookId))
                {
                    return this.Jsonp(new { Success = 0, Msg = "查询失败:" + ":前台传参异常" });
                }
                var list = new List<ScholarDto>();//学者集合列表
                var groups = new List<ScholarDto>();//学者研究主题集合列表
                try
                {
                    list=scholarService.GetScholarRelation(p);
                    var group=list.GroupBy(c => c.GroupId);
                    foreach (var item in group)
                    {
                        groups.Add(new ScholarDto(){ GroupId=item.Key??0,GroupName=item.FirstOrDefault().GroupName});
                    }
                    return this.Jsonp(new { Success = 1, Msg = "查询成功", List = list, Group = groups });
                }
                catch (Exception ex)
                {
                    return this.Jsonp(new { Success = 0, Msg = "查询失败:" + ex.Message });
                }
            }
            #endregion
     public partial class xk_scholar
        {
            public long Id { get; set; }
            public string BookId { get; set; }
            public string RealName { get; set; }
            public Nullable<long> GroupId { get; set; }
            public string Avatar { get; set; }
            public string Link { get; set; }
            public string Editor { get; set; }
            public Nullable<int> OrderNum { get; set; }
            public Nullable<System.DateTime> ADDTIME { get; set; }
            public Nullable<System.DateTime> UpdateTime { get; set; }
            public Nullable<int> IsDel { get; set; }
        }
     public class ScholarDto : xk_scholar
        {
            /// <summary>
            /// 研究主题名称
            /// </summary>
            public string GroupName { get; set; }
            /// <summary>
            /// 重新编码排序的研究主题编号,从1开始,用以使用插件echarts
            /// </summary>
            public int GroupCode { get; set; }
        }

     前台脚本,控制图表显示与隐藏

     $(function () {
            var curGroupId=@(ViewBag.GroupId??0);
    
            if (curGroupId>0) {//通过左侧导航点击
                $(".choose a[data-groupid='{0}']".format(curGroupId)).click();
    
            }
            else {//默认第一条显示
                $(".choose a:eq(0)").click();
    
            }
            init_ready();//调整高度
        })

    总结

     切换分类,展示不同的ECharts,可以采用实例化多个ECharts,脚本控制图表的显示与隐藏。在script标签里,使用razor视图模板语法,在C#代码里输出js代码,使用<text></text>标签即可。

  • 相关阅读:
    [BJWC2011]最小三角形
    用于监视Linux上的内存使用情况的Bash脚本
    使用ps、top、ps_mem命令找出Linux中的最大内存消耗过程
    无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 如果是,使用原装充电器或使用弱电流方式充电(例如使用电脑USB接口充电)充电15-30分钟后尝试重新开机;注意:电量过低引起的无法开机,刚插入充电器时可能不亮屏但呼吸灯闪烁状态。
    Centos7 cache/buff过高处理方法
    上,打开SSH服务的配置文件:/etc/ssh/sshd_config 加上如下两行: ClientAliveInterval 120 ClientAliveCountMax 720 第一行,表示每隔120秒向客户端
    inux软件安装管理之——dpkg与apt-*详解
    在虚拟机中安装 Ubuntu
    一看就懂的 安装完ubuntu 18.04后要做的事情和使用教程
    一、apt的简介
  • 原文地址:https://www.cnblogs.com/EvanFan/p/10008438.html
Copyright © 2020-2023  润新知