热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ChartDirector应用笔记(可同时为Web和QtMFC提供图表)

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

      ChartDirector是一款小巧精细的商业图表库。其适用的语言范围非常广泛,包括.Net, Java, Asp, VB, PHP, Python, Ruby, C++等。ChartDirector既可以为WEB应用提供图表支持,还能为桌面应用提供良好的图表体验。除此之外,ChartDirector还能与MFC, Qt等界面框架无缝结合。这一点,在官方提供的帮助文档中即可窥知一二。在本系列文章中,也将以Qt应用程序框架作为基础,编写各种图表的应用实例。

     正如上面所说的,ChartDirector是一款商业图表库。在未获得官方使用授权的情况下使用,图表中会出现黄色标识符。作为独立的个人开发者,显然无法也不必要去购买该库的使用证书。网上的破解方式也比较多,基本上是对官方附带的Dll文件进行破解覆盖即可。

ChartDirector类层次

ChartDirector库中有三大类继承结构较为常用,下面画出了这三大类继承结构:

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

图表类继承层次是对整个ChartDirector库的功能总结。从上图可以看出,ChartDirector类库能够绘制七大种类的图表:MultiChart, PolarChart, ThreeDChart, BaseMeter, PieChart, XYChart, PyramidChart。其中,金融类图表FinanceChart继承自MultiChart。金融类图表常常包含各种参数和指标,因此使用MultiChart作为基类继承也是情理中的事情。ThreeDChart类派生出了两个子类:SurfaceChart和ThreeDScatterChart。这两个子类用于绘制3D图表,3D图表经常用于立体表现数据差异,绘制出来的图表具有较强的立体视效。BaseMeter类代表仪表基类,派生子类包括:AngularMeter和LinearMeter类。如类名所示的那样,AngularMeter绘制的仪表常常带有弧度,而LinearMeter类则是线性绘制仪表,通常具有水平或者垂直外观。

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

XYChart类是ChartDirector类库中的一个大类,凡是包含X、Y坐标的图表都属于XYChart。因此,用于XYChart类的Layer类也派生出了丰富的子类,用于实现不同类型的XY图表。Layer类的具体作用是什么呢?由于官方文档上并未对ChartDirector的设计架构进行阐述,因此只能对Layer的功能进行推测理解。我的理解是,Layer就是一般意义上的图层,如果需要在同一个画板上绘制多个XY图表,需要组合不同的Layer类。不同的Layer可以组合在一起,实现复杂的功能。一般在绘制图表的时候,需要根据不同的图表类型添加不同的Layer派生类。

下面是Polar/Radar类的图层类继承层次:

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

可以看到,PolarChart类的图层类相对较少,样式比较固定。以PolarLayer类为基类派生出了PolarLineLayer, PolarAreaLayer, PolarVectorLayer三个类。

整个ChartDirector类库基本上主要就是由上述这些类组成的。当然,还包括Array, Axis, Box, Sector类辅助类。从这方面考察,ChartDirector类库还是足够轻巧的,学习使用上也较为简单。遗憾的是,附带的说明文档并未涉及太多的架构方面的说明。因此,在完全理解ChartDirector库的设计理念方面存在一定困难。

重要概念

要熟练运用ChartDirector类库需要理解好一些概念。下面是本人的一些总结和理解:

  • Chart对象。Chart对象是绘图的基础,可以是上述图表类继承层次中的任意一个类的对象。每一个绘制出来的图表都属于特定的图表类。如帮助文档中的Simple Bar Chart,这是一个简单的XYChart的应用实例,生成的chart对象是XYChart类的实例。总之,在绘制每一个图表前都需要实例化一个Chart对象。
  • Layer类。Layer类在上面稍微提过,我将之理解为图片处理中的图层。Layer之间可以叠加以组合绘制出更加复杂的图表。值得注意的是,不同的图表组件需要对应的Layer类来实现。在XYChart类中,实现了很多了add*函数用于给chart对象添加图层。如addLineLayer, addBarLayer,  addBoxLayer等。
  • PlotArea。PlotArea类表示XY图表中的绘图区域。在绘制XY图表的过程中,设置PlotArea是Chart对象实例化完成后需要做的第一件事。PlotArea使用像素坐标系统,也就是说:(0,0)位于绘制区域的左上方,X轴往右增加,Y轴往下增加。对于其他种类的图表,PlotArea这个概念并不存在。
  • DrawArea。DrawArea类处于绘图底层,是整个类库绘图的重要基础。ChartDirector类库中所有的图表类都在内部维护一个DrawArea对象,该对象用于提供绘制原语,如绘制线条、形状、文本等。用户也可以通过获取DrawArea对象来自定义绘制选项。
  • QChartViewer. QChartViewer是用来整合ChartDirector类库到Qt框架中来的中间类。该类继承自QLabel和ViewPortManager类,用于表现图表绘制结果,处理鼠标、键盘交互事件等。在ChartDirector类库中,QChartViewer类以源代码的形式附带。用户可以查看其的实现方式,也可以直接包含进Qt工程中进行使用。

绘制步骤

以simple bar chart为例:

  1. 生成Chart对象:XYChart* c = new XYChart(250, 250);
  2. 设置绘图区域(可选):c->setPlotArea(30, 20, 200, 200);
  3. 添加图层(可选):c->addBarLayer(...);
  4. 设置坐标参数:c->xAxis()->setLabels(...); c->yAxis()->setLabels(...);

下一篇讲述Simple Bar Chart的使用。

 

http://www.cnblogs.com/csuftzzk/p/3496695.html

 

 

在Qt中使用ChartDirector,配置好工程属性并拷贝相应的库文件到工程目录下。以下以绘图代码为主进行分析:

 

ChartDirector应用笔记(可同时为Web和Qt MFC提供图表)
 1 //Y轴数据
 2  const double data[] = {450, 560, 630, 800, 1100, 1350, 1600, 1950, 2300, 2700};
 3  //X轴标记
 4  const char* lbs[] = {"1996", "1997", "1998", "1999", "2000", "2001", "2002", "2003", "2004", "2005"};
 5  //给图表添加标题,该标题绘制于PlotArea区域以外。指定文本内容的时候,我们还需要指定文本字体,以及字体大小。
 6  //在windows XP系统的C:\WINDOWS\Fonts下,可以查看系统所带字体库。
 7  c->addTitle(msg.mainTitle.c_str(), "timesbi.ttf", 18);
 8  // 设置PlotArea区域,setPlotArea()函数所带参数较多,在这里我们可以设置PlotArea区域的大小以及在Chart画布中的位置。
 9  // 前面四个参数设置PlotArea区域在XYChart绘图坐标中的位置及大小,最后的两个参数指定水平、垂直栅格线的颜色。
10  // XYChart的linearGradientColor()可以用于设置PlotArea区域的渐变色,前面四个参数指定渐变区域,后面的两个颜色值指定
11  // 颜色渐变范围。
12  c->setPlotArea(50, 40, 340, 250,
13       c->linearGradientColor(30, 20, 30, 290, msg.bgColor, 0x000000),
14       -1,
15       0xffffff, 
16       msg.gridColor,
17       msg.gridColor);
18  // 添加一个图层BarLayer。在这个图层中,我们使用了IntArray(0, 0)来指定Bars的颜色值。也就是说,我们并没有指定Bar的颜色。
19  // 在这种情况下,ChartDirector会自动从默认调色板中依次选择颜色来填充Bars。
20  // 在这里我们调用了setBorderColor()来设置soft lighting效果。根据不同的值:Left, Right,光影出现在bars的不同侧。
21  c->addBarLayer(DoubleArray(data, (int)(sizeof(data)/sizeof(data[0]))), 
22       IntArray(0, 0))->setBorderColor(Chart::Transparent, Chart::softLighting(msg.lightDirection));
23  // 设置X轴标记
24  c->xAxis()->setLabels(StringArray(lbs, (int)(sizeof(lbs)/sizeof(lbs[0]))));
25  // 设置X轴的标记位移。
26  c->xAxis()->setTickOffset(0.5);
27  // 设置X, Y轴的标题说明的字体和字体大小
28  c->xAxis()->setTitle(msg.xTitle.c_str(), "timesbi.ttf", 8);
29  c->yAxis()->setTitle(msg.yTitle.c_str(), "timesbi.ttf", 8);
30  // 设置X, Y轴轴线的宽度,这里为2个像素宽。
31  c->xAxis()->setWidth(2);
32  c->yAxis()->setWidth(2);
ChartDirector应用笔记(可同时为Web和Qt MFC提供图表)

 

小结

  1. Chart绘图区域和PlotArea大小要区分清楚:Chart绘图区域是整个画布的大小,所有后续的绘图操作都在这张画布上进行操作,包括XY坐标区域,XY坐标轴标志、名称等数据。Chart区域大小在生成XYChart对象的时候指定;PlotArea对象在前面已经说过了,针对于XYChart才有意义。在XYChart中,PlotArea代表的区域是由X, Y轴形成的矩形区域,不包括X, Y轴的标记、名称以及图表标题。所有的图层(Layer)也是覆盖在PlotArea上面进行操作的。
  2. ChartDirector支持的图片文件格式包括png, jpg, jpeg, gif, bmp, SVG等。其中SVG格式需要在生成图表文件之前,调用BaseChart.enableVectorOutput进行设置。

http://www.cnblogs.com/csuftzzk/p/3504161.html


推荐阅读
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
author-avatar
挖墙找红杏000
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有