图标插件XCharts使用心得

        首先我自己下载了插件,这是网盘链接:

链接:https://pan.baidu.com/s/1pyjTQ16kM8CFVc6UzXllcw 
提取码:1234 

        推荐看看官网文档的教程,虽然里面的代码好像是旧版本插件的,新版本插件用不了,但是一些知识还是有用的。

入门教程:5分钟上手 XCharts 3.0 | XCharts

一、常用模块

        1、Therme模块

        BackgroundColor和ColorPallette部分的颜色视情况需要调一下,比如不需要背景就把BackgroundColor的alpha值设为0,ColorPallette部分的颜色尤其是第一个有时候会影响最终效果的颜色,先留个心眼。

        其它的部分划红线的模块一般经常要用到,尤其是最后的Series模块。

        

        2、Series模块

        Series的Size部分可以添加多个Serie,比如两个折线图。Type可以选类型,最常用的就是前三个:Line折线图、Bar柱状图、Pie饼状图。打了勾的子模块一般比较常用,中间那部分数据一般不用改,Symbol表示数据是否有标记点,就是图表中90旁边的实心小圆,AreaStyle表示是否添加面积效果,下图中就加了渐变效果。

        

        

        Data部分就是要显示的数据,注意数量要跟XAxis的Data部分保持一样。

        对于饼状图来说,设置Radius的第一个数和第二个数就能实现下面两种效果,第一个数表示内半径,第二个数表示外半径,第一个数为0就是实心效果,否则就是空心效果。

各个模块的参数函数这些参考配置手册,配置项手册 | XCharts,比如下面是ItemStyle的参数说明,ItemStyle可以设置颜色渐变。

        最后还是要看插件的代码的,找到XCharts/Examples/Runtime下的脚本,在空场景里创建UI下的空物体,将脚本一个一个拖上去运行就能看到不同的效果。

二、插件代码学习

        打开一个空场景,创建一个空的UI物体,然后一个一个脚本挂上去看效果。 

1、Example00_CheatSheet:术语解析,帮助你更好的理解各个模块组件的含义和对应效果,脚本里的代码可以给自己作参考。

2、Example01_UpdateData:对Series里的第一个serie做数据修改。需要自己手动创建一个图表,然后在挂上该脚本来看效果,运行后过了几秒钟,发觉已经有两个数据有了变化。那么总结就是改变图表的数据调用chart组件UpdateData函数就够了。

/************************************************/
/*                                              */
/*     Copyright (c) 2018 - 2021 monitor1394    */
/*     https://github.com/monitor1394           */
/*                                              */
/************************************************/

using UnityEngine;

namespace XCharts.Examples
{
    [DisallowMultipleComponent]
    [ExecuteInEditMode]
    public class Example01_UpdateData : MonoBehaviour
    {
        private float updateTime = 0;
        BaseChart chart;
        void Awake()
        {
            chart = gameObject.GetComponent<BaseChart>();
        }

        void Update()
        {
            updateTime += Time.deltaTime;
            if (chart && updateTime > 2)
            {
                updateTime = 0;
                var serie = chart.series.GetSerie(0);
                //serie.animation.dataChangeEnable = true;
                var dataCount = serie.dataCount;
                if (chart is RadarChart)
                {
                    var dimension = serie.GetSerieData(0).data.Count - 1;
                    chart.UpdateData(0, 0, Random.Range(0, dimension + 1), Random.Range(0, 100));
                }
                else if (chart is HeatmapChart)
                {
                    var dimension = serie.GetSerieData(0).data.Count - 1;
                    for (int i = 0; i < dataCount; i++)
                    {
                        chart.UpdateData(0, i, dimension, Random.Range(0, 10));
                    }
                }
                else
                {
                    chart.UpdateData(0, Random.Range(0, dataCount), Random.Range(10, 90));
                }
            }
        }
    }
}

3、 Example02_ChartEvent:图表事件响应,如点击事件可以在安卓大屏上触发(猜的),暂时没发现有什么实用价值。

/************************************************/
/*                                              */
/*     Copyright (c) 2018 - 2021 monitor1394    */
/*     https://github.com/monitor1394           */
/*                                              */
/************************************************/

using UnityEngine;
using UnityEngine.EventSystems;

namespace XCharts.Examples
{
    [DisallowMultipleComponent]
    [ExecuteInEditMode]
    public class Example02_ChartEvent : MonoBehaviour
    {
        BaseChart chart;

        void Awake()
        {
            chart = gameObject.GetComponent<BaseChart>();
            if (chart == null)
            {
                chart = gameObject.AddComponent<LineChart>();
            }
            chart.onPointerEnter = OnPointerEnter;
            chart.onPointerExit = OnPointerExit;
            chart.onPointerDown = OnPointerDown;
            chart.onPointerUp = OnPointerUp;
            chart.onPointerClick = OnPointerClick;
            chart.onScroll = OnScroll;
        }

        void OnPointerEnter(PointerEventData eventData, BaseGraph chart)
        {
            Debug.Log("enter:" + chart);
        }

        void OnPointerExit(PointerEventData eventData, BaseGraph chart)
        {
            Debug.Log("exit:" + chart);
        }

        void OnPointerDown(PointerEventData eventData, BaseGraph chart)
        {
            Debug.Log("down:" + chart);
        }

        void OnPointerUp(PointerEventData eventData, BaseGraph chart)
        {
            Debug.Log("up:" + chart);
        }

        void OnPointerClick(PointerEventData eventData, BaseGraph chart)
        {
            Debug.Log("click:" + chart);
        }

        void OnScroll(PointerEventData eventData, BaseGraph chart)
        {
            Debug.Log("scroll:" + chart);
        }
    }
}

4、Example03_ChartAnimation:图表动画效果。最终这5个柱子是每隔1秒且用时1秒显示出来。

/************************************************/
/*                                              */
/*     Copyright (c) 2018 - 2021 monitor1394    */
/*     https://github.com/monitor1394           */
/*                                              */
/************************************************/

using UnityEngine;

namespace XCharts.Examples
{
    [DisallowMultipleComponent]
    [ExecuteInEditMode]
    public class Example03_ChartAnimation : MonoBehaviour
    {
        BaseChart chart;

        void Awake()
        {
            chart = gameObject.GetComponent<BaseChart>();
            if (chart == null)
            {
                chart = gameObject.AddComponent<BarChart>();
            }
            var serie = chart.series.GetSerie(0);
            serie.animation.enable = true;
            //自定义每个数据项的渐入延时
            serie.animation.customFadeInDelay = CustomFadeInDelay;
            //自定义每个数据项的渐入时长
            serie.animation.customFadeInDuration = CustomFadeInDuration;
        }
        //dataIndex:每个数据下标,插件自动传过来的
        float CustomFadeInDelay(int dataIndex)
        {
            return dataIndex * 1000;
        }
        //dataIndex:每个数据下标,插件自动传过来的
        float CustomFadeInDuration(int dataIndex)
        {
            return /*dataIndex * 1000 +*/ 1000;
        }
    }
}

5、Example10_LineChart:各种折线图效果。

 

/************************************************/
/*                                              */
/*     Copyright (c) 2018 - 2021 monitor1394    */
/*     https://github.com/monitor1394           */
/*                                              */
/************************************************/

using System.Collections;
using UnityEngine;

namespace XCharts.Examples
{
    [DisallowMultipleComponent]
    public class Example10_LineChart : MonoBehaviour
    {
        private LineChart chart;
        private Serie serie;
        private int m_DataNum = 8;

        void Awake()
        {
            LoopDemo();
        }

        private void OnEnable()
        {
            LoopDemo();
        }

        void LoopDemo()
        {
            StopAllCoroutines();
            StartCoroutine(PieDemo());
        }

        IEnumerator PieDemo()
        {
            StartCoroutine(AddSimpleLine());
            yield return new WaitForSeconds(2);
            StartCoroutine(ChangeLineType());
            yield return new WaitForSeconds(8);
            StartCoroutine(LineAreaStyleSettings());
            yield return new WaitForSeconds(5);
            StartCoroutine(LineArrowSettings());
            yield return new WaitForSeconds(2);
            StartCoroutine(LineSymbolSettings());
            yield return new WaitForSeconds(7);
            StartCoroutine(LineLabelSettings());
            yield return new WaitForSeconds(3);
            StartCoroutine(LineMutilSerie());
            yield return new WaitForSeconds(5);
            LoopDemo();
        }

        IEnumerator AddSimpleLine()
        {
            chart = gameObject.GetComponent<LineChart>();
            if (chart == null) chart = gameObject.AddComponent<LineChart>();
            chart.title.text = "LineChart - 折线图";
            chart.title.subText = "普通折线图";

            chart.yAxis0.minMaxType = Axis.AxisMinMaxType.Custom;
            chart.yAxis0.min = 0;
            chart.yAxis0.max = 100;

            chart.RemoveData();
            serie = chart.AddSerie(SerieType.Line, "Line");

            for (int i = 0; i < m_DataNum; i++)
            {
                chart.AddXAxisData("x" + (i + 1));
                chart.AddData(0, UnityEngine.Random.Range(30, 90));
            }
            yield return new WaitForSeconds(1);
        }

        IEnumerator ChangeLineType()
        {
            chart.title.subText = "LineTyle - 曲线图";
            serie.lineType = LineType.Smooth;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            chart.title.subText = "LineTyle - 阶梯线图";
            serie.lineType = LineType.StepStart;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            serie.lineType = LineType.StepMiddle;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            serie.lineType = LineType.StepEnd;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            chart.title.subText = "LineTyle - 虚线";
            serie.lineType = LineType.Dash;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            chart.title.subText = "LineTyle - 点线";
            serie.lineType = LineType.Dot;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            chart.title.subText = "LineTyle - 点划线";
            serie.lineType = LineType.DashDot;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            chart.title.subText = "LineTyle - 双点划线";
            serie.lineType = LineType.DashDotDot;
            chart.RefreshChart();

            serie.lineType = LineType.Normal;
            chart.RefreshChart();
        }

        IEnumerator LineAreaStyleSettings()
        {
            chart.title.subText = "AreaStyle 面积图";

            serie.areaStyle.show = true;
            chart.RefreshChart();
            yield return new WaitForSeconds(1f);

            chart.title.subText = "AreaStyle 面积图";
            serie.lineType = LineType.Smooth;
            serie.areaStyle.show = true;
            chart.RefreshChart();
            yield return new WaitForSeconds(1f);

            chart.title.subText = "AreaStyle 面积图 - 调整透明度";
            while (serie.areaStyle.opacity > 0.4)
            {
                serie.areaStyle.opacity -= 0.6f * Time.deltaTime;
                chart.RefreshChart();
                yield return null;
            }
            yield return new WaitForSeconds(1);

            chart.title.subText = "AreaStyle 面积图 - 渐变";
            serie.areaStyle.toColor = Color.white;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
        }

        IEnumerator LineArrowSettings()
        {
            chart.title.subText = "LineArrow 头部箭头";
            serie.lineArrow.show = true;
            serie.lineArrow.position = LineArrow.Position.Start;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            chart.title.subText = "LineArrow 尾部箭头";
            serie.lineArrow.position = LineArrow.Position.End;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
            serie.lineArrow.show = false;
        }

        /// <summary>
        /// SerieSymbol 相关设置
        /// </summary>
        /// <returns></returns>
        IEnumerator LineSymbolSettings()
        {
            chart.title.subText = "SerieSymbol 图形标记";
            while (serie.symbol.size < 5)
            {
                serie.symbol.size += 2.5f * Time.deltaTime;
                chart.RefreshChart();
                yield return null;
            }
            chart.title.subText = "SerieSymbol 图形标记 - 空心圆";
            yield return new WaitForSeconds(1);

            chart.title.subText = "SerieSymbol 图形标记 - 实心圆";
            serie.symbol.type = SerieSymbolType.Circle;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            chart.title.subText = "SerieSymbol 图形标记 - 三角形";
            serie.symbol.type = SerieSymbolType.Triangle;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            chart.title.subText = "SerieSymbol 图形标记 - 正方形";
            serie.symbol.type = SerieSymbolType.Rect;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            chart.title.subText = "SerieSymbol 图形标记 - 菱形";
            serie.symbol.type = SerieSymbolType.Diamond;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            chart.title.subText = "SerieSymbol 图形标记";
            serie.symbol.type = SerieSymbolType.EmptyCircle;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
        }

        /// <summary>
        /// SerieLabel相关配置
        /// </summary>
        /// <returns></returns>
        IEnumerator LineLabelSettings()
        {
            chart.title.subText = "SerieLabel 文本标签";
            serie.label.show = true;
            serie.label.border = false;
            chart.RefreshChart();
            while (serie.label.offset[1] < 20)
            {
                serie.label.offset = new Vector3(serie.label.offset.x, serie.label.offset.y + 20f * Time.deltaTime);
                chart.RefreshChart();
                yield return null;
            }
            yield return new WaitForSeconds(1);

            serie.label.border = true;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            serie.label.textStyle.color = Color.white;
            serie.label.textStyle.backgroundColor = Color.grey;
            chart.RefreshLabel();
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            serie.label.show = false;
            chart.RefreshChart();
        }

        /// <summary>
        /// 添加多条线图
        /// </summary>
        /// <returns></returns>
        IEnumerator LineMutilSerie()
        {
            chart.title.subText = "多系列";
            var serie2 = chart.AddSerie(SerieType.Line, "Line2");
            serie2.lineType = LineType.Normal;
            for (int i = 0; i < m_DataNum; i++)
            {
                chart.AddData(1, UnityEngine.Random.Range(30, 90));
            }
            yield return new WaitForSeconds(1);

            var serie3 = chart.AddSerie(SerieType.Line, "Line3");
            serie3.lineType = LineType.Normal;
            for (int i = 0; i < m_DataNum; i++)
            {
                chart.AddData(2, UnityEngine.Random.Range(30, 90));
            }
            yield return new WaitForSeconds(1);

            chart.yAxis0.minMaxType = Axis.AxisMinMaxType.Default;
            chart.title.subText = "多系列 - 堆叠";
            serie.stack = "samename";
            serie2.stack = "samename";
            serie3.stack = "samename";
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
        }
    }
}

6、Example11_AddSinCurve:正弦曲线效果。

/************************************************/
/*                                              */
/*     Copyright (c) 2018 - 2021 monitor1394    */
/*     https://github.com/monitor1394           */
/*                                              */
/************************************************/

using UnityEngine;

namespace XCharts.Examples
{
    [DisallowMultipleComponent]
    [ExecuteInEditMode]
    public class Example11_AddSinCurve : MonoBehaviour
    {
        private float time;
        public int angle;
        private LineChart chart;

        void Awake()
        {
            chart = gameObject.GetComponent<LineChart>();
            if (chart == null)
            {
                chart = gameObject.AddComponent<LineChart>();
            }
            chart.title.show = true;
            chart.title.text = "Sin Curve";

            chart.tooltip.show = true;
            chart.legend.show = false;

            chart.xAxes[0].show = true;//第1个x轴
            chart.xAxes[1].show = false;//第2个x轴
            chart.yAxes[0].show = true;
            chart.yAxes[1].show = false;

            chart.xAxes[0].type = Axis.AxisType.Value;
            chart.yAxes[0].type = Axis.AxisType.Value;

            chart.xAxes[0].boundaryGap = false;
            chart.xAxes[0].maxCache = 0;
            chart.series.list[0].maxCache = 0;

            chart.RemoveData();

            var serie = chart.AddSerie(SerieType.Line);
            serie.symbol.show = false;
            serie.lineType = LineType.Normal;
            for (angle = 0; angle < 1080; angle++)
            {
                float xvalue = Mathf.PI / 180 * angle;
                float yvalue = Mathf.Sin(xvalue);
                chart.AddData(0, xvalue, yvalue);
            }
        }

        void Update()
        {
            if (angle > 3000) return;
            angle++;
            float xvalue = Mathf.PI / 180 * angle;
            float yvalue = Mathf.Sin(xvalue);
            chart.AddData(0, xvalue, yvalue);
        }
    }
}

 7、Example20_BarChart:各种柱状图效果。

/************************************************/
/*                                              */
/*     Copyright (c) 2018 - 2021 monitor1394    */
/*     https://github.com/monitor1394           */
/*                                              */
/************************************************/

using System.Collections;
using UnityEngine;

namespace XCharts.Examples
{
    [DisallowMultipleComponent]
    public class Example20_BarChart : MonoBehaviour
    {
        private BarChart chart;
        private Serie serie, serie2;
        private int m_DataNum = 5;

        void Awake()
        {
            LoopDemo();
        }

        private void OnEnable()
        {
            LoopDemo();
        }

        void LoopDemo()
        {
            StopAllCoroutines();
            StartCoroutine(PieDemo());
        }

        IEnumerator PieDemo()
        {
            StartCoroutine(AddSimpleBar());
            yield return new WaitForSeconds(2);
            StartCoroutine(BarMutilSerie());
            yield return new WaitForSeconds(3);
            StartCoroutine(ZebraBar());
            yield return new WaitForSeconds(3);
            StartCoroutine(SameBarAndNotStack());
            yield return new WaitForSeconds(3);
            StartCoroutine(SameBarAndStack());
            yield return new WaitForSeconds(3);
            StartCoroutine(SameBarAndPercentStack());
            yield return new WaitForSeconds(10);

            LoopDemo();
        }

        IEnumerator AddSimpleBar()
        {
            chart = gameObject.GetComponent<BarChart>();
            if (chart == null) chart = gameObject.AddComponent<BarChart>();
            chart.title.text = "BarChart - 柱状图";
            chart.title.subText = "普通柱状图";

            chart.yAxis0.minMaxType = Axis.AxisMinMaxType.Default;

            chart.RemoveData();
            serie = chart.AddSerie(SerieType.Bar, "Bar1");

            for (int i = 0; i < m_DataNum; i++)
            {
                chart.AddXAxisData("x" + (i + 1));
                chart.AddData(0, UnityEngine.Random.Range(30, 90));
            }
            yield return new WaitForSeconds(1);
        }


        IEnumerator BarMutilSerie()
        {
            chart.title.subText = "多条柱状图";

            float now = serie.barWidth - 0.35f;
            while (serie.barWidth > 0.35f)
            {
                serie.barWidth -= now * Time.deltaTime;
                chart.RefreshChart();
                yield return null;
            }

            serie2 = chart.AddSerie(SerieType.Bar, "Bar2");
            serie2.lineType = LineType.Normal;
            serie2.barWidth = 0.35f;
            for (int i = 0; i < m_DataNum; i++)
            {
                chart.AddData(1, UnityEngine.Random.Range(20, 90));
            }
            yield return new WaitForSeconds(1);
        }

        IEnumerator ZebraBar()
        {
            chart.title.subText = "斑马柱状图";
            serie.barType = BarType.Zebra;
            serie2.barType = BarType.Zebra;
            serie.barZebraWidth = serie.barZebraGap = 4;
            serie2.barZebraWidth = serie2.barZebraGap = 4;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
        }

        IEnumerator SameBarAndNotStack()
        {
            chart.title.subText = "非堆叠同柱";
            serie.barType = serie2.barType = BarType.Normal;
            serie.stack = "";
            serie2.stack = "";
            serie.barGap = -1;
            serie2.barGap = -1;
            chart.RefreshAxisMinMaxValue();
            yield return new WaitForSeconds(1);
        }

        IEnumerator SameBarAndStack()
        {
            chart.title.subText = "堆叠同柱";
            serie.barType = serie2.barType = BarType.Normal;
            serie.stack = "samename";
            serie2.stack = "samename";
            chart.RefreshAxisMinMaxValue();
            yield return new WaitForSeconds(1);
            float now = 0.6f - serie.barWidth;
            while (serie.barWidth < 0.6f)
            {
                serie.barWidth += now * Time.deltaTime;
                serie2.barWidth += now * Time.deltaTime;
                chart.RefreshChart();
                yield return null;
            }
            serie.barWidth = serie2.barWidth;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
        }

        IEnumerator SameBarAndPercentStack()
        {
            chart.title.subText = "百分比堆叠同柱";
            serie.barType = serie2.barType = BarType.Normal;
            serie.stack = "samename";
            serie2.stack = "samename";

            serie.barPercentStack = true;

            serie.label.show = true;
            serie.label.position = SerieLabel.Position.Center;
            serie.label.border = false;
            serie.label.textStyle.color = Color.white;
            serie.label.formatter = "{d:f0}%";

            serie2.label.show = true;
            serie2.label.position = SerieLabel.Position.Center;
            serie2.label.border = false;
            serie2.label.textStyle.color = Color.white;
            serie2.label.formatter = "{d:f0}%";

            chart.RefreshLabel();
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
        }
    }
}

8、Example30_PieChart:各种饼状图效果。

/************************************************/
/*                                              */
/*     Copyright (c) 2018 - 2021 monitor1394    */
/*     https://github.com/monitor1394           */
/*                                              */
/************************************************/

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;

namespace XCharts.Examples
{
    [DisallowMultipleComponent]
    public class Example30_PieChart : MonoBehaviour
    {
        private PieChart chart;
        private Serie serie, serie1;
        private float m_RadiusSpeed = 100f;
        private float m_CenterSpeed = 1f;

        void Awake()
        {
            LoopDemo();
        }

        private void OnEnable()
        {
            LoopDemo();
        }

        void LoopDemo()
        {
            StopAllCoroutines();
            StartCoroutine(PieDemo());
        }

        IEnumerator PieDemo()
        {
            StartCoroutine(PieAdd());
            yield return new WaitForSeconds(2);
            StartCoroutine(PieShowLabel());
            yield return new WaitForSeconds(4);
            StartCoroutine(Doughnut());
            yield return new WaitForSeconds(3);
            StartCoroutine(DoublePie());
            yield return new WaitForSeconds(2);
            StartCoroutine(RosePie());
            yield return new WaitForSeconds(5);
            LoopDemo();
        }

        IEnumerator PieAdd()
        {
            chart = gameObject.GetComponent<PieChart>();
            if (chart == null) chart = gameObject.AddComponent<PieChart>();
            chart.title.text = "PieChart - 饼图";
            chart.title.subText = "基础饼图";

            chart.legend.show = true;
            chart.legend.location.align = Location.Align.TopLeft;
            chart.legend.location.top = 60;
            chart.legend.location.left = 2;
            chart.legend.itemWidth = 70;
            chart.legend.itemHeight = 20;
            chart.legend.orient = Orient.Vertical;

            chart.RemoveData();
            serie = chart.AddSerie(SerieType.Pie, "访问来源");
            serie.radius[0] = 0;
            serie.radius[1] = 110;
            serie.center[0] = 0.5f;
            serie.center[1] = 0.4f;
            chart.AddData(0, 335, "直接访问");
            chart.AddData(0, 310, "邮件营销");
            chart.AddData(0, 243, "联盟广告");
            chart.AddData(0, 135, "视频广告");
            chart.AddData(0, 1548, "搜索引擎");
            chart.RefreshLabel();

            chart.onPointerClickPie = delegate(PointerEventData e, int serieIndex, int dataIndex){

            };
            yield return new WaitForSeconds(1);
        }

        IEnumerator PieShowLabel()
        {
            chart.title.subText = "显示文本标签";

            serie.label.show = true;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
            serie.label.lineType = SerieLabel.LineType.Curves;
            chart.RefreshChart();

            yield return new WaitForSeconds(1);
            serie.label.lineType = SerieLabel.LineType.HorizontalLine;
            chart.RefreshChart();

            yield return new WaitForSeconds(1);
            serie.label.lineType = SerieLabel.LineType.BrokenLine;
            chart.RefreshChart();

            yield return new WaitForSeconds(1);
            serie.label.show = false;
            chart.RefreshChart();
        }

        IEnumerator Doughnut()
        {
            chart.title.subText = "圆环图";
            serie.radius[0] = 2f;
            while (serie.radius[0] < serie.radius[1] * 0.7f)
            {
                serie.radius[0] += m_RadiusSpeed * Time.deltaTime;
                chart.RefreshChart();
                yield return null;
            }
            serie.pieSpace = 1f;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            serie.data[0].selected = true;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);

            serie.pieSpace = 0f;
            serie.data[0].selected = false;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
        }

        IEnumerator DoublePie()
        {
            chart.title.subText = "多图组合";

            serie1 = chart.AddSerie(SerieType.Pie, "访问来源2");
            chart.AddData(1, 335, "直达");
            chart.AddData(1, 679, "营销广告");
            chart.AddData(1, 1548, "搜索引擎");
            serie1.radius[0] = 0;
            serie1.radius[1] = 2f;
            serie1.center[0] = 0.5f;
            serie1.center[1] = 0.4f;
            chart.RefreshChart();
            while (serie1.radius[1] < serie.radius[0] * 0.75f)
            {
                serie1.radius[1] += m_RadiusSpeed * Time.deltaTime;
                chart.RefreshChart();
                yield return null;
            }

            serie1.label.show = true;
            serie1.label.position = SerieLabel.Position.Inside;
            serie1.label.textStyle.color = Color.white;
            serie1.label.textStyle.fontSize = 14;
            serie1.label.border = false;

            chart.RefreshLabel();
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
        }

        IEnumerator RosePie()
        {
            chart.title.subText = "玫瑰图";
            chart.legend.show = false;
            serie1.ClearData();
            serie.ClearData();
            serie1.radius = serie.radius = new float[2] { 0, 80 };
            serie1.label.position = SerieLabel.Position.Outside;
            serie1.label.lineType = SerieLabel.LineType.Curves;
            serie1.label.textStyle.color = Color.clear;
            for (int i = 0; i < 2; i++)
            {
                chart.AddData(i, 10, "rose1");
                chart.AddData(i, 5, "rose2");
                chart.AddData(i, 15, "rose3");
                chart.AddData(i, 25, "rose4");
                chart.AddData(i, 20, "rose5");
                chart.AddData(i, 35, "rose6");
                chart.AddData(i, 30, "rose7");
                chart.AddData(i, 40, "rose8");
            }

            while (serie.center[0] > 0.25f || serie1.center[0] < 0.7f)
            {
                if (serie.center[0] > 0.25f) serie.center[0] -= m_CenterSpeed * Time.deltaTime;
                if (serie1.center[0] < 0.7f) serie1.center[0] += m_CenterSpeed * Time.deltaTime;
                chart.RefreshChart();
                yield return null;
            }
            yield return new WaitForSeconds(1);
            while (serie.radius[0] > 3f)
            {
                serie.radius[0] -= m_RadiusSpeed * Time.deltaTime;
                serie1.radius[0] -= m_RadiusSpeed * Time.deltaTime;
                chart.RefreshChart();
                yield return null;
            }

            serie.radius[0] = 0;
            serie1.radius[0] = 0;
            serie.pieRoseType = RoseType.Area;
            serie1.pieRoseType = RoseType.Radius;
            chart.RefreshChart();
            yield return new WaitForSeconds(1);
        }
    }
}

9、Example_Dynamic:不断增加数据的动态效果折线图。

/************************************************/
/*                                              */
/*     Copyright (c) 2018 - 2021 monitor1394    */
/*     https://github.com/monitor1394           */
/*                                              */
/************************************************/

using System;
using UnityEngine;

namespace XCharts.Examples
{
    [DisallowMultipleComponent]
    [ExecuteInEditMode]
    [RequireComponent(typeof(CoordinateChart))]
    public class Example_Dynamic : MonoBehaviour
    {
        public int maxCacheDataNumber = 100;
        public float initDataTime = 2;
        public bool insertDataToHead = false;

        private CoordinateChart chart;
        private float updateTime;
        private float initTime;
        private int initCount;
        private int count;
        private bool isInited;
        private DateTime timeNow;

        void Awake()
        {
            chart = gameObject.GetComponentInChildren<CoordinateChart>();
            chart.RemoveData();
            var serie = chart.AddSerie(SerieType.Line);
            serie.symbol.show = false;
            serie.maxCache = maxCacheDataNumber;
            chart.xAxes[0].maxCache = maxCacheDataNumber;
            timeNow = DateTime.Now;
            timeNow = timeNow.AddSeconds(-maxCacheDataNumber);

            serie.insertDataToHead = insertDataToHead;
            chart.xAxes[0].insertDataToHead = insertDataToHead;
        }

        void Update()
        {
            if (initCount < maxCacheDataNumber)
            {
                int count = (int)(maxCacheDataNumber / initDataTime * Time.deltaTime);
                for (int i = 0; i < count; i++)
                {
                    timeNow = timeNow.AddSeconds(1);
                    string category = timeNow.ToString("hh:mm:ss");
                    float value = UnityEngine.Random.Range(60, 150);
                    chart.AddXAxisData(category);
                    chart.AddData(0, value);
                    initCount++;
                    if (initCount > maxCacheDataNumber) break;
                }
                chart.RefreshChart();
            }
            updateTime += Time.deltaTime;
            if (updateTime >= 1)
            {
                updateTime = 0;
                count++;
                string category = DateTime.Now.ToString("hh:mm:ss");
                float value = UnityEngine.Random.Range(60, 150);
                chart.AddXAxisData(category);
                chart.AddData(0, value);
                chart.RefreshChart();
            }
        }
    }
}

 三、归纳总结

        自己项目中需要接收数据进行更新,所以就需要用代码实际操作一下,这里以折线图为主,柱状图和饼状图以后再试试,反正就是那几个插件脚本,多看看就行了。

        一、这里先做个总结:

        1、获取组件:

        private LineChart chart;//折线图

        chart = gameObject.GetComponent<LineChart>();
        if (chart == null) gameObject.AddComponent<LineChart>();

        2、获取/增加serie

        var serie = chart.series.GetSerie(0);

        var serie = chart.AddSerie(SerieType.Line);

        3、获取serie的数据个数

        var dataCount = serie.dataCount;

        4、更新serie的数据

        原型函数: public virtual bool UpdateData(int serieIndex, int dataIndex, double value)

        chart.UpdateData(0, Random.Range(0, dataCount), Random.Range(10, 90));

        5、移除所有数据

        chart.RemoveData();

        6、给x轴增加类别

        chart.AddXAxisData(category);

        7、给serie添加数据

        chart.AddData(0, xvalue, yvalue);

        可配合AddXAxisData(category)一起使用,就能实现新增曲线效果,适合一些比如随时间变化而变化曲线的效果。

        8、下一帧刷新图表

        chart.RefreshChart();

        比如chart.AddXAxisData(category);和chart.AddData(0, value);新增一条数据后,就需要刷新图表才能看得到效果。

        9、实现柱状图每一项的颜色都可渐变

看Serie.cs脚本,你会有收获的,可以控制每个data数据的特性显示。

        void ShowThreeFourData(ThreeFourDataList dataList)
        {
            if (dataList != null)
            {
                m_BarChart2.RemoveData();
                var serie = m_BarChart2.AddSerie(SerieType.Bar, "Bar");
                serie.barType = BarType.Capsule;
                serie.itemStyle.show = true;
                serie.itemStyle.color0 = Color.white;
                serie.itemStyle.toColor2 = Color.white;
                Color color1 = new Color(0f, 255f / 255f, 0f);
                Color color2 = new Color(255.0f / 255f, 43f / 255f, 61f / 255f);
                serie.itemStyle.color = color1;
                serie.itemStyle.toColor = color2;
                for (int i = 0; i < dataList.dataList.Count; i++)
                {
                    m_BarChart2.AddXAxisData(dataList.dataList[i].name);
                    m_BarChart2.AddData(0, dataList.dataList[i].temperature);
                }
                for (int i = 0; i < dataList.dataList.Count; i++)
                {
                    serie.data[i].itemStyle.show = true;
                    serie.data[i].enableItemStyle = true;
                    float len = m_ShowMaxTemperature - m_ShowMinTemperature;
                    float t = (dataList.dataList[i].temperature - m_ShowMinTemperature) / len;
                    Color c = Color.Lerp(color1, color2, t);

                    serie.data[i].itemStyle.color0 = Color.white;
                    serie.data[i].itemStyle.toColor2 = Color.white;
                    serie.data[i].itemStyle.color = color1;
                    serie.data[i].itemStyle.toColor = c;
                }
            }
        }

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值