本教程将以 C++ 和 Python 为主要示例,因为它们是数据分析和后端开发中非常常见的语言,其他语言的 API 非常相似,可以举一反三。

目录
-
第一部分:ChartDirector 简介
- 什么是 ChartDirector?
- 核心优势
- 官方资源
-
第二部分:安装与环境配置
- C++ 版本
- Python 版本
- 验证安装
-
第三部分:ChartDirector 核心概念
- 图表的基本构成
- 创建图表的“三步走”流程
- 关键对象
-
第四部分:实战教程(从简单到复杂)
(图片来源网络,侵删)- 示例 1:绘制一个简单的柱状图
- 示例 2:折线图与数据点标记
- 示例 3:饼图及其标签格式化
- 示例 4:多轴图表(双Y轴)
- 示例 5:组合图表(柱状图 + 折线图)
-
第五部分:进阶主题
- 自定义样式(颜色、字体、边框)
- 添加图例、标题和工具提示
- 交互功能(热点、URL链接)
- 输出图表(图片、网页)
-
第六部分:常见问题与技巧
第一部分:ChartDirector 简介
什么是 ChartDirector?
ChartDirector 是一个专业的图表组件库,用于在各种应用程序中快速创建高质量的 2D 和 3D 图表,它被设计为高性能、轻量级且易于集成。
核心优势
- 高性能:使用 C++ 核心编写,渲染速度极快。
- 功能全面:支持超过 50 种图表类型,包括所有常见的金融、统计和科学图表。
- 易于使用:API 设计直观,只需几行代码就能创建复杂的图表。
- 高度可定制:从颜色、字体到布局,几乎图表的每一个元素都可以自定义。
- 跨平台:支持 Windows, Linux, macOS 等多种操作系统。
- 多语言支持:提供 C++, Java, .NET, Perl, Python, Ruby, PHP, JavaScript 等多种语言的接口。
官方资源
- 官方网站:http://www.advsofteng.com/
- 官方文档:http://www.advsofteng.com/doc/ (非常重要,包含所有 API 参考)
- 示例库:http://www.advsofteng.com/gallery/ (提供了数百个可运行的示例代码和效果图)
第二部分:安装与环境配置
C++ 版本
-
下载:从 ChartDirector 下载页面 下载对应你的操作系统(32/64位)的 C++ 版本。
-
解压:将下载的压缩包解压到一个固定目录,
C:\ChartDirector。 -
配置环境:
- 头文件路径:将解压目录下的
include文件夹路径添加到你的 C++ 编译器的包含路径中。 - 库文件路径:将解压目录下的
lib文件夹路径添加到你的 C++ 编译器的库路径中。 - 链接库:在链接阶段,链接
chartdir.lib(Windows) 或libchartdir.a(Linux)。 - 运行时库:确保
chartdir.dll(Windows) 或libchartdir.so(Linux) 在程序的运行路径下。
以 Visual Studio 为例:
- 项目属性 -> C/C++ -> 常规 -> 附加包含目录:
C:\ChartDirector\include - 项目属性 -> 链接器 -> 常规 -> 附加库目录:
C:\ChartDirector\lib - 项目属性 -> 链接器 -> 输入 -> 附加依赖项:
chartdir.lib
- 头文件路径:将解压目录下的
Python 版本
-
安装:最简单的方式是通过 pip,ChartDirector 提供了一个预编译的 Python 包。
pip install chartdir
-
验证安装:
import chartdir print(chartdir.getVersion())
如果能打印出版本号,说明安装成功。
第三部分:ChartDirector 核心概念
图表的基本构成
一个典型的 ChartDirector 图表由以下部分组成:
- Plot Area (绘图区):实际绘制数据图形的区域。
- Axes (坐标轴):X轴和Y轴,带有刻度和标签。
- Legend (图例):解释不同数据系列的颜色或符号。
- Title (标题):图表的名称。
- Data (数据):要可视化的数值。
创建图表的“三步走”流程
无论创建什么类型的图表,基本流程都遵循以下三个核心步骤:
- 准备数据:将你的数据整理成 ChartDirector 能识别的格式,通常是
ArrayDouble(C++) 或list(Python)。 - 创建图表对象:使用
XYChart(用于XY图表) 或PieChart(用于饼图) 等类来创建一个图表容器。 - 添加元素并渲染:
- 使用
addTitle(),setPlotArea(),addLegend()等方法设置图表的基本布局。 - 使用
addBarLayer(),addLineLayer(),addDataSet()等方法将数据添加到图表中,并指定图表类型。 - 使用
makeChart()方法将图表对象渲染成图片文件(如 PNG, JPG)或二进制流。
- 使用
关键对象
Chart(或XYChart,PieChart):图表的核心对象,是所有其他元素的容器。Layer(图层):用于绘制同一类型的数据系列,一个柱状图可以是一个BarLayer,一个折线图可以是一个LineLayer,你可以在一个图表上叠加多个图层。DataSet(数据集):一个图层可以包含多个数据集,一个BarLayer可以包含两个DataSet来创建并排的柱状图。Axis(坐标轴):通过chart.xAxis()和chart.yAxis()获取,用于配置坐标轴的样式、标签和刻度。
第四部分:实战教程(从简单到复杂)
示例 1:绘制一个简单的柱状图
目标:创建一个显示季度销售额的柱状图。
C++ 代码
#include "ChartDirector.h"
#include <stdio.h>
int main() {
// 1. 准备数据
double data[] = {210, 150, 180, 250};
const char* labels[] = {"Q1", "Q2", "Q3", "Q4"};
// 2. 创建图表对象 (600x400像素)
XYChart* c = new XYChart(600, 400);
// 3. 添加元素并渲染
// 3.1 添加标题
c->addTitle("2025年季度销售额", "Arial", 20);
// 3.2 设置绘图区 (留出边距给坐标轴标签和标题)
c->setPlotArea(50, 60, 500, 300);
// 3.3 添加数据 (一个柱状图层)
BarLayer* layer = c->addBarLayer(ArrayDouble(data, sizeof(data)/sizeof(data[0])),
"gold");
// 3.4 设置X轴标签
c->xAxis()->setLabels(StringArray(labels, sizeof(labels)/sizeof(labels[0])));
// 3.5 输出图表为PNG文件
c->makeChart("sales_bar.png");
// 释放对象
delete c;
printf("图表已生成: sales_bar.png\n");
return 0;
}
Python 代码
import chartdir
import os
# 1. 准备数据
data = [210, 150, 180, 250]
labels = ["Q1", "Q2", "Q3", "Q4"]
# 2. 创建图表对象 (600x400像素)
c = chartdir.XYChart(600, 400)
# 3. 添加元素并渲染
# 3.1 添加标题"2025年季度销售额", "Arial", 20)
# 3.2 设置绘图区 (留出边距给坐标轴标签和标题)
c.setPlotArea(50, 60, 500, 300)
# 3.3 添加数据 (一个柱状图层)
layer = c.addBarLayer(data, "gold")
# 3.4 设置X轴标签
c.xAxis().setLabels(labels)
# 3.5 输出图表为PNG文件
c.makeChart("sales_bar.png")
print("图表已生成: sales_bar.png")
示例 2:折线图与数据点标记
目标:在折线图的数据点上显示圆形标记。
Python 代码
import chartdir
# 数据
data = [30, 28, 40, 55, 75, 68, 90]
labels = ["一月", "二月", "三月", "四月", "五月", "六月", "七月"]
c = chartdir.XYChart(600, 400)"月度用户增长趋势")
c.setPlotArea(50, 60, 500, 300)
# 添加折线图层
layer = c.addLineLayer(data, "blue")
# 在数据点上添加圆形标记
layer.setDataSymbol(chartdir.CircleSymbol, 8, "blue", "white")
c.xAxis().setLabels(labels)
c.yAxis().setTitle("用户数 (千)")
c.makeChart("line_chart.png")
示例 3:饼图及其标签格式化
目标:创建一个带百分比和引导线的饼图。
Python 代码
import chartdir
# 数据
data = [25, 18, 15, 12, 30]
labels = ["搜索引擎", "直接访问", "社交媒体", "邮件营销", "其他"]
colors = ["#3399FF", "#FFCC33", "#FF9933", "#66CC99", "#CC99FF"]
c = chartdir.PieChart(600, 400)"网站流量来源")
# 添加数据
layer = c.addChartLayer(chartdir.PieChart, data, colors)
# 设置标签格式: 显示名称和百分比
layer.setDataLabelFormat("{label} ({value}%)")
# 启用引导线
layer.setLeaderLines(chartdir.LineStyle, 0x000000)
c.makeChart("pie_chart.png")
示例 4:多轴图表(双Y轴)
目标:在同一个图表中显示两组不同量级的数据,分别对应左右两个Y轴。
Python 代码
import chartdir
# 数据
# 左Y轴数据 (温度)
data0 = [25, 28, 31, 33, 30, 27, 25]
# 右Y轴数据 (销售额)
data1 = [15000, 18000, 22000, 25000, 21000, 19000, 20000]
labels = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
c = chartdir.XYChart(700, 400)"每日温度与销售额")
c.setPlotArea(50, 60, 600, 300)
# 创建左Y轴 (温度)
c.yAxis().setTitle("温度 (°C)")
# 创建右Y轴 (销售额)
c.yAxis2().setTitle("销售额 (元)")
# 将右Y轴的数据映射到右轴
layer1 = c.addLineLayer(data1, "#CC3333")
layer1.useYAxis(c.yAxis2())
# 添加左Y轴的数据 (温度)
layer0 = c.addLineLayer(data0, "#003366")
layer0.setLineWidth(3)
c.xAxis().setLabels(labels)
c.xAxis().setLabelsRotation(45) # 旋转标签以防重叠
c.makeChart("multi_axis_chart.png")
示例 5:组合图表(柱状图 + 折线图)
目标:使用柱状图表示销售额,用折线图表示利润率。
Python 代码
import chartdir
# 数据
sales = [150, 180, 200, 240, 220, 250, 280]
profitMargin = [8.2, 9.5, 10.1, 11.2, 10.5, 11.8, 12.5]
labels = ["Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7"]
c = chartdir.XYChart(700, 400)"季度销售额与利润率")
c.setPlotArea(50, 60, 600, 300)
# 添加柱状图层 (销售额)
barLayer = c.addBarLayer(sales, "#3399FF")
barLayer.setAggregateStyle(chartdir.AggregateSideBySide) # 如果有多个数据集,可以并排显示
# 添加折线图层 (利润率)
lineLayer = c.addLineLayer(profitMargin, "#FF9900")
lineLayer.setLineWidth(2)
lineLayer.setDataSymbol(chartdir.CircleSymbol, 6, "#FF9900", "#FFFFFF")
# 配置Y轴
c.yAxis().setTitle("销售额 (万元)")
c.yAxis2().setTitle("利润率 (%)")
lineLayer.useYAxis(c.yAxis2()) # 将折线图的数据映射到右Y轴
c.xAxis().setLabels(labels)
c.makeChart("combo_chart.png")
第五部分:进阶主题
自定义样式
几乎所有样式都可以通过 setXXX 方法修改。
# 设置坐标轴标签的字体和颜色
c.xAxis().setLabelStyle("Arial", 10, 0x333333)
# 设置绘图区背景色和边框
c.setPlotArea(50, 60, 500, 300, 0xEEEEEE, 0x888888, 1)
# 设置柱状图的颜色和边框
layer.setColors(["#66CCFF", "#FFCC66", "#99CC99"])
layer.setBorderColor(0x000000)
添加图例、标题和工具提示
# 添加图例
c.addLegend(500, 100, False, "Arial", 12).setAlignment(chartdir.TopRight)
c.addSubtitle("数据来源:市场部")
# 设置工具提示格式
# {x}: X轴标签, {value}: 数据值, {dataSetName}: 数据系列名
layer.setDataLabelFormat("{value}")
layer.setHTMLImageMap("", "", "title='{dataSetName}: {value}'")
交互功能(热点、URL链接)
ChartDirector 可以生成带有 HTML Image Map 的图表,实现点击交互。
# ... (创建图表和数据层)
# 为每个数据点生成一个可点击的区域,并关联到URL
# URL模板: {dataSetName} 和 {x} 会被替换为实际值
layer.setURLTemplate("report.php?year={x}&product={dataSetName}")
# 生成包含 Image Map 的 HTML 文件
c.makeChart("interactive_chart.html")
interactive_chart.html 文件将包含 <img> 标签和一个 <map> 区域,点击图表不同部分会跳转到相应的 report.php 页面。
输出图表
makeChart() 方法非常灵活,支持多种格式。
# 输出为PNG文件
c.makeChart("output.png")
# 输出为JPEG文件
c.makeChart("output.jpg")
# 输出为GIF文件
c.makeChart("output.gif")
# 输出为SVG文件 (矢量图)
c.makeChart("output.svg")
# 获取图表的二进制数据 (用于Web框架直接返回)
chart_data = c.makeChart(chartdir.PNG)
# response.write(chart_data) # 在 Flask/Django 等框架中使用
第六部分:常见问题与技巧
-
中文乱码问题: 这是最常见的问题,解决方案是确保你的系统支持中文,并在代码中指定中文字体。
# 使用系统中存在的中文字体 c.addTitle("图表标题", "SimHei", 20) # 黑体 c.xAxis().setLabels(["标签一", "标签二"], "Microsoft YaHei") # 微软雅黑 -
图表中显示负数: ChartDirector 会自动处理负数,你只需要将负数数据传入即可,它会自动在X轴下方绘制。
-
如何隐藏网格线?
# 隐藏垂直网格线 c.xAxis().setGridLines(0, 0, 0, 0) # 隐藏水平网格线 c.yAxis().setGridLines(0, 0, 0, 0)
-
如何调整坐标轴的范围?
# 设置Y轴从0到100 c.yAxis().setLinearScale(0, 100) # 或者让ChartDirector自动计算,但设置一个最小值 c.yAxis().setMargin(10) # 设置10%的底部边距,使最小值不为0
-
在哪里找到更多示例? 官方示例库是最好的老师! http://www.advsofteng.com/gallery/,你可以根据图表类型找到示例代码,并直接在你的项目中修改使用。
希望这份详细的教程能帮助你快速上手 ChartDirector!祝你使用愉快!
