c# 使用ChartDirector绘图的一些个人体会

引言:
      最近给客户做一个B/S架构的证券交易大屏幕软件,其中用到对证券指数的走势以及成交量的图形绘制,由于客户要求图形的清晰而且要做成于原来的老系统一样的图形显示效果,就试着用ChartDirector进行图形绘制,第一次用看着文档帮助是挺方便的,CTrl+C、CTrl+V就画出一个走势图,看着和客户给的效果图差不多,挺简单的,可到了想调整细节的时候却发现怎么都达不到想要的结果,然后到网上搜呀搜发现都是一些从帮助文档中拷贝出来的东西,而且很少有C#的,最终还是在VS智能提示的情况下凭着金山词霸的帮助将那一个个参数给试了出来,最终得到了想要的效果,好了废话不多说,下面说个人绘制的走势图主要代码(有所修改)

代码:

using ChartDirector;

//生成图形数据信息,iWidth:与画布有关的宽度,iHeight:与画布有关的高度,dlChartData:Y轴数据
        private XYChart GetTrendChart( int iWidth, int iHeight,double[] dlChartData)
        {
            try
            {
                  /***********此处代码仅供参考,个人取得画第一个点时从Y轴的中心开始,并且对应证券开盘时间******************/
                double dlLin = dlChartData[0];
                double dlMax = dlChartData[0];
                //X轴数据
                string[] XData = new string[2880];
                for (int i = 0; i < dlChartData.Length; i++)
                {
                    XData[i] = " ";

//取最小数据
                    if (dlChartData[i] < dlLin)
                        dlLin = dlChartData[i];

//取最大数据
                    if (dlChartData[i] > dlMax)
                        dlMax = dlChartData[i];
                }

//继续给未赋值的数据赋值
                for (int i = dlChartData.Length; i < 2880; i++)
                {
                    XData[i] = " ";
                }

//最小数、最大数相对于第一个点的浮动大小
                double dlFir = Math.Abs(m_KPNum - dlLin);
                double dlSec = Math.Abs(m_KPNum - dlMax);
                double dlFloat = dlFir > dlSec ? dlFir : dlSec;

/**********************************************/

/*****************开始画图***********************/

// 创建图形对象
                XYChart c = new XYChart(iWidth, iHeight);

//设置Y轴
                double dMin = Math.Round(m_KPNum - dlFloat, 2);
                double dMax = Math.Round(m_KPNum + dlFloat, 2);
                if ((dMax - dMin) < dlChartData[0] * 0.5)
                {
                    dMax = Math.Round(dlChartData[0] + dlChartData[0] * 0.5,2);
                    dMin = Math.Round(dlChartData[0] - dlChartData[0] * 0.5,2);
                }
                  //设置Y轴的取值范围
                c.yAxis().setDateScale(dMin, dMax);

//设置Y轴要显示的网格线的个数为4
                c.yAxis().setLinearScale(dMin, dMax, (dMax - dMin) / 4);

//c.yAxis().setLabel();Y轴设置过Label后就不能自动生成曲线图了,需要自己去添加线层
                //c.yAxis().setLabelGap(10);//设置Y轴标签之间的缝隙
                //c.yAxis().setLabelStep((int)(dMax-dMin)/10);//设置Y轴标签数组的显示跨度
                //c.yAxis().setLabelFormat("{value}%");//格式化标签显示内容
                ////设置网格上边和标题下边的区域大小为(50, 30),字横向排列,字体为宋体,大小为9  
                //c.addLegend(50, 30, false, "Arial Bold", 9).setBackground(Chart.Transparent);

//设置与Y轴相关的颜色,其中最后一个参数为设置Y轴伸出坐标的小头的颜色,一般不想要的话就设置成画布的背景色
                c.yAxis().setColors(0xff0000, 0xff0000, 0xff0000, 0);
                //设置Y轴标签样式
                c.yAxis().setLabelStyle("simhei.ttf", 8, 0xFFFFFF);

//设置Y轴标签的颜色(前两个和最后一个颜色各自相同,中间一个为白色)
                c.yAxis().setMultiFormat(Chart.SelectItemFilter(0), "<*color=23ff45*> {value}");
                c.yAxis().setMultiFormat(Chart.SelectItemFilter(1), "<*color=23ff45*> {value}");
                c.yAxis().setMultiFormat(Chart.SelectItemFilter(2), "<*color=FFffFF*> {value}");
                c.yAxis().setMultiFormat(Chart.SelectItemFilter(3), "<*color=ff2345*> {value}");
                c.yAxis().setMultiFormat(Chart.SelectItemFilter(4), "<*color=ff2345*> {value}");

//设置X轴
                //为了实现X轴上隔行变实线的效果,添加了几个标记
                c.xAxis().addMark(720,0xff0000);//隔行实线
                c.xAxis().addMark(1440, 0xff0000);//隔行实线
                c.xAxis().addMark(2160, 0xff0000);//隔行实线

c.xAxis().setColors(0xff0000, 0xff0000, 0xff0000, 0);
                c.xAxis().setLabelStyle("simhei.ttf", 5, 0xFFFFFF);
                c.xAxis().setLabels(XData);
                c.xAxis().setLabelStep(360
                //设置标题
                c.addTitle(Chart.Top, "上证指数", "Arial", 7.5, 0xffffff, 0x31319c);

//绘制曲线图所需的数据
                c.addLineLayer(dlChartData,0xffffff);

//设置背景色为白色 横坐标和纵坐标的网格线颜色,其中参数三和参数四为画布的大小,参数八和参数九为设置网格线为虚线(这里需要的为一个枚举变量)
                c.setPlotArea(47, 18, iWidth - 50, iHeight - 23, 0, -1, 0xff0000, c.dashLineColor(0xff0000, Chart.DotLine), c.dashLineColor(0xff0000, Chart.DotLine));

//设置背景
                c.setBackground(0);

return c;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

好了这个就是用ChartDirector实现一个虚线的网格线,并且隔行变实线,Y轴的标签显示不同的颜色,X轴显示的时间为正常的证券交易时间,曲线图为相应时间对应的数据(在前面注释部分提过)的图形,对于ChartDirector画图需要掌握它画图的原理,就能画出想要的图形对应的坐标标签,以下为提供的一些意见(仅供参考):
      1、准备的Y轴的数据数组和X轴的标签数组建议相对应,这样才能确定在坐标轴上的某个点的位置是正确的位置
      2、ChartDirector画出的图形的起始位置是从X轴的原点开始,如果想要实现从X轴的某个点开始的话需要在X轴标签数组的前部分补空,在Y轴的数据数组相应的前部分补上Y轴的最小坐标(但会出现斜线上升的情况,这个就不太理想了)。
      3、对于X轴图形的结束位置,需要的话要在数据数组后面部分补上相应的空值,这样就能使图形不至于顶到坐标轴的末尾。
      4、X轴的标签数组长度可以大于Y轴,Y轴数据数组长度最好不要大于X轴,因为这样图形就会显示不全。
      5、设置Y轴的标签数据后,就不会自动生成图形了,需要自己添加图形层。
      6、合理运用 c.xAxis().setLabelStep()这个方法。
图形结果:

c# 使用ChartDirector绘图的一些个人体会的更多相关文章

  1. ChartDirector应用笔记(三)

    前言 继上篇文章(Simple bar chart)推出之后,本篇文章继续ChartDirector的使用.在这篇Blog中,博主实现的是soft lighting bar.soft lighting ...

  2. ChartDirector应用笔记(一)

    ChartDirector介绍 ChartDirector是一款小巧精细的商业图表库.其适用的语言范围非常广泛,包括.Net, Java, Asp, VB, PHP, Python, Ruby, C+ ...

  3. iOS开发--绘图教程

    本文是<Programming iOS5>中Drawing一章的翻译,考虑到主题完整性,翻译版本中加入了一些书中未涉及到的内容.希望本文能够对你有所帮助. 本文由海水的味道翻译整理,转载请 ...

  4. iOS绘图教程 (转,拷贝以记录)

    本文是<Programming iOS5>中Drawing一章的翻译,考虑到主题完整性,在翻译过程中我加入了一些书中没有涉及到的内容.希望本文能够对你有所帮助. 转自:http://www ...

  5. iOS绘图教程

    本文是<Programming iOS5>中Drawing一章的翻译,考虑到主题完整性,翻译版本中加入了一些书中未涉及到的内容.希望本文能够对你有所帮助.(本文由海水的味道翻译整理,转载请 ...

  6. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  7. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 6. 条件

    前面的教程中,我们已经可以让小海龟绘制出各种图形了.但是,所有绘图的代码都是预先编好的,程序一旦运行起来,运行结果(绘制的图形)就是固定不变的.这一节中,咪博士将教大家如何让海龟响应用户的输入. im ...

  8. Qt Creator中的3D绘图及动画教程(参照NeHe)

    Qt Creator中的3D绘图及动画教程(参照NeHe) http://blog.csdn.net/cly116/article/details/47184729 刚刚学习了Qt Creator,发 ...

  9. ChartDirector应用笔记(可同时为Web和Qt MFC提供图表)

    ChartDirector介绍 ChartDirector是一款小巧精细的商业图表库.其适用的语言范围非常广泛,包括.Net, Java, Asp, VB, PHP, Python, Ruby, C+ ...

随机推荐

  1. JS兼容性问题(FF与IE)

    不同浏览器中js兼容问题大全 1.document.formName.item('itemName')问题 说明: //IE下(两种) document.formName.item("ite ...

  2. asp.net批量发布博客到各大博客平台

    新浪博客 http://upload.move.blog.sina.com.cn/blog_rebuild/blog/xmlrpc.php 网易博客 http://os.blog.163.com/ap ...

  3. android gallery 自定义边框+幻灯片

    最近在项目中用到图片轮播,试了Gallery,ViewFlipper,ViewPager,感觉Gallery最符合需求,但是Gallery的系统边框很难看,项目中要求用自己的背景图片. 下面来看一下使 ...

  4. PHP中 对象自动调用的方法:__set()、__get()、__tostring()

    总结: (1)__get($property_name):获取私有属性$name值时,此对象会自动调用该方法,将属性name值传给参数$property_name,通过这个方法的内部 执行,返回我们传 ...

  5. linux - 开机启动thunderbird、chromium

    cd ~/.config/autostart/(没有autostart,自己 mkdir autostart) vim thunderbird.desktop,输入以下: [Desktop Entry ...

  6. MPI编程的常用接口速查

    获取当前时间 在插入MPI提供的头文件后,可以获得获取时间的函数. double MPI_Wtime(void) 取得当前时间, 计时的精度由 double MPI_Wtick(void) 取得作为对 ...

  7. 浏览器兼容——jquery的html()不兼容IE

    在看着一个页面A,是一个弹出框,用的jquery中的ajax,然后弹出的内容是另一个Div的.而所出现的问题,是在浏览器中都有弹出框,但是只有谷歌和火狐中的弹出框中内容. 当时,我所想到的是另一个问题 ...

  8. 【转】Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38377229 ,本文出自[张鸿洋的博客] 很多人面试肯定都被问到过,请问Andr ...

  9. 各个城市优步uber注册司机官网地址汇总

    uber城市 开通uber城市 开通优步城市 哪些城市开通了uber   哪些城市开通了优步 分类: uber专车资讯 作为专车模式的创立者,Uber公司很早就进入了中国区域.优步在中国市场也是胸怀大 ...

  10. 将string转化为char*的方法

    在构造文件流变量时候发现,fstream的第一个参数,即文件路径必须是const char * 如: string s = "/home/user/1.txt"; fstream ...