Plot QWT光谱图轴调整,用于区域非像素
您好,我正在使用qwtspectrogram绘制阵列数据,但我遇到的问题是缩放。。qwt标度分布在间隔x和y上,轴取决于像素。例如,如果我有一个500x500的数据集向量,我想绘制500mm x500mm的向量,这是完美的,因为它是在像素上平移的,但是如果我想绘制300mmx300mm的500x500个点,这是一个混乱,它显示在500x500的图中,我知道我必须管理x轴和y轴,但我不知道如何做到这一点。我设法玩了一点,在250mmx250mm区域显示500x500,但在其他区域无法显示。 我的代码如下所示Plot QWT光谱图轴调整,用于区域非像素,plot,axis,pixel,qwt,spectrogram,Plot,Axis,Pixel,Qwt,Spectrogram,您好,我正在使用qwtspectrogram绘制阵列数据,但我遇到的问题是缩放。。qwt标度分布在间隔x和y上,轴取决于像素。例如,如果我有一个500x500的数据集向量,我想绘制500mm x500mm的向量,这是完美的,因为它是在像素上平移的,但是如果我想绘制300mmx300mm的500x500个点,这是一个混乱,它显示在500x500的图中,我知道我必须管理x轴和y轴,但我不知道如何做到这一点。我设法玩了一点,在250mmx250mm区域显示500x500,但在其他区域无法显示。 我的代
class mydata: public QwtRasterData
{
char filepath[35];
QFile myfile;
QVector<qint16> fileBuf;
int pixel =500; // it represents the number of pixels in one row or column
int dial =1000;
public:
mydata()
{
setInterval( Qt::XAxis, QwtInterval( 0, (pixel)-1 ) );
setInterval( Qt::YAxis, QwtInterval( 0, (pixel)-1 ) );
setInterval( Qt::ZAxis, QwtInterval( -dial, dial ) );
{
sprintf_s(filepath, "c:\\myfile.bin");
myfile.setFileName(filepath);
if(!myfile.open(QIODevice::ReadOnly)) return;
QDataStream data(&myfile);
data.setByteOrder(QDataStream::LittleEndian);
while(!data.atEnd()) {
qint16 x;
data >> x;
fileBuf.append(x);
}
myfile.close();
}
}
virtual double value( double x, double y ) const//shifted
{
int x_pos = static_cast<int>(x);
int y_pos = static_cast<int>(y);
double c = (fileBuf[ ((x_pos)+((pixel-(y_pos))*pixel))]);
return c;
}
}
简言之,不同区域的像素数相同,但在绘图中轴的表示方式相同 这里有一个类,它将比例的双值转换为字符串并显示
class MyScaleDraw: public QwtScaleDraw
{
public:
MyScaleDraw()
{
setTickLength( QwtScaleDiv::MajorTick, 10 );
setTickLength( QwtScaleDiv::MinorTick, 2 );
setTickLength( QwtScaleDiv::MediumTick, 0 );
setLabelRotation( 0 );
setLabelAlignment( Qt::AlignLeft | Qt::AlignVCenter );
setSpacing( 10 );
}
virtual QwtText label( double value ) const
{
QwtText h=QwtText(QString::number(value*0.75); //use any scaling factor you want
return h;
}
};
创建绘图后,包括以下代码
d_plot->setAxisScaleDraw( QwtPlot::xBottom, new MyScaleDraw() );
d_plot->setAxisScaleDraw( QwtPlot::yLeft, new MyScaleDraw() );
这解决了我的问题