【Qwt 7.0 系列】常用图表类型实战 ------ 柱状图、散点图、箱线图与直方图
本文是 Qwt 7.0 系列介绍和教程,如果你正在寻找一个高性能、协议友好、同时支持 2D 和 3D 绘图的 Qt 数据可视化库,那么这篇文章就是为你准备的。
系列总述文章:Qwt 7.0 ------ 基于 Qt 的高性能 2D/3D 绘图库
概述 | 高性能曲线绘制 | 常用图表类型 | 高级科学图表 | 多坐标轴与布局 | 交互功能 | 3D 数据可视化 | 坐标轴与刻度 | 控件与辅助元素 | 总体架构解析 | matplotlib 风格绘图
在数据可视化的世界里,折线图只是开胃菜。真正让一个绘图库"好用"的,是它能不能优雅地处理柱状图、散点图、箱线图、直方图这些日常分析中最高频的图表类型。
本文是 Qwt 7.0 系列的第 3 篇,将带你逐一掌握 Qwt 7.0 中最常用的四种图表的实战用法。特别值得一提的是,箱线图(QwtPlotBoxChart)是 Qwt 7.2.0 才新增的功能,旧版本(包括原版 Qwt 6.x)完全没有这个类------如果你之前被"Qwt 没有箱线图"劝退过,现在是时候重新认识了。
一、引言:为什么图表类型很重要
Qwt 7.0 是基于原版 Qwt 6.2.0 的现代化维护分支,由社区持续更新。相比原版,它不仅修复了大量历史遗留问题,还在图表类型上做了重要扩展:
- 柱状图接口增强 :7.0 对
QwtPlotBarChart的 Pen/Brush 样式设置做了改进,定制更灵活 - 新增箱线图 :7.2.0 起新增
QwtPlotBoxChart,填补了统计可视化的一大空白 - 散点图性能优化:百万级数据点的散点图也能流畅渲染
下面我们逐一展开。
二、柱状图 QwtPlotBarChart
柱状图是分类数据对比分析的利器。Qwt 提供两个柱状图类:
| 类名 | 说明 |
|---|---|
QwtPlotBarChart |
单组柱状图,每组一个柱体 |
QwtPlotMultiBarChart |
多组柱状图,支持分组和堆叠模式 |
2.1 基本柱状图
先来看最简单的单组柱状图:
cpp
#include <QwtPlot>
#include <QwtPlotBarChart>
QwtPlot* plot = new QwtPlot();
plot->setTitle("柱状图示例");
plot->setCanvasBackground(Qt::white);
// 创建柱状图
QwtPlotBarChart* barChart = new QwtPlotBarChart("销售数据");
// 设置数据(Y值列表,X自动为索引)
QVector<double> values;
values << 10 << 25 << 15 << 30 << 20;
barChart->setSamples(values);
// 设置柱体样式
barChart->setPen(QPen(Qt::darkBlue, 2)); // 边框
barChart->setBrush(QBrush(QColor(100, 150, 200))); // 填充
// 设置基线(柱体起始位置)
barChart->setBaseline(0.0); // 从0开始
barChart->attach(plot);
plot->replot();
代码逻辑很直观:创建 QwtPlotBarChart 对象,用 setSamples() 填数据,用 setPen() / setBrush() 设样式,最后 attach() 到 plot 上。
2.2 数据设置的三种方式
setSamples() 支持三种重载,灵活适配不同数据来源:
cpp
// 方式1:仅Y值(X自动为0,1,2...)
QVector<double> yValues;
yValues << 10 << 20 << 30 << 40;
barChart->setSamples(yValues);
// 方式2:指定X和Y坐标
QVector<QPointF> points;
points << QPointF(1, 10) << QPointF(2, 25) << QPointF(3, 15);
barChart->setSamples(points);
// 方式3:使用QwtSeriesData(适合自定义数据源)
barChart->setSamples(seriesData);
2.3 分组柱状图与堆叠柱状图
当需要对比多组数据时,QwtPlotMultiBarChart 是主角。它支持两种模式:
| 模式 | 说明 |
|---|---|
Grouped |
分组模式:多组数据并列显示,便于对比 |
Stacked |
堆叠模式:多组数据叠加显示,便于看总量 |


分组模式适合横向对比各组数值,堆叠模式则更看重每组总量。代码实现如下:
cpp
#include <QwtPlotMultiBarChart>
// 创建多组柱状图
QwtPlotMultiBarChart* multiBar = new QwtPlotMultiBarChart();
multiBar->setTitle("多组数据对比");
// 设置每组的标题(用于图例)
QList<QwtText> titles;
titles << QwtText("组A") << QwtText("组B") << QwtText("组C");
multiBar->setBarTitles(titles);
// 设置数据(每个样本包含多组值)
QVector<QwtSetSample> samples;
samples << QwtSetSample(0, QVector<double>() << 10 << 20 << 15); // 第1个分类
samples << QwtSetSample(1, QVector<double>() << 25 << 15 << 30); // 第2个分类
samples << QwtSetSample(2, QVector<double>() << 20 << 25 << 10); // 第3个分类
multiBar->setSamples(samples);
// 设置显示模式
multiBar->setChartMode(QwtPlotMultiBarChart::Grouped); // 分组模式
// multiBar->setChartMode(QwtPlotMultiBarChart::Stacked); // 堆叠模式
multiBar->attach(plot);
plot->replot();
2.4 样式定制:画笔、填充与符号
7.0 的接口增强
Qwt 7.0 对柱状图的样式设置做了增强。你可以直接用 setPen() / setBrush() 设置全局样式,也可以通过 QwtColumnSymbol 做更精细的控制:
cpp
#include <QwtColumnSymbol>
// 创建柱体符号
QwtColumnSymbol* symbol = new QwtColumnSymbol(QwtColumnSymbol::Box);
symbol->setFrameStyle(QwtColumnSymbol::Raised); // 凸起边框样式
symbol->setPen(QPen(Qt::darkBlue, 1)); // 边框画笔
symbol->setBrush(QBrush(QColor(100, 150, 200, 180))); // 半透明填充
barChart->setSymbol(symbol);
对于多组柱状图,可以给每组分配不同颜色的符号:
cpp
// 为每组创建不同的符号
QList<QwtColumnSymbol*> symbols;
QColor colors[3] = {Qt::red, Qt::green, Qt::blue};
for (int i = 0; i < 3; i++) {
QwtColumnSymbol* symbol = new QwtColumnSymbol(QwtColumnSymbol::Box);
symbol->setBrush(QBrush(colors[i]));
symbol->setPen(QPen(Qt::black, 1));
symbols.append(symbol);
}
multiBar->setSymbols(symbols);
柱体宽度与布局
cpp
// 布局策略
barChart->setLayoutPolicy(QwtPlotAbstractBarChart::AutoAdjustSamples);
// 可选值:
// - FixedBarWidth: 固定像素宽度
// - FixedSampleWidth: 固定样本宽度(含间距)
// - AdjustSampleWidth: 根据可用空间调整
// 布局提示值(柱体宽度占样本空间的比例)
barChart->setLayoutHint(0.8);
显示方向
cpp
barChart->setOrientation(Qt::Vertical); // 垂直(默认)
barChart->setOrientation(Qt::Horizontal); // 水平
2.5 柱状图核心方法速查
| 方法 | 说明 |
|---|---|
setSamples() |
设置数据 |
setSymbol() / setSymbols() |
设置柱体符号 |
setPen() |
设置边框画笔 |
setBrush() |
设置填充画笔 |
setBaseline() |
设置基线位置 |
setOrientation() |
设置显示方向 |
setLayoutPolicy() |
设置布局策略 |
setLayoutHint() |
设置布局参数 |
setLegendMode() |
设置图例模式 |
setChartMode() (MultiBar) |
设置分组/堆叠模式 |
三、散点图:QwtPlotCurve 的散点模式
散点图用于展示数据的分布情况。Qwt 没有独立的"散点图类",而是通过 QwtPlotCurve 配合 QwtSymbol 来实现------这种设计很巧妙,因为散点图本质上就是"没有连线的曲线"。

3.1 三种实现方式
| 方式 | 曲线样式 | 说明 |
|---|---|---|
| NoCurve + Symbol | NoCurve |
仅显示符号,无连线,最常用 |
| Dots | Dots |
仅绘制像素点,性能最高 |
| Lines + Symbol | Lines |
连线与符号同时显示 |
3.2 基本散点图
cpp
#include <QwtPlot>
#include <QwtPlotCurve>
#include <QwtSymbol>
QwtPlot* plot = new QwtPlot();
plot->setTitle("散点图示例");
plot->setCanvasBackground(Qt::white);
// 创建散点曲线
QwtPlotCurve* scatter = new QwtPlotCurve("数据点");
// 关键:设置为无连线模式
scatter->setStyle(QwtPlotCurve::NoCurve);
// 创建符号
QwtSymbol* symbol = new QwtSymbol(
QwtSymbol::Ellipse, // 椭圆形
QBrush(Qt::blue), // 蓝色填充
QPen(Qt::darkBlue, 1), // 深蓝边框
QSize(8, 8) // 大小
);
scatter->setSymbol(symbol);
// 设置数据
QPolygonF points;
for (int i = 0; i < 100; i++) {
double x = rand() % 100;
double y = rand() % 100;
points << QPointF(x, y);
}
scatter->setSamples(points);
scatter->attach(plot);
plot->replot();
核心就两步:setStyle(QwtPlotCurve::NoCurve) 关掉连线,setSymbol() 设置符号样式。
3.3 符号形状大全
Qwt 提供了丰富的内置符号形状:
| 形状 | 枚举值 | 说明 |
|---|---|---|
Ellipse |
椭圆 | 最常用,圆形或椭圆 |
Rect |
矩形 | 正方形或矩形 |
Diamond |
菱形 | 菱形/钻石形 |
Triangle / UTriangle |
三角形 | 向上三角形 |
DTriangle |
倒三角 | 向下三角形 |
LTriangle / RTriangle |
左/右三角 | 侧向三角形 |
Cross |
十字 | +形十字 |
XCross |
X十字 | X形十字 |
Star1 / Star2 |
星形 | 六角星 / 五角星 |
Hexagon |
六边形 | 正六边形 |
Path |
路径 | 自定义 QPainterPath |
如果内置形状不够用,可以用 Path 模式绘制自定义形状:
cpp
#include <QPainterPath>
QPainterPath path;
path.moveTo(0, -10);
path.lineTo(8, 5);
path.lineTo(5, 5);
path.lineTo(0, 0);
path.lineTo(-5, 5);
path.lineTo(-8, 5);
path.closeSubpath();
QwtSymbol* customSymbol = new QwtSymbol();
customSymbol->setStyle(QwtSymbol::Path);
customSymbol->setPath(path);
customSymbol->setBrush(QBrush(Qt::red));
customSymbol->setPen(QPen(Qt::darkRed, 1));
customSymbol->setSize(20, 20);
scatter->setSymbol(customSymbol);
3.4 大数据散点图:性能关键
当数据点达到万级甚至百万级时,NoCurve + Symbol 方式会明显变慢,因为每个点都要绘制一个完整的符号对象。此时应切换到 Dots 样式:
cpp
QwtPlotCurve* scatter = new QwtPlotCurve("大规模散点");
// 使用Dots样式 - 仅绘制像素点,性能最高
scatter->setStyle(QwtPlotCurve::Dots);
// 启用图像缓冲优化(进一步提速)
scatter->setPaintAttribute(QwtPlotCurve::ImageBuffer, true);
// 设置颜色(Dots样式不需要Symbol,直接用pen颜色)
scatter->setPen(Qt::blue);
// 生成100万个点
QVector<double> xData(1000000), yData(1000000);
for (int i = 0; i < 1000000; i++) {
xData[i] = rand() % 1000;
yData[i] = rand() % 1000;
}
scatter->setSamples(xData, yData);
scatter->attach(plot);
两种方式的性能对比:
| 数据量 | NoCurve+Symbol | Dots |
|---|---|---|
| <1000 点 | 快 | 最快 |
| 1000-10000 点 | 较快 | 快 |
| >10000 点 | 较慢 | 快 |
| >100000 点 | 很慢 | 最快(推荐) |
经验法则 :数据量超过 1 万点,果断用 Dots。
3.5 符号抖动
当多个数据点位置相近时,它们会重叠在一起。setSymbolJitter() 可以为每个点的 X 坐标添加随机偏移,使重叠点分散显示:
cpp
// 设置5%的抖动范围
scatter->setSymbolJitter(0.05);
这在观察数据密度分布时特别有用。
四、箱线图 QwtPlotBoxChart(Qwt 7.2.0 新增)
这是本文的重头戏。 QwtPlotBoxChart 是 Qwt 7.2.0 才引入的全新图表类型,原版 Qwt 6.x 完全没有箱线图支持。如果你做统计分析、实验数据处理,这个类会让你省去大量手写绘制代码的工作。
4.1 什么是箱线图
箱线图(Box-and-Whisker Plot)通过五个关键数值(五数概括)来描述数据分布:
- 最小值:下须须位置
- Q1:第一四分位数(25% 分位)
- 中位数:数据的中间值
- Q3:第三四分位数(75% 分位)
- 最大值:上须须位置
下图展示了标准箱线图的各个组成部分:

箱体(Q1 到 Q3)表示中间 50% 的数据,中位数线将箱体一分为二,须须延伸到数据的合理范围边界,超出须须的点则被标记为异常值。
4.2 核心数据结构
QwtBoxSample
每个箱子用一个 QwtBoxSample 表示:
cpp
struct QwtBoxSample {
double position; // 箱子在位置轴上的坐标
double whiskerLower; // 下须须位置
double q1; // 第一四分位数(25%分位)
double median; // 中位数(50%分位)
double q3; // 第三四分位数(75%分位)
double whiskerUpper; // 上须须位置
int outlierCount; // 异常值数量(仅计数)
};
注意参数顺序 :构造函数为
position, whiskerLower, q1, median, q3, whiskerUpper,顺序搞错会导致箱线图显示异常。
QwtBoxOutlierSample
异常值数据与箱体数据分离存储:
cpp
struct QwtBoxOutlierSample {
double boxPosition; // 对应箱子的位置
QVector<double> values; // 所有异常值列表
};
这种分离设计的好处是:异常值可以独立设置符号、颜色、大小,互不干扰。
4.3 基本使用:直接提供统计数据
如果你已经有了计算好的统计量,直接填入 QwtBoxSample 即可:
cpp
#include <QwtPlotBoxChart>
#include <QwtLegend>
QwtPlot* plot = new QwtPlot();
plot->setTitle("箱线图示例");
plot->insertLegend(new QwtLegend());
// 创建箱线图
QwtPlotBoxChart* boxChart = new QwtPlotBoxChart("数据组A");
boxChart->attach(plot);
// 准备箱线图数据
// 参数顺序:位置, 下须, Q1, 中位数, Q3, 上须
QVector<QwtBoxSample> samples;
samples << QwtBoxSample(1.0, 10.0, 20.0, 35.0, 50.0, 60.0);
samples << QwtBoxSample(2.0, 15.0, 25.0, 40.0, 55.0, 70.0);
samples << QwtBoxSample(3.0, 8.0, 18.0, 32.0, 48.0, 58.0);
boxChart->setSamples(samples);
// 设置样式
boxChart->setBrush(QColor(100, 150, 200, 150)); // 半透明蓝色填充
boxChart->setPen(QPen(Qt::darkBlue, 2.0)); // 深蓝色边框
boxChart->setBoxExtent(0.35); // 箱体宽度
plot->replot();
4.4 从原始数据自动计算
更常见的场景是:你只有一堆原始数据,需要自动计算统计量。这时用 QwtBoxStatisticsCalculator:
cpp
#include <qwt_box_statistics.h>
#include <QwtSymbol>
// 准备原始数据
QVector<double> rawData;
for (int i = 0; i < 100; i++) {
rawData << 50.0 + (rand() % 50) - 25.0;
}
// 添加极端值作为异常值
rawData << 5.0;
rawData << 100.0;
// 计算箱线图统计量
QwtBoxSample sample;
QwtBoxOutlierSample outlier;
// calculateFull 一次性计算所有数据
QwtBoxStatisticsCalculator::calculateFull(
1.5, // 箱子位置
rawData, // 原始数据
sample, // 输出:统计结果
outlier, // 输出:异常值
QwtBoxStatisticsCalculator::Tukey, // 计算方法
1.5 // IQR系数
);
// 设置到箱线图
QwtPlotBoxChart* boxChart = new QwtPlotBoxChart("自动计算");
boxChart->attach(plot);
QVector<QwtBoxSample> samples;
samples << sample;
boxChart->setSamples(samples);
QVector<QwtBoxOutlierSample> outliers;
outliers << outlier;
boxChart->setOutliers(outliers);
// 配置异常值样式
QwtSymbol* outlierSymbol = new QwtSymbol(QwtSymbol::Diamond);
outlierSymbol->setSize(8, 8);
outlierSymbol->setBrush(Qt::red);
outlierSymbol->setPen(QPen(Qt::darkRed, 1));
boxChart->setOutlierSymbol(outlierSymbol);
// 启用抖动避免异常值重叠
boxChart->setOutlierJitter(0.1);

4.5 五种须须计算方法
须须(Whisker)的端点位置怎么算?Qwt 提供了五种方法:
| 计算方法 | 适用场景 | 说明 |
|---|---|---|
Tukey |
标准箱线图 | 1.5×IQR 确定须须范围,经典异常值检测 |
Percentile |
自定义范围 | 指定百分位(如第5和第95百分位)作为端点 |
MinMax |
完整数据范围 | 须须延伸到最小值和最大值,不显示异常值 |
StandardDeviation |
正态分布数据 | 均值 ± n×标准差 |
StandardError |
统计推断 | 均值 ± n×标准误 |
选择建议:
- 一般数据分析:用
Tukey(默认) - 自定义异常标准:用
Percentile或调整 Tukey 系数 - 展示完整分布:用
MinMax - 正态分布检验:用
StandardDeviation
4.6 三种箱体样式
cpp
// 矩形箱体(默认)- 最常用
boxChart->setBoxStyle(QwtPlotBoxChart::Rect);
// 菱形箱体 - 强调数据分布对称性
boxChart->setBoxStyle(QwtPlotBoxChart::Diamond);
// 缺口箱体 - 显示中位数置信区间
boxChart->setBoxStyle(QwtPlotBoxChart::Notch);
| 样式 | 特点 |
|---|---|
Rect |
标准样式,适合大多数场景 |
Diamond |
适合对比多组数据分布的对称性 |
Notch |
缺口表示中位数置信区间,两组缺口不重叠则中位数显著不同 |
4.7 方向切换
cpp
// 垂直方向(默认)
boxChart->setOrientation(Qt::Vertical);
// 水平方向
boxChart->setOrientation(Qt::Horizontal);
切换方向后记得刷新坐标轴:
cpp
boxChart->setOrientation(Qt::Horizontal);
plot->setAxisAutoScale(QwtAxis::XBottom);
plot->setAxisAutoScale(QwtAxis::YLeft);
plot->replot();
五、直方图 QwtPlotHistogram
直方图和柱状图长得很像,但本质不同:柱状图的 X 轴是分类标签,直方图的 X 轴是连续数值区间。直方图常用于展示数据分布频率。
5.1 直方图 vs 柱状图
| 特性 | 柱状图 (BarChart) | 直方图 (Histogram) |
|---|---|---|
| 数据结构 | 点值 (x, y) | 区间值 (x1, x2, y) |
| 柱体宽度 | 固定或可调 | 由区间决定 |
| 适用场景 | 分类数据对比 | 连续数据分布 |
| X轴含义 | 分类标签 | 数值区间 |
5.2 基本直方图
直方图的数据结构是 QwtIntervalSample,每个样本包含一个区间和一个值:
cpp
#include <QwtPlot>
#include <QwtPlotHistogram>
#include <QwtInterval>
QwtPlot* plot = new QwtPlot();
plot->setTitle("直方图示例");
plot->setCanvasBackground(Qt::white);
// 创建直方图
QwtPlotHistogram* histogram = new QwtPlotHistogram("数据分布");
histogram->setStyle(QwtPlotHistogram::Columns); // 柱状样式(默认)
// 准备区间数据
QVector<QwtIntervalSample> samples;
samples << QwtIntervalSample(10, QwtInterval(0, 10)); // [0,10] 区间,值=10
samples << QwtIntervalSample(25, QwtInterval(10, 20)); // [10,20] 区间,值=25
samples << QwtIntervalSample(15, QwtInterval(20, 30)); // [20,30] 区间,值=15
samples << QwtIntervalSample(30, QwtInterval(30, 40)); // [30,40] 区间,值=30
histogram->setSamples(samples);
// 设置样式
histogram->setPen(QPen(Qt::darkBlue, 1));
histogram->setBrush(QBrush(QColor(100, 150, 200)));
histogram->attach(plot);
plot->replot();
5.3 三种显示样式
cpp
// 柱状样式(默认)- 每个区间独立柱体
histogram->setStyle(QwtPlotHistogram::Columns);
// 轮廓样式 - 整体轮廓填充
histogram->setStyle(QwtPlotHistogram::Outline);
// 线条样式 - 仅绘制水平线条
histogram->setStyle(QwtPlotHistogram::Lines);
轮廓样式注意 :
Outline样式要求区间按递增顺序排列且不重叠,否则绘制结果异常。
5.4 柱体符号与渐变填充
和柱状图一样,直方图也可以用 QwtColumnSymbol 定制柱体外观,包括渐变填充:
cpp
#include <QwtColumnSymbol>
QwtColumnSymbol* symbol = new QwtColumnSymbol(QwtColumnSymbol::Box);
symbol->setFrameStyle(QwtColumnSymbol::Plain);
// 渐变填充
QLinearGradient gradient(0, 0, 0, 1);
gradient.setColorAt(0, Qt::blue);
gradient.setColorAt(1, Qt::darkBlue);
symbol->setBrush(QBrush(gradient));
symbol->setPen(QPen(Qt::black, 1));
histogram->setSymbol(symbol);
5.5 从原始数据生成统计直方图
实际应用中,通常是从一堆原始数据出发,先分箱统计再绘制:
cpp
// 原始数据
QVector<double> rawData;
for (int i = 0; i < 1000; i++) {
rawData << (rand() % 100); // 0-99 随机数
}
// 分箱统计
int binCount = 10;
double minVal = 0, maxVal = 100;
double binWidth = (maxVal - minVal) / binCount;
QVector<QwtIntervalSample> samples(binCount);
for (int i = 0; i < binCount; i++) {
double binMin = minVal + i * binWidth;
double binMax = binMin + binWidth;
int count = 0;
for (double val : rawData) {
if (val >= binMin && val < binMax) {
count++;
}
}
samples[i] = QwtIntervalSample(count, QwtInterval(binMin, binMax));
}
histogram->setSamples(samples);
5.6 QwtInterval 区间类
QwtInterval 表示数值区间,支持边界条件设置:
cpp
#include <QwtInterval>
QwtInterval interval(0, 100);
// 包含两端 [0, 100]
interval.setBorderFlags(QwtInterval::IncludeMinimum |
QwtInterval::IncludeMaximum);
// 排除两端 (0, 100)
interval.setBorderFlags(QwtInterval::ExcludeMinimum |
QwtInterval::ExcludeMaximum);
// 常用方法
double width = interval.width(); // 区间宽度
double min = interval.minValue(); // 最小值
double max = interval.maxValue(); // 最大值
bool contains = interval.contains(50); // 是否包含某值
六、与旧版本的区别
如果你从原版 Qwt 6.x 迁移到 7.0,需要特别注意以下变化:
| 特性 | 原版 Qwt 6.x | Qwt 7.0+ |
|---|---|---|
| 箱线图 | 不支持 | 7.2.0 新增 QwtPlotBoxChart |
| 柱状图 Pen/Brush | 接口有限 | 7.0 增强,定制更灵活 |
| 箱线图统计计算 | 无 | 内置 QwtBoxStatisticsCalculator,支持 5 种须须计算方法 |
| 异常值检测 | 无 | 自动检测,支持自定义符号和抖动 |
| 散点图 | 基础支持 | 性能优化,支持百万级数据点 |
| 多组柱状图 | 支持 | 支持,接口更完善 |
核心结论:箱线图是 7.0 系列最重要的新增图表类型,如果你有统计分析需求,升级到 7.2.0+ 是值得的。
七、总结与下一篇文章预告
本文介绍了 Qwt 7.0 中四种最常用的图表类型:
- 柱状图 (
QwtPlotBarChart/QwtPlotMultiBarChart):支持分组、堆叠、丰富的样式定制,7.0 增强了 Pen/Brush 接口 - 散点图 (
QwtPlotCurve散点模式):通过NoCurve + Symbol或Dots实现,百万级数据也能流畅渲染 - 箱线图 (
QwtPlotBoxChart):7.2.0 新增,内置统计计算器,支持 5 种须须计算方法和 3 种箱体样式 - 直方图 (
QwtPlotHistogram):基于区间数据结构,支持柱状、轮廓、线条三种样式
选型建议:
- 分类数据对比 → 柱状图
- 数据分布观察 → 散点图
- 统计分布分析 → 箱线图
- 频率分布展示 → 直方图
系列文章
- 第 1 篇:快速入门与核心新特性概览
- 第 2 篇:曲线绘图详解 ------ 从基础到百万级数据性能优化
- 第 3 篇:常用图表类型实战 ------ 柱状图、散点图、箱线图与直方图
- 第 4 篇:高级科学图表 ------ 光谱图、向量场、K线图与极坐标绘图
- 第 5 篇:多坐标轴与多绘图布局 ------ 寄生绘图与 QwtFigure 容器
- 第 6 篇:交互功能详解 ------ 平移、缩放、坐标轴交互与数据拾取
- 第 7 篇:3D 数据可视化 ------ OpenGL 高性能三维绘图
- 第 8 篇:坐标轴与刻度系统 ------ 刻度引擎、网格、图例与刻度朝内
- 第 9 篇:控件与辅助元素 ------ 滑块旋钮、标记与装饰
- 第 10 篇:总体架构解析 ------ 从单体到三库模块化的演进
- 第 11 篇:matplotlib 风格绘图 ------ QwtPyPlot 接口详解
相关链接