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. 解决魅族USB调试无法被电脑识别的问题(含Mac OS X、Win7)

      每次打开豌豆荚或者360手机助手之类手机助手后Eclipse才会检测到mx4(实际上是豌豆荚关闭eclipse的adb使用自己的驱动连接的).解决方法就是在"adb_usb.ini&qu ...

  2. Raphael 目标点沿路径不断移动

    <!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8" ...

  3. MYSQL设计方案

    Scale Out:横向扩展,增加处理节点提高整体处理能力Scale Up:纵向扩展,通过提升单个节点的处理能力达到提升整体处理能力的目的 ReplicationMySQL的replication是异 ...

  4. mssql的delete用用到被delete的表的别名

    +' delete m from '+@strDBName +'.dbo.m_device as m where not exists ' +' (select 1 from @tmpDevice w ...

  5. ECSHOP - 二次开发指南---购物车篇

    第一个问题 保存用户购物车数据ECSHOP的购物车数据,是以Session 方式存储在数据库里,并在Session结束后 ,Distroy 掉,解决方法是: 1.购物车内容读取方式. 更改登陆后购物车 ...

  6. Linux下的sniffer工具--TcpDump的安装和使用

    在如今众多的黑客技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一. 用过windows平台上的sniffer工具(例如,netxray和sniffer pro软件)的朋友可能都知道,在共 ...

  7. HDU 5744 Keep On Movin

    Keep On Movin Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  8. HDU 2056 Rectangles

    Rectangles Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. HDU 1025-Constructing Roads In JGShining's Kingdom(最长不降子序列,线段树优化)

    分析: 最长不降子序列,n很大o(n^2)肯定超,想到了小明序列那个题用线段树维护前面的最大值即可 该题也可用二分搜索来做. 注意问题输出时的坑,路复数后加s #include <map> ...

  10. Hadoop 学习之 FAQ

    在Hadoop的学习与使用过程中同样如此.这里为大家分享Hadoop集群设置中经常出现的一些问题,以下为译文: 1.Hadoop集群可以运行的3个模式? 单机(本地)模式 伪分布式模式 全分布式模式 ...