【Qwt 7.0 系列】快速入门与核心新特性概览 ------ 更现代的 Qt 数据可视化库
本文是 Qwt 7.0 系列介绍和教程,如果你正在寻找一个高性能、协议友好、同时支持 2D 和 3D 绘图的 Qt 数据可视化库,那么这篇文章就是为你准备的。
系列总述文章:Qwt 7.0 ------ 基于 Qt 的高性能 2D/3D 绘图库
概述 | 高性能曲线绘制 | 常用图表类型 | 高级科学图表 | 多坐标轴与布局 | 交互功能 | 3D 数据可视化 | 坐标轴与刻度 | 控件与辅助元素 | 总体架构解析 | matplotlib 风格绘图
目录
- [一、引言:为什么选择 Qwt 7.0?](#一、引言:为什么选择 Qwt 7.0?)
- [二、Qwt 7.0 核心新特性概览](#二、Qwt 7.0 核心新特性概览)
- [2.1 CMake 构建系统 + Qt6 兼容](#2.1 CMake 构建系统 + Qt6 兼容)
- [2.2 单文件引入方式](#2.2 单文件引入方式)
- [2.3 2D/3D 绘图一体化](#2.3 2D/3D 绘图一体化)
- [2.4 QwtFigure ------ 多绘图布局容器](#2.4 QwtFigure —— 多绘图布局容器)
- [2.5 寄生绘图 ------ 多坐标轴系统](#2.5 寄生绘图 —— 多坐标轴系统)
- [2.6 坐标轴内置交互动作](#2.6 坐标轴内置交互动作)
- [2.7 实时平移与整体画布缩放](#2.7 实时平移与整体画布缩放)
- [2.8 数据拾取功能](#2.8 数据拾取功能)
- [2.9 箱线图 QwtPlotBoxChart](#2.9 箱线图 QwtPlotBoxChart)
- [2.10 其他实用改进](#2.10 其他实用改进)
- [三、快速集成 Qwt 7.0](#三、快速集成 Qwt 7.0)
- [3.1 CMake 引入方式(推荐)](#3.1 CMake 引入方式(推荐))
- [3.2 单文件引入方式](#3.2 单文件引入方式)
- 四、第一个绘图示例
- [五、与旧版本 Qwt 6.x 的主要区别](#五、与旧版本 Qwt 6.x 的主要区别)
- 六、总结与系列预告
一、引言:为什么选择 Qwt 7.0?
在 Qt 生态中,能用来做数据可视化的库不算多,主流选择有 QCustomPlot、Qwt、Qt Charts 和 KDChart。Qt 6.8 之后,官方把 Qt Charts(2D)与 Qt DataVisualization(3D)合并为统一的 Qt Graphs 模块,底层全部基于 Qt Quick Scene Graph + Qt Quick 3D。但这条路并不适合所有人------Qt Graphs 必须通过 QQuickWidget 或 QQuickWindow 嵌入,必须带上 QML runtime,C++ 支持不足,且不支持 Win7 等老系统,对嵌入式也不友好。
我们先来看看几大库的横向对比:
| 库 | 协议 | 优势 | 劣势 |
|---|---|---|---|
| QCustomPlot | GPL | 简单易用,开箱即用 | GPL 传染性,商业不友好 |
| Qwt | LGPL | 性能优越,架构合理 | 原作者停止更新,部署较难 |
| Qt Charts | GPL | Qt 官方 | 效率低,GPL 协议 |
| KDChart | MIT (3.0+) | 商业友好 | 渲染效果一般 |
可以看到,Qwt 的 LGPL 协议对商业应用非常友好,性能和架构也很优秀。但原版 Qwt 的问题是:作者已停止更新,构建系统还停留在 qmake 时代,对 Qt6 的支持也不完善。
Qwt 7.0 正是为解决这些问题而生。它基于原版 Qwt 6.2.0 进行维护和改进,添加了 CMake 构建、Qt6 兼容、2D/3D 一体化、现代化 UI 风格等大量新功能,使其成为协议友好、性能优越、方便使用的 Qt 数据可视化库。
如果你之前用过原版 Qwt 6.x,你会发现 Qwt 7.0 在保持 API 兼容的前提下,做了大量现代化改进。如果你是从 QCustomPlot 或 Qt Charts 转过来的,你会发现 Qwt 7.0 的 API 设计更加合理,功能也更丰富。
二、Qwt 7.0 核心新特性概览
Qwt 7.0 相对于原版 Qwt 6.2.0 引入了大量新特性,下面逐一介绍。
2.1 CMake 构建系统 + Qt6 兼容
Qwt 7.0 告别了传统的 qmake,采用现代化的 CMake 构建系统,同时兼容 Qt 5.12+ 和 Qt 6.x。这意味着:
- C++11/17 标准支持:Qt5.12+ 使用 C++11,Qt6 使用 C++17
find_package(qwt)一键引入:标准的 CMake 包管理- 现代 C++ 特性 :全面使用
auto、nullptr、override、final、智能指针、范围 for 循环等
对于原版 Qwt 6.x 用户来说,这是一个巨大的改进------你不再需要手动配置 .pro 文件,也不需要担心 Qt6 的兼容性问题。
2.2 单文件引入方式
借鉴 QCustomPlot 的设计理念,Qwt 7.0 提供了一种极简的引入方式:将整个库合并为单文件。
src-amalgamate/QwtPlot.h--- 合并后的单一头文件src-amalgamate/QwtPlot.cpp--- 合并后的单一源文件
只需将这两个文件加入项目,无需复杂的构建配置,特别适合小型项目或快速原型开发。这在原版 Qwt 6.x 中是不可能做到的------原版需要引入几十个头文件和源文件。
注意:单文件是由工具自动合成的,请勿直接编辑这两个文件。
2.3 2D/3D 绘图一体化
这是 Qwt 7.0 最重要的改进之一。Qwt 7.0 将原 QwtPlot3D 库整合进来,实现了 2D 和 3D 绘图的一体化支持。现在一个库就能同时满足二维和三维数据可视化需求。
3D 绘图模块支持:
- 多种绘图类型:表面图、网格图、参数曲面、函数绘图等
- OpenGL 高性能渲染,流畅的交互体验
- 鼠标旋转、缩放、平移视角
- 光照和材质效果
- 根据 Z 值自动映射颜色,支持颜色条

核心 3D 类位于 Qwt3D 命名空间下:
| 类名 | 说明 |
|---|---|
Qwt3D::Plot3D |
3D 绘图基类,提供基本框架和交互 |
Qwt3D::SurfacePlot |
3D 表面图,显示连续曲面 |
Qwt3D::Function |
3D 函数绘图,根据数学函数生成曲面 |
CMake 中只需链接不同的 target 即可选择 2D 或 3D 模块:
cmake
# 2D 绘图
target_link_libraries(${PROJECT_NAME} PRIVATE qwt::plot)
# 3D 绘图(可选)
target_link_libraries(${PROJECT_NAME} PRIVATE qwt::plot3d)
2.4 QwtFigure ------ 多绘图布局容器
QwtFigure 是 Qwt 7.0 最重要的新增功能之一,提供类似 matplotlib Figure 的多绘图布局能力。在原版 Qwt 6.x 中,如果你想在同一个窗口中放置多个绘图,需要手动管理布局,非常麻烦。Qwt 7.0 的 QwtFigure 彻底解决了这个问题。

主要功能包括:
- 归一化坐标布局 :使用
[0,1]范围内的坐标系统进行相对位置控制 - 网格布局:行列式的网格排列,类似 matplotlib 的 subplot
- 寄生绘图支持:在同一个绘图区域内创建多个独立坐标轴
- 图形导出功能:支持高分辨率图片输出
- 交互式操作蒙版 :
QwtFigureWidgetOverlay支持鼠标拖拽调整子绘图的位置和大小
使用示例:
cpp
// 创建 QwtFigure
QwtFigure* figure = new QwtFigure();
figure->setSizeInches(8, 6); // 设置图形尺寸
// 使用网格布局添加绘图(类似 matplotlib subplot)
QwtPlot* plot1 = new QwtPlot();
figure->addGridAxes(plot1, 2, 2, 0, 0); // 2x2 网格,第0行第0列
QwtPlot* plot2 = new QwtPlot();
figure->addGridAxes(plot2, 2, 2, 0, 1); // 第0行第1列
2.5 寄生绘图 ------ 多坐标轴系统
寄生绘图(Parasite Axes)允许在同一绘图区域内创建任意多个独立坐标轴,完美解决多 Y 轴、多 X 轴的复杂绘图需求。原版 Qwt 6.x 最多只支持 4 个坐标轴(上、下、左、右各一个),而 Qwt 7.0 的寄生绘图架构突破了这一限制。

寄生绘图与宿主绘图共享绘图区域(透明背景),但拥有独立的坐标系统。当宿主绘图被销毁时,寄生绘图也会自动销毁,生命周期自动管理。
cpp
// 创建宿主绘图
QwtPlot* hostPlot = new QwtPlot();
// 创建寄生绘图,显示在 YLeft 轴
QwtPlot* parasitePlot = hostPlot->createParasitePlot(QwtAxis::YLeft);
// 添加曲线到寄生绘图
QwtPlotCurve* curve = new QwtPlotCurve("Parasite Curve");
curve->setSamples(...);
curve->attach(parasitePlot);
2.6 坐标轴内置交互动作
这是 Qwt 7.0.5+ 引入的新特性。坐标轴交互动作允许用户通过鼠标直接操作坐标轴,体验类似 QCustomPlot 的交互方式。原版 Qwt 6.x 要实现这种交互需要自己写大量代码,而 Qwt 7.0 默认就内置了。

功能包括:
- 左键单击选中坐标轴
- 拖动移动坐标轴范围
- 滚轮缩放,缩放中心为鼠标位置
- 右键取消选中
cpp
// 全局启用/禁用
plot->setEnableScaleBuildinActions(true);
// 单独配置某个坐标轴的行为
plot->axisWidget(QwtAxis::XBottom)->setBuildinActions(QwtScaleWidget::ActionClickPan);
2.7 实时平移与整体画布缩放
原版 Qwt 的 QwtPanner 使用位图缓存进行平移,平移过程中无法看到数据的实时变化。Qwt 7.0 重构了 QwtPlotPanner,基于 QwtPicker 状态机实现实时平移:

特性包括:
- 线性坐标轴、对数坐标轴、日期时间坐标轴全支持
- 多坐标轴实时同步移动
- 平移过程中绘图实时刷新
此外,Qwt 7.0 还新增了 QwtPlotCanvasZoomer,无需指定坐标轴,自动处理整个画布的缩放,解决了原版 QwtPlotZoomer 只能绑定两个坐标轴的局限。
cpp
// 创建整体画布缩放器
QwtPlotCanvasZoomer* canvasZoomer = new QwtPlotCanvasZoomer(plot->canvas());
2.8 数据拾取功能
QwtPlotSeriesDataPicker(v7.0.6+)提供了强大的数据拾取功能,鼠标移动时实时显示数据点信息。

支持两种拾取模式:
- Y 值拾取模式:显示当前 X 位置对应所有曲线的 Y 值,支持线性插值计算
- 最近点拾取模式:计算距离鼠标最接近的点进行拾取,适合峰值数据拾取场景
cpp
// 创建数据拾取器
QwtPlotSeriesDataPicker* picker = new QwtPlotSeriesDataPicker(plot->canvas());
picker->setPickMode(QwtPlotSeriesDataPicker::PickYValue);
picker->setInterpolationMode(QwtPlotSeriesDataPicker::LinearInterpolation);
针对大数据集,Qwt 7.0 还提供了窗口搜索算法优化:默认在数据点超过 1000 个时启用,搜索窗口默认为曲线点数的 5%,避免全曲线遍历,大幅提升性能。
2.9 箱线图 QwtPlotBoxChart
QwtPlotBoxChart(v7.2.0+)提供完整的箱线图(Box-and-Whisker Plot)支持,直观展示数据统计分布特征。这是原版 Qwt 6.x 所不具备的图表类型。

功能特性:
- 支持预计算数据和原始数据自动计算两种方式
- 多种须须计算方法:Tukey(1.5×IQR)、百分位数、最小最大值、标准差、标准误
- 三种箱体样式:矩形、菱形、缺口形
- 垂直和水平方向切换
- 异常值自动检测、自定义符号和抖动显示
cpp
// 创建箱线图
QwtPlotBoxChart* boxChart = new QwtPlotBoxChart("数据组A");
boxChart->attach(plot);
// 设置预计算的统计数据
QVector<QwtBoxSample> samples;
samples << QwtBoxSample(1.0, 10.0, 20.0, 35.0, 50.0, 60.0);
boxChart->setSamples(samples);
// 设置样式
boxChart->setBrush(QColor(100, 150, 200, 150));
boxChart->setBoxStyle(QwtPlotBoxChart::Notch);
2.10 其他实用改进
除了上述重大特性,Qwt 7.0 还有许多实用改进:
- 美化控件风格:去除老旧浮雕风格,现代化 UI 设计
- 扁平化控件:滑块、旋钮、刻度盘等控件支持 Flat 风格样式
- 超大规模数据渲染优化:4 种曲线降采样算法 + SIMD 加速,百万级数据流畅渲染
- 颜色循环系统:可自定义的颜色循环,自动为系列数据分配颜色
- 22 种科学 colormap 预设:viridis、plasma、jet、hot 等
- 刻度朝内显示:支持将坐标轴刻度线显示在绘图区域内部
- NaN/Inf 异常值处理:数据异常不会导致坐标映射错误或崩溃
- QwtGridRasterData 网格插值 :比
QwtMatrixRasterData更灵活的光谱图数据处理 - 柱状图接口增强:支持 Pen/Brush 样式设置,更丰富的外观定制
三、快速集成 Qwt 7.0
Qwt 7.0 提供两种引入方式:CMake 引入(推荐)和单文件引入。
3.1 CMake 引入方式(推荐)
这是官方推荐的引入方式。首先需要编译并安装 Qwt 7.0 到本地,然后通过 find_package 引入。
步骤 1:指定 QWT 安装目录(可选)
如果你使用了自定义安装路径,需要设置 qwt_DIR 变量指向安装目录下的 lib/cmake/qwt:
cmake
# 如果是默认安装路径,这步可以省略
set(qwt_DIR "C:/src/my-install-path/cmake/qwt")
步骤 2:使用 find_package 加载库
cmake
find_package(qwt REQUIRED)
# 链接 2D 绘图库(会自动添加 Qt 依赖)
target_link_libraries(YOU_APP_TARGET PRIVATE qwt::plot)
# 链接 3D 绘图库(可选,会自动添加 Qt 和 OpenGL 依赖)
target_link_libraries(YOU_APP_TARGET PRIVATE qwt::plot3d)
Qwt 7.0 提供三个 CMake 模块:
| 模块 | CMake target | 说明 |
|---|---|---|
| core | qwt::core |
公共基础库(颜色、数学、数据类型、坐标变换等 28 个模块) |
| plot | qwt::plot |
2D 绘图库,原 qwt 功能集成 |
| plot3d | qwt::plot3d |
3D 绘图库,qwtplot3d 功能集成 |
依赖说明 :
plot和plot3d都依赖core模块,但彼此独立。引入qwt::plot或qwt::plot3d时会自动添加 Qt 依赖(Core、Gui、Widgets、Concurrent、PrintSupport,可选 Svg、OpenGL),无需手动管理。
3.2 单文件引入方式
如果你不想编译安装 Qwt 库,或者项目较小,可以使用单文件引入方式。只需将 src-amalgamate/QwtPlot.h 和 QwtPlot.cpp 两个文件加入项目即可。
对应的 CMake 配置如下:
cmake
# QwtPlot 依赖 Core Gui Widgets Svg Concurrent OpenGL PrintSupport
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} 5.12 COMPONENTS
Core Gui Widgets Svg Concurrent OpenGL PrintSupport REQUIRED)
add_executable(YOU_APP_TARGET
main.cpp
QwtPlot.h
QwtPlot.cpp
# 你的项目其他文件
)
target_link_libraries(YOU_APP_TARGET
PUBLIC
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Svg
Qt${QT_VERSION_MAJOR}::Concurrent
Qt${QT_VERSION_MAJOR}::OpenGL
Qt${QT_VERSION_MAJOR}::PrintSupport
)
# Qt6 还需要 OpenGLWidgets
if(${QT_VERSION_MAJOR} EQUAL 6)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS OpenGLWidgets REQUIRED)
target_link_libraries(YOU_APP_TARGET PRIVATE Qt${QT_VERSION_MAJOR}::OpenGLWidgets)
endif()
# 单文件引入也需要 OpenGL
find_package(OpenGL COMPONENTS OpenGL REQUIRED)
target_link_libraries(YOU_APP_TARGET PRIVATE OpenGL::GLU)
提示:Qwt 7.1 之后合并了 qwtplot3d 库,因此单文件引入也需要 OpenGL 相关依赖。作为现代 C++ 项目,强烈推荐使用 CMake 引入方式,所有依赖都在 CMake 配置中自动处理。
四、第一个绘图示例
下面通过一个完整的示例,快速了解 QwtPlot 的基本使用方法。这个示例来自项目中的 examples/2D/simpleplot。

完整代码
cpp
#include <QwtPlot>
#include <QwtPlotCurve>
#include <QwtPlotGrid>
#include <QwtSymbol>
#include <QwtLegend>
#include <QApplication>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
// 1. 创建绘图窗口
QwtPlot plot;
plot.setWindowTitle("Plot Demo"); // 设置窗口标题
plot.setCanvasBackground(Qt::white); // 设置画布背景色
plot.setAxisScale(QwtAxis::YLeft, 0.0, 10.0); // 设置 Y 轴范围
plot.insertLegend(new QwtLegend()); // 添加图例
// 2. 创建并添加网格
QwtPlotGrid* grid = new QwtPlotGrid();
grid->attach(&plot); // 网格必须附加到绘图才能显示
// 3. 创建曲线
QwtPlotCurve* curve = new QwtPlotCurve();
curve->setTitle("Some Points"); // 曲线标题(显示在图例中)
curve->setPen(Qt::blue, 4); // 设置线条颜色和宽度
curve->setRenderHint(QwtPlotItem::RenderAntialiased, true); // 抗锯齿
// 4. 设置曲线符号
QwtSymbol* symbol = new QwtSymbol(
QwtSymbol::Ellipse, // 符号形状:椭圆
QBrush(Qt::yellow), // 符号填充色
QPen(Qt::red, 2), // 符号边框
QSize(8, 8) // 符号大小
);
curve->setSymbol(symbol);
// 5. 设置曲线数据
QPolygonF points;
points << QPointF(0.0, 4.4) << QPointF(1.0, 3.0)
<< QPointF(2.0, 4.5) << QPointF(3.0, 6.8)
<< QPointF(4.0, 7.9) << QPointF(5.0, 7.1);
curve->setSamples(points);
// 6. 将曲线附加到绘图
curve->attach(&plot);
// 7. 显示绘图窗口
plot.resize(600, 400);
plot.show();
return app.exec();
}
代码解析
核心概念 :QwtPlot 是绘图的主容器,继承自 QFrame。一个 QwtPlot 可以包含多个绘图项(Plot Item),如曲线、网格、标记等,所有绘图项都需要通过 attach() 方法附加到 QwtPlot 才能显示。
基本使用流程:
- 创建 QwtPlot 对象 --- 设置标题、背景色、坐标轴范围
- 创建绘图项 --- 网格、曲线、标记等
- 设置绘图项属性和数据 --- 颜色、线宽、符号、数据点
- 附加到 QwtPlot --- 通过
attach()方法 - 显示绘图 --- 调用
show()和replot()
绘图项生命周期:当绘图项附加到 QwtPlot 后,QwtPlot 会持有该绘图项的引用。在 QwtPlot 销毁时,所有附加的绘图项也会被自动删除,因此你不需要手动管理绘图项的内存。
坐标轴系统:QwtPlot 默认提供四个坐标轴位置:
| 坐标轴位置 | 枚举值 | 说明 |
|---|---|---|
| 底部 X 轴 | QwtAxis::XBottom |
默认显示 |
| 顶部 X 轴 | QwtAxis::XTop |
默认隐藏 |
| 左侧 Y 轴 | QwtAxis::YLeft |
默认显示 |
| 右侧 Y 轴 | QwtAxis::YRight |
默认隐藏 |
数据设置方式 :setSamples() 支持多种数据输入方式:
| 方法 | 说明 |
|---|---|
setSamples(const QPolygonF&) |
从 QPointF 数组设置 |
setSamples(const QVector<double>& x, const QVector<double>& y) |
从两个数组设置 |
setSamples(const double* x, const double* y, int size) |
从原始数组设置 |
setRawSamples(const double* x, const double* y, int size) |
直接引用外部数组(不复制) |
性能提示 :对于实时更新的场景,建议关闭自动刷新(
setAutoReplot(false)),在批量更新完成后手动调用一次replot(),这样可以避免频繁刷新带来的性能开销。
五、与旧版本 Qwt 6.x 的主要区别
如果你之前使用过原版 Qwt 6.x,在迁移到 Qwt 7.0 时需要注意以下变更。
类名变更对照表
为保持命名清晰,部分类名进行了调整:
| 原名称(Qwt 6.x) | 新名称(Qwt 7.0) | 说明 |
|---|---|---|
QwtPlotZoomer |
QwtPlotAxisZoomer |
只能绑定 2 个坐标轴,更名为"轴缩放器" |
| - | QwtPlotCanvasZoomer |
新增:整体画布缩放器,不限轴数 |
QwtPanner |
QwtCachePanner |
带缓存的平移器(原版行为) |
QwtPlotPanner |
QwtPlotCachePanner |
带缓存的绘图平移器(原版行为) |
| - | QwtPlotPanner |
新增:实时平移器,基于 QwtPicker |
API 变更
QwtLinearColorMap::colorStop()更名为stopPos()QwtLinearColorMap新增stopColors()方法QwtColorMap::rgb()方法签名变更(v7.3.1+),已移至 core 模块
迁移提示
- 大部分 Qwt 6.x 代码可直接使用,仅需少量类名替换
- 如需使用原来的缓存式平移,将
QwtPanner替换为QwtCachePanner即可 - 如需使用原来的缩放器,将
QwtPlotZoomer替换为QwtPlotAxisZoomer即可 - Qt5.12+ 和 Qt6 完全兼容
- 网上常见的
Qwt3DPlot3D/Qwt3DSurfacePlot/Qwt3DFunction写法是错误的 ,真实类名在类本身上省略了冗余的Qwt3D前缀,正确写法是Qwt3D::Plot3D、Qwt3D::SurfacePlot、Qwt3D::Function
六、总结与系列预告
Qwt 7.0 是一次全面的现代化升级,核心改进可以用下表概括:
| 类别 | 新特性 |
|---|---|
| 架构升级 | C++11/17、CMake 构建、单文件引入 |
| 2D/3D 一体化 | 融合 QwtPlot3D,统一库支持 2D 和 3D 绘图 |
| 布局功能 | QwtFigure 多绘图容器、寄生绘图多坐标轴 |
| 交互改进 | 实时平移、整体画布缩放、坐标轴内置交互 |
| 数据拾取 | Y 值拾取、最近点拾取、智能插值 |
| 图表类型 | 箱线图、3D 表面图/网格图、刻度朝内显示 |
| 性能优化 | 4 种降采样算法 + SIMD 加速、百万级数据流畅渲染 |
| 稳定性 | NaN/Inf 处理、异常值过滤 |
相比原版 Qwt 6.x,Qwt 7.0 在保持 API 兼容的前提下,通过现代化的构建系统、2D/3D 一体化设计、丰富的交互功能和性能优化,成为了一个更现代、更强大、更易用的 Qt 数据可视化库。LGPL 协议也使其成为商业应用的理想选择。
系列预告
本系列后续文章将深入讲解 Qwt 7.0 的各个方面:
- 第 1 篇:快速入门与核心新特性概览
- 第 2 篇:曲线绘图详解 ------ 从基础到百万级数据性能优化
- 第 3 篇:常用图表类型实战 ------ 柱状图、散点图、箱线图与直方图
- 第 4 篇:高级科学图表 ------ 光谱图、向量场、K线图与极坐标绘图
- 第 5 篇:多坐标轴与多绘图布局 ------ 寄生绘图与 QwtFigure 容器
- 第 6 篇:交互功能详解 ------ 平移、缩放、坐标轴交互与数据拾取
- 第 7 篇:3D 数据可视化 ------ OpenGL 高性能三维绘图
- 第 8 篇:坐标轴与刻度系统 ------ 刻度引擎、网格、图例与刻度朝内
- 第 9 篇:控件与辅助元素 ------ 滑块旋钮、标记与装饰
- 第 10 篇:总体架构解析 ------ 从单体到三库模块化的演进
- 第 11 篇:matplotlib 风格绘图 ------ QwtPyPlot 接口详解
敬请关注!
相关链接