QT绘制饼图+柱状图+折线图

这篇具有很好参考价值的文章主要介绍了QT绘制饼图+柱状图+折线图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目需要使用到不同的统计图案的方法来显示统计数据
包括:饼图、柱状图、折线图。

饼图的实现

具体实现代码如下:

首先需要一个QChartView来存放饼图,实现如下:
拖拽一个QGraphicsView,并且将其提升为QChartView
qt制作饼状图,QT,qt,ui,开发语言
qt制作饼状图,QT,qt,ui,开发语言

 	  QPieSeries* series = new QPieSeries();            // 创建一个饼图对象(设置孔径就是圆环)
    series->append("Y1", 1);                          // 添加饼图切片
    series->append("Y2", 2);
    series->append("Y3", 3);
    series->append("Y4", 4);
    series->append("Y5", 5);
    series->setHoleSize(0);//饼图中间是否需要填洞
    series->setPieSize(1);//设置大小:这里的大小就是占据整个view的大小

    QPieSlice* slice;       // 获取饼图中某一个切片(在绘制圆环图Demo中是通过appent函数获取,这里换一种方式)
    QFont font("Arial", 5);

//    slice->setExploded();                            // 将切片分离饼图
//    slice->setLabelVisible();                        // 显示当前切片的标签
//    slice->setPen(QPen(Qt::darkGreen, 2));           // 设置画笔颜色和粗细
//    slice->setBrush(Qt::green);                      // 设置切片背景色

    QChart* chart = ui->chartViewPie->chart();           // 获取QChartView中默认的QChart
    chart->addSeries(series);                        // 将创建好的饼图对象添加进QChart
    chart->setTitle("饼图标题");                      // 设置图表标题

    for(int i=0;i<5;i++)
    {
        slice = series->slices().at(i);
        slice->setLabel(QString::asprintf("%.0f人,%.1f",slice->value(),slice->percentage()));
        slice->setLabelPosition(QPieSlice::LabelInsideNormal);
        connect(slice,&QPieSlice::hovered,this,&MainWindow::on_slice_highlight);
        slice->setLabelFont(font);
    }
    chart->addSeries(series);
    chart->legend()->setAlignment(Qt::AlignRight);
    ui->chartViewPie->chart()->setTheme(QChart::ChartThemeLight);
    ui->chartViewPie->setStyleSheet("background-color:#1964C8");
    chart->setBackgroundVisible(true);  //去背景

qt制作饼状图,QT,qt,ui,开发语言

柱状图的实现

同上:
首先需要一个QChartView来存放饼图,实现如下:拖拽一个QGraphicsView,并且将其提升为QChartView



    QLinearGradient gradient(0, 0, 0, 400);
    gradient.setColorAt(0, QColor(25, 100, 200,70));
    ui->customPlot_2->setBackground(QBrush(gradient));


    QCPAxis *keyAxis = ui->customPlot_2->xAxis;
    QCPAxis *valueAxis = ui->customPlot_2->yAxis;//纵向显示


    QCPBars *fossil = new QCPBars(keyAxis, valueAxis);  // 使用xAxis作为柱状图的key轴,yAxis作为value轴

    fossil->setAntialiased(false); // 为了更好的边框效果,关闭抗齿锯
   //fossil->setName("Fossil fuels"); // 设置柱状图的名字,可在图例中显示
    fossil->setPen(QPen(QColor(0, 168, 140).lighter(130))); // 设置柱状图的边框颜色
    fossil->setBrush(QColor(0, 168, 140));  // 设置柱状图的画刷颜色

    // 为柱状图设置一个文字类型的key轴,ticks决定了轴的范围,而labels决定了轴的刻度文字的显示
    QVector<double> ticks;
    QVector<QString> labels;
    ticks << 1 << 2 << 3 << 4 << 5 << 6 << 7;
    labels << "USA" << "Japan" << "Germany" << "France" << "UK" << "Italy" << "Canada";
    QSharedPointer<QCPAxisTickerText> textTicker(new QCPAxisTickerText);
    textTicker->addTicks(ticks, labels);

    keyAxis->setTicker(textTicker);        // 设置为文字轴
    keyAxis->setTickLabelRotation(60);     // 轴刻度文字旋转60度
    keyAxis->setSubTicks(false);           // 不显示子刻度
    keyAxis->setTickLength(0, 4);          // 轴内外刻度的长度分别是0,4,也就是轴内的刻度线不显示
    keyAxis->setRange(0, 8);               // 设置范围
   // keyAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);

    keyAxis->setBasePen(QPen(Qt::white));
    keyAxis->setTickPen(QPen(Qt::white));
    keyAxis->setTickLabelColor(Qt::white);
    keyAxis->setLabelColor(Qt::white);

    valueAxis->setRange(0, 12.1);
    valueAxis->setPadding(35);             // 轴的内边距,可以到QCustomPlot之开始(一)看图解
    valueAxis->setSubTicks(false);           // 不显示子刻度
    valueAxis->setLabel("Power Consumption in\nKilowatts per Capita (2007)");
    //valueAxis->setUpperEnding(QCPLineEnding::esSpikeArrow);

    valueAxis->setBasePen(QPen(Qt::white));
    valueAxis->setTickPen(QPen(Qt::white));
    valueAxis->setTickLabelColor(Qt::white);
    valueAxis->setLabelColor(Qt::white);
    QVector<double> fossilData;
    fossilData  << 0.86*10.5 << 0.83*5.5 << 0.84*5.5 << 0.52*5.8 << 0.89*5.2 << 0.90*4.2 << 0.67*11.2;
    fossil->setData(ticks, fossilData);

绘制结果如下:

纵向显示
qt制作饼状图,QT,qt,ui,开发语言

需要横向显示,将坐标轴替换即可。

    QCPAxis *keyAxis = ui->customPlot->yAxis;
    QCPAxis *valueAxis = ui->customPlot->xAxis;//横向显示

qt制作饼状图,QT,qt,ui,开发语言

折线图的实现

同上:
首先需要一个QChartView来存放饼图,实现如下:拖拽一个QGraphicsView,并且将其提升为QChartView
绘制折线图的是时候,需要添加QCustomplot文件,通过该库函数来绘制折线图。

QLinearGradient gradient1(0, 0, 0, 400);
    gradient1.setColorAt(0, QColor(25, 100, 200,70));
    ui->customPlot_3->setBackground(QBrush(gradient1));
    QVector<double> x(101), y(101); // initialize with entries 0..100
    for (int i=0; i<101; ++i)
    {
      x[i] = i/50.0 - 1; // x goes from -1 to 1
      y[i] = x[i]*x[i];  // let's plot a quadratic function
    }
    // create graph and assign data to it:
    //添加第一条曲线
    ui->customPlot_3->addGraph();
    ui->customPlot_3->graph(0)->setData(x, y);
    // give the axes some labels:
    ui->customPlot_3->xAxis->setLabel("x");
    ui->customPlot_3->yAxis->setLabel("y");
    // set axes ranges, so we see all data:
    ui->customPlot_3->xAxis->setRange(-10, 20);
    ui->customPlot_3->yAxis->setRange(0, 3);

    QVector<double> u(201), z(201); // initialize with entries 0..100
    z<<1<<2<<1<<2<<1<<2<<1<<2<<1<<2<<1<<2<<1<<2<<1<<2;
    u<<1<<2<<3<<4<<5<<6<<7<<8<<9<<10<<11<<12<<13<<14<<15<<16;
    //添加第二条曲线
    ui->customPlot_3->addGraph(); // blue line
    ui->customPlot_3->graph(1)->setData(u, z);
    ui->customPlot_3->graph(1)->setPen(QPen(QColor(40, 255, 255)));

实现效果如下:
qt制作饼状图,QT,qt,ui,开发语言

绘制柱状分组图

    //第三张图
    gradient.setColorAt(0.5, QColor(25, 100, 200,70));
    ui->customPlot->setBackground(QBrush(gradient));
    // create empty bar chart objects:
    QCPBars *regen = new QCPBars(ui->customPlot->xAxis, ui->customPlot->yAxis);
    QCPBars *nuclear = new QCPBars(ui->customPlot->xAxis, ui->customPlot->yAxis);
    QCPBars *fossil1 = new QCPBars(ui->customPlot->xAxis, ui->customPlot->yAxis);
    regen->setAntialiased(false); // gives more crisp, pixel aligned bar borders
    nuclear->setAntialiased(false);
    fossil1->setAntialiased(false);
    // set names and colors:
    fossil1->setName("Fossil fuels");
    fossil1->setPen(QPen(QColor(111, 9, 176).lighter(170)));
    fossil1->setBrush(QColor(111, 9, 176));
    nuclear->setName("Nuclear");
    nuclear->setPen(QPen(QColor(250, 170, 20).lighter(150)));
    nuclear->setBrush(QColor(250, 170, 20));
    regen->setName("Regenerative");
    regen->setPen(QPen(QColor(0, 168, 140).lighter(130)));
    regen->setBrush(QColor(0, 168, 140));
    
    // prepare x axis with country labels:
    QVector<double> ticks1;
    QVector<QString> labels1;
    ticks1 << 1 << 2 << 3 << 4 << 5 << 6 << 7;
    labels1 << "USA" << "Japan" << "Germany" << "France" << "UK" << "Italy" << "Canada";
    QSharedPointer<QCPAxisTickerText> textTicker1(new QCPAxisTickerText);
    textTicker1->addTicks(ticks1, labels1);
    ui->customPlot->xAxis->setTicker(textTicker1);
    ui->customPlot->xAxis->setTickLabelRotation(60);
    ui->customPlot->xAxis->setSubTicks(false);
    ui->customPlot->xAxis->setTickLength(0, 4);
    ui->customPlot->xAxis->setRange(0, 8);
    ui->customPlot->xAxis->setBasePen(QPen(Qt::white));
    ui->customPlot->xAxis->setTickPen(QPen(Qt::white));
    ui->customPlot->xAxis->grid()->setVisible(true);
    ui->customPlot->xAxis->grid()->setPen(QPen(QColor(130, 130, 130), 0, Qt::DotLine));
    ui->customPlot->xAxis->setTickLabelColor(Qt::white);
    ui->customPlot->xAxis->setLabelColor(Qt::white);
    // prepare y axis:
    ui->customPlot->yAxis->setRange(0, 12.1);
    ui->customPlot->yAxis->setPadding(5); // a bit more space to the left border
    ui->customPlot->yAxis->setLabel("Power Consumption in\nKilowatts per Capita (2007)");
    ui->customPlot->yAxis->setBasePen(QPen(Qt::white));
    ui->customPlot->yAxis->setTickPen(QPen(Qt::white));
    ui->customPlot->yAxis->setSubTickPen(QPen(Qt::white));
   // ui->customPlot->yAxis->grid()->setSubGridVisible(true);
    ui->customPlot->yAxis->setTickLabelColor(Qt::white);
    ui->customPlot->yAxis->setLabelColor(Qt::white);
    ui->customPlot->yAxis->grid()->setPen(QPen(QColor(130, 130, 130), 0, Qt::SolidLine));
    ui->customPlot->yAxis->grid()->setSubGridPen(QPen(QColor(130, 130, 130), 0, Qt::DotLine));
    // Add data:
    QVector<double> fossil1Data, nuclearData, regenData;
    fossil1Data  << 0.86*10.5 << 0.83*5.5 << 0.84*5.5 << 0.52*5.8 << 0.89*5.2 << 0.90*4.2 << 0.67*11.2;
    nuclearData << 0.08*10.5 << 0.12*5.5 << 0.12*5.5 << 0.40*5.8 << 0.09*5.2 << 0.00*4.2 << 0.07*11.2;
    regenData   << 0.06*10.5 << 0.05*5.5 << 0.04*5.5 << 0.06*5.8 << 0.02*5.2 << 0.07*4.2 << 0.25*11.2;
    fossil1->setData(ticks, fossilData);
    nuclear->setData(ticks, nuclearData);
    regen->setData(ticks, regenData);
    
   

在上面的代码中添加如下代码,实现柱状图的分组。

 //柱状分组图
    QCPBarsGroup *group = new QCPBarsGroup(ui->customPlot);
    QList<QCPBars*> bars;
    bars<<fossil1<<nuclear<<regen;
    foreach (QCPBars *bar, bars) {
    // 设置柱状图的宽度类型为以key坐标轴计算宽度的大小,其实默认就是这种方式
        bar->setWidthType(QCPBars::wtPlotCoords);
        bar->setWidth(bar->width() / bars.size()); // 设置柱状图的宽度大小
        group->append(bar);  // 将柱状图加入柱状图分组中
    }
    group->setSpacingType(QCPBarsGroup::stAbsolute);  // 设置组内柱状图的间距,按像素
    group->setSpacing(2);     // 设置较小的间距值,这样看起来更紧凑
    ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom| QCP::iSelectPlottables);

实现效果如下:
qt制作饼状图,QT,qt,ui,开发语言文章来源地址https://www.toymoban.com/news/detail-566067.html

到了这里,关于QT绘制饼图+柱状图+折线图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用pygal库绘制直方图、XY线图和饼状图的技术指南

    pygal是一个功能强大的Python库,用于绘制漂亮且交互性强的数据可视化图表。本文将深入介绍如何使用pygal库绘制直方图、XY线图和饼状图,并通过案例讲解帮助读者更好地掌握这些功能。 直方图是一种用于表示数据分布的图表,通过柱形的高度展示不同数值的频率。下面是绘

    2024年01月21日
    浏览(34)
  • QChart实现ui界面上指定位置饼状图、圆环图的绘制

    近期开发遇上了绘制饼图的需求,笔者前期使用QCustomPlot图形库进行一些图形组件的开发是非常方便的,但是这个库没有实现饼图的绘制,所以后面是使用QChart来实现饼状图的开发。本文主要讲述了使用Qt下的Charts 模块来进行饼图的绘制,并结合Qt Creator里面的示例,在这里编

    2024年02月08日
    浏览(56)
  • python柱状图、直方图和饼状图统计学生成绩

    Python的matplotlib库具有很强大的绘图功能,可以利用这个库函数来进行学生成绩统计。假如有一个班的某科学生成绩如表1所示,可以用柱状图、直方图和饼状图三种方式来进行统计分析。下边介绍一下操作步骤。 表1 学生成绩表 学号 分数 20221001 61 20221002 68 20221003 74 20221004 7

    2024年02月11日
    浏览(43)
  • 【Python数据可视化】matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图

    文章传送门 Python 数据可视化 matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图 matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值 matplotlib之增加图形内容:设置图例、设置中文标题、设置网格效果 matplo

    2024年01月16日
    浏览(33)
  • 数据可视化|Python之Pyecharts将“爬虫数据”绘制饼状图

    前言 本文是该专栏的第40篇,后面会持续分享python数据分析的干货知识,记得关注。 在项目中,可能有些同学或多或少遇见这样的需求。将爬虫采集下来的数据,进行图像可视化处理,方便其他业务线进行数据分析处理。 而本文,笔者将以某个 爬虫案例 的采集数据为例子,

    2024年01月18日
    浏览(35)
  • PyQt5可视化 7 饼图和柱状图实操案例 ①Qt项目的创建

    目录 一、新建Qt项目 二、添加组件和布局 三、添加资源 1. 新建资源文件

    2024年02月03日
    浏览(22)
  • Qt绘制曲线图(基于qt画图QPainter)

    在没有QCharst模块时,可以使用QPainter自定义绘制曲线折线图 下面提供完整代码供参考: 直接在qt创建一个QMainWindow类的app的工程,不自动生成ui文件,然后把下面代码复制到mainwindow.cpp编译运行即可。 mainwindow.cpp: //博客:booinon //https://blog.csdn.net/boonion?spm=1011.2415.3001.5343

    2024年02月11日
    浏览(34)
  • Qt---多线程绘制折线图

    Qt多线程绘制折线图 需求:在ui中绘制折线图,需要在子线程中操作ui界面上的对象。因为子线程中创建图形化相关的不被允许,因此【思路1:】在子线程中仅仅读取数据,进行数据处理,将数据处理的结果返回给主线程,主线程操作ui界面进行绘制折线图。【思路2:】将u

    2024年02月14日
    浏览(27)
  • Qt(十三)QChart绘制折线图

    一、简单绘图 Qt Charts基于Qt的Graphics View架构,其核心组件是 QChartView 和 QChart QChartView是显示图标的视图,基类为QGraphicsView QChart的基类是QGraphicsltem 类的继承关系: 创建项目: .pro 文件中添加: QT += charts 代码如下:其他文件未修改,修改代码只在mainwindow.cpp文件中进行。 m

    2024年02月02日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包