新手求教,qwt画出的图形无法显示出全部数据

禅悟人生 2016-01-07 11:19:53
用qt做一个界面,目的是画出频谱图,使用qwt库,发现导入数据后,不同窗口大小显示的数据不一样,比如默认窗口大小显示大小如下
拉大一点后,图像变成这样

放到最大,结果如下

而相同数据用matlab画出的图应该是这样

请问用什么办法使其显示出所有数据?
代码如下:
plot.h
#include <qwt_plot.h>
#include <qwt_plot_spectrogram.h>

class Plot : public QwtPlot
{
Q_OBJECT

public:

Plot(QWidget * = NULL);

public slots:

private:
QwtPlotSpectrogram *d_spectrogram;
};

plot.cpp
#include <qprinter.h>
#include <qprintdialog.h>
#include <qnumeric.h>
#include <qwt_color_map.h>
#include <qwt_plot_spectrogram.h>
#include <qwt_scale_widget.h>
#include <qwt_scale_draw.h>
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_layout.h>
#include <qwt_plot_renderer.h>
#include <qwt_matrix_raster_data.h>
#include "plot.h"
#include <QFile>
#include<QtAlgorithms>



class MyZoomer : public QwtPlotZoomer
{
public:
MyZoomer(QWidget *canvas) :
QwtPlotZoomer(canvas)
{
setTrackerMode(AlwaysOn);
}

virtual QwtText trackerTextF(const QPointF &pos) const
{
QColor bg(Qt::white);
//设置背景透明度
bg.setAlpha(20);
//QwtPlotZoomer::trackerTextF返回x,y的坐标轴的刻度数
QwtText text = QwtPlotZoomer::trackerTextF(pos);
text.setBackgroundBrush(QBrush(bg));
return text;
}
};

class SpectrogramData : public QwtMatrixRasterData
{
public:
SpectrogramData()
{

QFile data("H:/STUDY/Qtproject/spectromgramTest/est.bin");
if (data.open(QFile::ReadOnly))
{
QDataStream instream(&data);
QVector<double> rawData;
double *temp = new double[10000 * 300];
instream.readRawData((char*)temp, 10000 * 300 * sizeof(double));
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 300; j++)
{
rawData += temp[j * 10000 + i];
}
}

setValueMatrix(rawData, 300);

delete[] temp;
}

setInterval(Qt::XAxis, QwtInterval(0, 1));
setInterval(Qt::YAxis, QwtInterval(0,10));
setInterval(Qt::ZAxis, QwtInterval(0.0, 0.01));
}

};

class LinearColorMapRGB : public QwtLinearColorMap
{
public:
LinearColorMapRGB() :
//首尾颜色
QwtLinearColorMap(Qt::darkCyan, Qt::red, QwtColorMap::RGB)
{
addColorStop(0.0, Qt::black);
addColorStop(0.6, Qt::green);
addColorStop(0.75, Qt::white);
}
};



Plot::Plot(QWidget *parent) :
QwtPlot(parent)
{
d_spectrogram = new QwtPlotSpectrogram();
// use system specific thread count
//设置线程数和缓存,影响不大
d_spectrogram->setRenderThreadCount(0);
d_spectrogram->setCachePolicy(QwtPlotRasterItem::PaintCache);

d_spectrogram->setData(new SpectrogramData());
d_spectrogram->attach(this);

//设置轮廓线的数量和层次(当值为多少时画一条轮廓线)
QList<double> contourLevels;
for ( double level =0.001; level <0.1; level += 0.002)
contourLevels += level;//不是相加,是在其后面添加元素
d_spectrogram->setContourLevels( contourLevels );

const QwtInterval zInterval = d_spectrogram->data()->interval(Qt::ZAxis);

// A color bar on the right axis
QwtScaleWidget *rightAxis = axisWidget(QwtPlot::yRight);
rightAxis->setTitle("Intensity");
//仅设置这个还不行
rightAxis->setColorBarEnabled(true);

setAxisScale(QwtPlot::yRight, zInterval.minValue(), zInterval.maxValue());
enableAxis(QwtPlot::yRight);//默认disabed

//设置画布对齐到所有坐标轴
plotLayout()->setAlignCanvasToScales(true);

//设置为RGBColorMap
d_spectrogram->setColorMap(new LinearColorMapRGB());
rightAxis->setColorMap(zInterval, new LinearColorMapRGB());

//设置显示模式
d_spectrogram->setDisplayMode(QwtPlotSpectrogram::ContourMode,true);
d_spectrogram->setDisplayMode( QwtPlotSpectrogram::ImageMode, false);

//设置鼠标操作
// LeftButton for the zooming
// MidButton for the panning
// RightButton: zoom out by 1
// Ctrl+RighButton: zoom out to full size
QwtPlotZoomer* zoomer = new MyZoomer(canvas());
//修改某一操作,比如一步返回到不放大状态
zoomer->setMousePattern(QwtEventPattern::MouseSelect2,
Qt::RightButton, Qt::ControlModifier);
zoomer->setMousePattern(QwtEventPattern::MouseSelect3,
Qt::RightButton);
const QColor c(Qt::red);
//设置RubberBandPen选择框笔触
zoomer->setRubberBandPen(c);
//设置TrackerPen笔触
zoomer->setTrackerPen(c);

QwtPlotPanner *panner = new QwtPlotPanner(canvas());
//移动绘图时候右边colorbar不需要自动改变刻度
panner->setAxisEnabled(QwtPlot::yRight, false);
panner->setMouseButton(Qt::MidButton);

// Avoid jumping when labels with more/less digits
// appear/disappear when scrolling vertically

const QFontMetrics fm(axisWidget(QwtPlot::yLeft)->font());
QwtScaleDraw *sd = axisScaleDraw(QwtPlot::yLeft);
sd->setMinimumExtent(fm.width("100.00"));

}

...全文
1335 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ_278397935 2016-06-07
  • 打赏
  • 举报
回复
/* 画布纵横比 */ QwtPlotRescaler *plotRescaler = new QwtPlotRescaler(ui->qwtPlotCurve->canvas(), ui->qwtPlotCurve->yLeft, QwtPlotRescaler::Expanding); plotRescaler->setExpandingDirection(QwtPlotRescaler::ExpandBoth);
未狂 2016-01-07
  • 打赏
  • 举报
回复
没用过qwt 但是窗口拉大了,图的分辨率就会高,精确度也就越高,原来因为小数位太高被省略的点,就会因为小数位后延伸能保存足够小的数,所以显示出来小图没有显示的点……
未狂 2016-01-07
  • 打赏
  • 举报
回复
最好约定一下点的精确度,比如小数点后多少位就强制清零,应该就没问题了
禅悟人生 2016-01-07
  • 打赏
  • 举报
回复
引用 2 楼 shihoongbo 的回复:
最好约定一下点的精确度,比如小数点后多少位就强制清零,应该就没问题了
请问怎么约束点的精度?还可以约束坐标轴上点的精度???

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧