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绘图的一些个人体会的更多相关文章
- ChartDirector应用笔记(三)
前言 继上篇文章(Simple bar chart)推出之后,本篇文章继续ChartDirector的使用.在这篇Blog中,博主实现的是soft lighting bar.soft lighting ...
- ChartDirector应用笔记(一)
ChartDirector介绍 ChartDirector是一款小巧精细的商业图表库.其适用的语言范围非常广泛,包括.Net, Java, Asp, VB, PHP, Python, Ruby, C+ ...
- iOS开发--绘图教程
本文是<Programming iOS5>中Drawing一章的翻译,考虑到主题完整性,翻译版本中加入了一些书中未涉及到的内容.希望本文能够对你有所帮助. 本文由海水的味道翻译整理,转载请 ...
- iOS绘图教程 (转,拷贝以记录)
本文是<Programming iOS5>中Drawing一章的翻译,考虑到主题完整性,在翻译过程中我加入了一些书中没有涉及到的内容.希望本文能够对你有所帮助. 转自:http://www ...
- iOS绘图教程
本文是<Programming iOS5>中Drawing一章的翻译,考虑到主题完整性,翻译版本中加入了一些书中未涉及到的内容.希望本文能够对你有所帮助.(本文由海水的味道翻译整理,转载请 ...
- Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)
前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 6. 条件
前面的教程中,我们已经可以让小海龟绘制出各种图形了.但是,所有绘图的代码都是预先编好的,程序一旦运行起来,运行结果(绘制的图形)就是固定不变的.这一节中,咪博士将教大家如何让海龟响应用户的输入. im ...
- Qt Creator中的3D绘图及动画教程(参照NeHe)
Qt Creator中的3D绘图及动画教程(参照NeHe) http://blog.csdn.net/cly116/article/details/47184729 刚刚学习了Qt Creator,发 ...
- ChartDirector应用笔记(可同时为Web和Qt MFC提供图表)
ChartDirector介绍 ChartDirector是一款小巧精细的商业图表库.其适用的语言范围非常广泛,包括.Net, Java, Asp, VB, PHP, Python, Ruby, C+ ...
随机推荐
- xcode6.3 编译ffmpeg 2.6.3(已验证编译成功)
1.解压ffmpeg2.6.3源代码,在根目录下新建文件myconfig,内容如下,执行命令chmod 777 ./myconfig 2../myconfig 3.make 4.make instal ...
- 【转】Github轻松上手1-Git的工作原理与设置
转自:http://blog.sina.com.cn/s/blog_4b55f6860100zzgp.html 作为一个程序猿,如果没有接触过stack overflow和Github,就如同在江湖中 ...
- Data Binding(数据绑定)用户指南
1)介绍 这篇文章介绍了如何使用Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件. Data Binding库不仅灵活而且广泛兼容- 它 ...
- iE6、7、8、9、10、11兼容的Cookie
<%@ Master Language="C#" Debug="true" AutoEventWireup="true" Inheri ...
- Oracle数据库表结构导出
1. 在PL/SQL中找到"工具--导出用户对象"菜单.点击运行.
- android Vibrator 使用
private Vibrator vibrator; 取得震动服务的句柄 vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 或者 vi ...
- codeforces 680E Bear and Square Grid 巧妙暴力
这个题是个想法题 先预处理连通块,然后需要用到一种巧妙暴力,即0变1,1变0,一列列添加删除 复杂度O(n^3) #include <cstdio> #include <iostre ...
- C++实现网格水印之调试笔记(五)—— 提取出错
在实现提取水印的过程中,遇到了一些问题 首先还是根据论文中的思路来梳理一下整个提取流程 读入两个模型,一个原始模型ori_mesh, 一个水印模型wm_mesh. 将两个模型对齐(即放在同一个坐标系下 ...
- javascript跑马灯抽奖
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android Environment 类详解
Android应用开发中,常使用Environment类去获取外部存储目录,在访问外部存储之前一定要先判断外部存储是否已经是可使用(已挂载&可使用)状态, 并且需要在AndroidManife ...