[QCustomPlot] QCPBar绘制柱状图并同时显示柱状图的值

前言

博主在使用 qcustomplot 绘制柱状图时,发现网络上的教程。大都忽略了一个重要的点就是。柱状图没有明显显示出当前的值。经过博主寻找后发现在 qcustomplot 论坛中已经有了对应的解决方案。所以记录一下。qcustomplot论坛

代码

void MainWindow::drawBars()
{
    QCPBars *bars = new QCPBars(ui->customplot->xAxis, ui->customplot->yAxis);

    QVector<double> key;
    QVector<double> value;
    for(int i = 0; i < 5; i++)
    {
        //QCPItemText的效果类似于一个label
        QCPItemText *itemText = new QCPItemText(ui->customplot);
        itemText->setClipToAxisRect(false);
        //设置itemText的位置是跟随坐标系的
        itemText->position->setType(QCPItemPosition::ptPlotCoords);
        //设置itemText跟随的坐标系为 ui->customplot->xAxis, ui->customplot->yAxis
        itemText->position->setAxes(ui->customplot->xAxis, ui->customplot->yAxis);
        //设置itemText放置的位置
        itemText->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter);
        key.append(i + 1);
        value.append((i + 1) * 1000 + 123);
        //设置itemText显示的内容
        itemText->setText(QString::number(value.at(i)));
        //设置itemText显示的位置的坐标
        itemText->position->setCoords(key.at(i), value.at(i));
    }
    bars->addData(key, value);
    QStringList keyList({QStringLiteral("一月份"), QStringLiteral("二月份"), QStringLiteral("三月份"), QStringLiteral("四月份"), QStringLiteral("五月份")});
    QSharedPointer<QCPAxisTickerText> tickerText(new QCPAxisTickerText);
    //每个x轴的数据对应的label
    tickerText->addTicks(key, keyList.toVector());

    //将 ui->customplot->xAxis的坐标轴上的ticker 和 tickerLabel 更换为自定义的 tickerText
    ui->customplot->xAxis->setTicker(tickerText);
    //设置 ui->customplot->xAxis 的范围,以便能够看到全部的柱状图
    ui->customplot->xAxis->setRange(0, key.length() + 1);
    //ui->customplot->yAxis 自适应范围
    ui->customplot->yAxis->rescale();

    //y轴的单位
    ui->customplot->yAxis->setLabel(QStringLiteral("CNY"));
    //重新绘制才能生效
    ui->customplot->replot();
}

效果图

在这里插入图片描述

思考

如果要做悬浮显示当前柱状图的值,对于 qcustomplot 来说并没有现成的接口。可能就要稍微麻烦一些,博主没有尝试。但是可以参考以下文章QCustomplot绘制柱状图及显示数据。最后有不懂的欢迎各位大佬在评论区交流

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 对于QCoustomPlot绘制分组柱状图时,只显示一组的情况,可能是代码逻辑不正确或者数据传递出现问题导致的。建议从以下几个方面排查: 1. 数据传递:检查传递给QCustomPlot的数据是否正确,是否缺失,是否格式有误。可以打印输出,观察数据是否和预期一致。 2. 数据绑定:检查QCustomPlot是否正确获取了数据,并将数据绑定到绘制柱状图的方法中。需要确认数据是否按照分组的方式传递,是否正确绑定到每个组对应的柱状图上。 3. 代码逻辑:检查绘制分组柱状图的代码逻辑是否正确,分组是否全部被绘制显示,确保没有遗漏。需要确认是否正确调用了 QCPBarsGroup 类来组合多个柱状图,并配置好每个柱状图所在的分组。 4. 坐标轴设置:检查是否设置了正确的坐标轴范围和标签,确保显示柱状图全部在坐标系的范围内。 总之,对于每一个函数和设置都需要认真检查,以便快速找到问题解决方案。一旦找到问题,可以通过调整代码实现正常绘制分组柱状图。 ### 回答2: QCustomPlot是一个用于绘制科学、工程和金融数据可视化的Qt绘图库。要绘制分组柱状图,并且每次只显示其中一组数据,可以按照以下步骤操作: 1. 创建一个QCustomPlot对象并设置绘图区域的大小和标题等属性。 2. 创建一个或多个QCPBars对象,并将它们添加到QCustomPlot对象中。每个QCPBars对象代表一个柱状图的组。 3. 设置每个QCPBars对象的数据。例如,使用setData方法设置每个组的数据,可以通过一个QVector来表示每个组的。 4. 设置每个QCPBars对象的宽度、颜色和透明度等属性。 5. 使用QCPAxisRect类的方法设置x轴和y轴的范围、刻度和标签等属性。 6. 为了实现每次只显示一组数据,可以使用QTimer来控制,通过计时器的触发事件,动态改变柱状图显示。在计时器的槽函数中,可以设置当前要显示的组数据,然后调用QCustomPlot的replot()方法来重新绘制图形。 7. 在主窗口或其他适当的地方启动和停止计时器,在需要切换组数据时启动计时器,在需要停止切换时停止计时器。 以上是使用QCustomPlot绘制分组柱状图,并且每次只显示一组数据的大致步骤。具体的代码实现需要根据具体需求进行编写和调整。 ### 回答3: QCustomPlot是一个强大的开源绘图库,可以绘制各种类型的图表。如果想要实现绘制分组柱状图,并且每次只显示一组数据,可以按照以下步骤进行操作: 1. 创建一个QCustomPlot对象,并设置图表的大小和标题。 ```cpp QCustomPlot *customPlot = new QCustomPlot(); customPlot->setMinimumSize(500, 500); customPlot->plotLayout()->insertRow(0); customPlot->plotLayout()->addElement(0, 0, new QCPTextElement(customPlot, "分组柱状图", QFont("Arial", 12, QFont::Bold))); ``` 2. 创建两个QCPBars对象,分别用于表示两组数据的柱状图。 ```cpp QCPBars *group1 = new QCPBars(customPlot->xAxis, customPlot->yAxis); QCPBars *group2 = new QCPBars(customPlot->xAxis, customPlot->yAxis); ``` 3. 设置每组数据的样式,包括颜色、宽度等属性。 ```cpp group1->setBrush(QColor(0, 0, 255, 50)); // 设置第一组数据的填充色为蓝色 group2->setBrush(QColor(255, 0, 0, 50)); // 设置第二组数据的填充色为红色 group1->setWidth(0.4); // 设置每个柱的宽度为0.4 group2->setWidth(0.4); ``` 4. 添加数据到柱状图中,并规定每组数据在x轴上的位置。 ```cpp QVector<double> xData = {1, 2, 3}; // x轴数据(例如1,2,3代表三个类别) QVector<double> yData1 = {10, 20, 30}; // 第一组数据的y轴数据 QVector<double> yData2 = {20, 30, 40}; // 第二组数据的y轴数据 group1->setData(xData, yData1); // 添加第一组数据到柱状图中 group2->setData(xData, yData2); // 添加第二组数据到柱状图中 ``` 5. 设置x轴和y轴的标签和范围。 ```cpp customPlot->xAxis->setLabel("类别"); customPlot->yAxis->setLabel("数"); customPlot->xAxis->setRange(0.5, 3.5); // 设置x轴的范围 customPlot->yAxis->setRange(0, 50); // 设置y轴的范围 ``` 6. 显示图表。 ```cpp customPlot->rescaleAxes(); // 调整轴的刻度范围以适应数据 customPlot->replot(); // 重新绘制图表 ``` 通过以上步骤,我们可以实现使用QCustomPlot绘制分组柱状图,并且每次只显示一组数据。你可以根据具体需求调整每组数据的样式和位置,以及x轴和y轴的范围和标签。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值