1.坐标标签类 QCPAxisTickerText
//调整X轴标签显示
QVector<QString> labels;
QVector<double> xPos;
m_xTickNumLess = 10;
labels.resize(m_xTickNumLess);
xPos.resize(m_xTickNumLess);
double posSpan = qFloor(1.0*histogramSize/m_xTickNumLess); //显示部分柱标签
double labelSpan = (maxPw-minPw)/histogramSize*posSpan;
for(int i = 0; i < m_xTickNumLess; i++){
xPos[i] = i*posSpan + 1 /*+ qFloor(posSpan/2.0)*/; //刻度位置挪到图中间
//柱标签为统计区间的中间位置所代表的值
labels[i] = QString::number(minPw + i*labelSpan /*+ (0.5+qFloor(posSpan/2.0))*(maxPw-minPw)/histogramSize*/, 'f', 2) + "us";
}
QSharedPointer<QCPAxisTickerText> xTicker(new QCPAxisTickerText);
xTicker->addTicks(xPos, labels);
ui->widget_pwStatisticsPlot->xAxis->setTicker(xTicker);
ui->widget_pwStatisticsPlot->replot();
2. QCPGraph类 画曲线 散点 空心点 类型选择
//先清空graph
ui->checkBox_scatterPoint->setCheckState(Qt::Checked);
ui->widget_freqStatisticsPlot->clearGraphs();
ui->widget_freqStatisticsPlot->clearPlottables();
//设置属性:散点
QCPGraph * curGraph = ui->widget_freqStatisticsPlot->addGraph();
curGraph->setLineStyle(QCPGraph::lsNone);
curGraph->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 4));
//设置坐标标签 界面背景颜色
initTable(ui->widget_freqStatisticsPlot," ","频率(MHz)");
//设置点颜色
ui->widget_freqStatisticsPlot->graph()->setPen(QColor(Qt::yellow));
ui->widget_freqStatisticsPlot->replot();
3. QCPBars类 柱状图
QCPBars *bar = new QCPBars(ui->widget_freqStatisticsPlot->xAxis,
ui->widget_freqStatisticsPlot->yAxis);
bar->setWidthType(QCPBars::wtPlotCoords);
bar->setBrush(Qt::blue);
//计算绘图数据
QVector<double> index;
index.resize(histogramSize);
for(int i = 1; i <= histogramSize; i++){
index[i-1] = i; //x轴数据从1~histogramSize
}
bar->setData(index, values);
4. QCPRange类 坐标范围调整
//必须先rescale坐标轴,使得坐标轴按数据设置好后再进行调整
ui->widget_freqStatisticsPlot->rescaleAxes();
QCPRange xRange = ui->widget_freqStatisticsPlot->xAxis->range();
double barWidth = bar->width();
ui->widget_freqStatisticsPlot->xAxis->setRange(xRange.lower-0.5*barWidth,
xRange.upper+0.5*barWidth);
5.坐标自动 更新自定义标签
//设置刻度标签个数
m_nXTickerCnt = m_stInitSet.stX.nTickerCnt;
m_nYTickerCnt = m_stInitSet.stY.nTickerCnt;
//设置x轴QCPAxisTickerText
ui->FreqPlot->xAxis->ticker().clear();
m_pXaxisTicker.clear();
m_pXaxisTicker = QSharedPointer<QCPAxisTickerText>(new QCPAxisTickerText);
connect(ui->FreqPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), this,
SLOT(slot_XaxisRangeChanged(QCPRange)),Qt::UniqueConnection);
ui->FreqPlot->xAxis->setTicker(m_pXaxisTicker);
void QCustomFrequencyPlot::slot_YaxisRangeChanged(QCPRange newRange)
{
double tickLen = newRange.size()/m_nYTickerCnt;//刻度标签间距
m_pYaxisTicker->clear();
QVector<double> ticks;//标签位置
QVector<QString> labels;//标签显示的值
for(int i=0; i<=m_nYTickerCnt; i++)
{
ticks.push_back(newRange.lower + i*tickLen);
#if 1 //Y轴刻度都加标签
labels.push_back(QString::number(newRange.lower + i*tickLen,'f',0));
#else //Y轴最上方刻度不加标签
if(m_nYTickerCnt != i)
{
labels.push_back(QString("%1").arg(newRange.lower + i*tickLen));
}
else
{
//labels.push_back(m_stInitSet.stY.strUnit);
}
#endif
}
m_pYaxisTicker->addTicks(ticks, labels);//更新刻度标签
}
6.QCPTextElement类,图表的标题
//载频统计分布图
int layoutRows = ui->widget_freqStatisticsPlot->plotLayout()->rowCount();
if(layoutRows == 1){ //只有在未添加标题时添加标题
QString strTitle;
strTitle = QStringLiteral("载频统计分布图");
QCPTextElement *title;
title = new QCPTextElement(ui->widget_freqStatisticsPlot, strTitle);
title->setTextColor(Qt::white);
ui->widget_freqStatisticsPlot->plotLayout()->insertRow(0);
ui->widget_freqStatisticsPlot->plotLayout()->addElement(0, 0, title);
}
7.设置 图表标签Legend
void init()
{
QStringList temp_title_list;
QVector<QColor> temp_color_list;
ui->widget_amplitude->legend->setVisible(true);
temp_title_list.clear();
temp_title_list<<"幅度(主)"<<"幅度(副)";
temp_color_list.clear();
temp_color_list<<QColor(211,231,47)<<QColor(28,111,249);
SetValueState(temp_title_list,temp_color_list);
}
void RadioDataForm::SetValueState(QStringList temp_title_list, QVector<QColor> color_list)
{
ui->widget_amplitude->addGraph();
ui->widget_amplitude->graph(i)->setName(temp_title_list.at(i));
title_list.append(temp_title_list.at(i));
QPen pen;
pen.setColor(color_list.at(i));
pen.setWidth(2);
ui->widget_amplitude->graph(i)->setPen(pen);
}
setLegendPosition(ui->widget_amplitude);
}
void RadioDataForm::setLegendPosition( QCustomPlot *plot )
{
plot->legend->setBrush(QColor(169,169,169));//设置图例背景
int count = plot->plotLayout()->rowCount();
QMargins marg(100,1,10,1);
plot->legend->addElement(0,1,plot->legend->item(1));
plot->legend->addElement(0,2,plot->legend->item(2));
marg.setLeft(200);
marg.setRight(200);
plot->legend->setMargins(marg);
plot->legend->setBorderPen(Qt::NoPen);
plot->plotLayout()->addElement(count,0,plot->legend);
plot->plotLayout()->setRowStretchFactor(count, 0.001);
}