Qwt QwtPlotBarChart自定义条形统计图

news2025/1/12 6:44:29

1.概述

QwtPlotBarChart 是 Qt 绘图库 Qwt 中的一个类,用于绘制柱状图。它可以将数据通过柱形的高度来展示,方便比较不同数据量的大小差别。QwtPlotBarChart 类提供了一些方法和属性来设置柱形的样式、颜色、边界等。

以下是类的继承关系图:

2. 常用方法

设置数据:

  • void setSamples (const QVector< QPointF > &)
  • void setSamples (const QVector< double > &)
  • void setSamples (QwtSeriesData< QPointF > *)

自定义条形统计图,需重写函数:

  • virtual QwtColumnSymbol * specialSymbol (int sampleIndex, const QPointF &) const
  • virtual QwtText barTitle (int sampleIndex) const

设置间距:

  • void setSpacing (int) 设置间距
  • void setMargin (int)  设置外边距

设置方向:

  • void setOrientation (Qt::Orientation)

设置基线:

  • void setBaseline (double)

设置图例:

  • setLegendMode( QwtPlotBarChart::LegendBarTitles );设置图例显示模式
  • setLegendIconSize( QSize( 10, 14 ) ); 设置图例图标大小

3.示例

示例1:一个简单的条形统计图

可以明显看见效果很差,坐标轴不美观,条形图没有颜色外观。

#include "BarChartSingleWidget.h"
#include "ui_BarChartSingleWidget.h"
#include "qwt_plot.h"
#include "qwt_plot_curve.h"
#include "qwt_text.h"
#include "qwt_legend.h"
#include "qwt_symbol.h"
#include "qwt_plot_marker.h"
#include "qwt_plot_grid.h"
#include "qwt_scale_div.h"
#include "qwt_plot_canvas.h"
#include "qwt_plot_legenditem.h"
#include "qwt_math.h"
#include "qwt_plot_layout.h"
#include "qwt_plot_barchart.h"
#include "qwt_scale_draw.h"
#include "qwt_column_symbol.h"
#include "qwt_plot_renderer.h"

static QwtPlot *g_plot = nullptr;

BarChartSingleWidget::BarChartSingleWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::BarChartSingleWidget)
{
    ui->setupUi(this);

    //设置plot背景色
    g_plot = new QwtPlot(QwtText("XX学校学生人数统计"),this);
    g_plot->setAutoFillBackground( true );
    g_plot->setPalette( QColor( "Linen" ) );

    //设置画布
    QwtPlotCanvas* canvas = new QwtPlotCanvas();
    canvas->setLineWidth( 2 );
    canvas->setFrameStyle( QFrame::Box | QFrame::Sunken );
    canvas->setBorderRadius( 10 );

    //设置画布的背景色
    QPalette canvasPalette( QColor( "Plum" ) );
    canvasPalette.setColor( QPalette::WindowText, QColor( "Indigo" ) );
    canvas->setPalette( canvasPalette );

    g_plot->setCanvas( canvas );

    // 创建数据
    QVector<double> data;
    data << 10 << 20 << 30 << 40;

    // 创建柱状图
    QwtPlotBarChart *barChart = new QwtPlotBarChart();

    // 将数据设置到柱状图上
    barChart->setSamples(data);

    // 将柱状图添加到绘图对象中
    barChart->attach(g_plot);

    // 显示绘图对象
    ui->verticalLayout->addWidget(g_plot);
}

BarChartSingleWidget::~BarChartSingleWidget()
{
    delete ui;
}

示例2:自定义条形统计图

增加bar颜色,自定义坐标轴。

首先自定义bar继承QwtPlotBarChart类,重写specialSymbol和barTitle方法。

然后自定义坐标轴继承QwtScaleDraw类,重写label方法。

#ifndef BARCHARTSINGLEWIDGET_H
#define BARCHARTSINGLEWIDGET_H

#include <QWidget>

namespace Ui {
class BarChartSingleWidget;
}

class BarChartSingleWidget : public QWidget
{
    Q_OBJECT

public:
    explicit BarChartSingleWidget(QWidget *parent = 0);
    ~BarChartSingleWidget();

private:
    Ui::BarChartSingleWidget *ui;

    QStringList m_distros;
};

#endif // BARCHARTSINGLEWIDGET_H


#include "BarChartSingleWidget.h"
#include "ui_BarChartSingleWidget.h"
#include "qwt_plot.h"
#include "qwt_plot_curve.h"
#include "qwt_text.h"
#include "qwt_legend.h"
#include "qwt_symbol.h"
#include "qwt_plot_marker.h"
#include "qwt_plot_grid.h"
#include "qwt_scale_div.h"
#include "qwt_plot_canvas.h"
#include "qwt_plot_legenditem.h"
#include "qwt_math.h"
#include "qwt_plot_layout.h"
#include "qwt_plot_barchart.h"
#include "qwt_scale_draw.h"
#include "qwt_column_symbol.h"
#include "qwt_plot_renderer.h"

//自定义坐标轴
class ScaleDraw : public QwtScaleDraw
{
  public:
    ScaleDraw( Qt::Orientation orientation, const QStringList& labels )
        : m_labels( labels )
    {
        setTickLength( QwtScaleDiv::MinorTick, 0 );
        setTickLength( QwtScaleDiv::MediumTick, 0 );
        setTickLength( QwtScaleDiv::MajorTick, 2 );

        enableComponent( QwtScaleDraw::Backbone, false );

        if ( orientation == Qt::Vertical )
        {
            setLabelRotation( -60.0 );
        }
        else
        {
            setLabelRotation( -20.0 );
        }

        setLabelAlignment( Qt::AlignLeft | Qt::AlignVCenter );
    }

    //重写label方法
    virtual QwtText label( double value ) const QWT_OVERRIDE
    {
        QwtText lbl;

        const int index = qRound( value );
        if ( index >= 0 && index < m_labels.size() )
        {
            lbl = m_labels[ index ];
        }

        return lbl;
    }

  private:
    const QStringList m_labels;
};

//自定义ChartItem类,实现specialSymbol和barTitle方法
class ChartItem : public QwtPlotBarChart
{
  public:
    ChartItem()
        : QwtPlotBarChart( "Page Hits" )
    {
        setLegendMode( QwtPlotBarChart::LegendBarTitles );
        setLegendIconSize( QSize( 10, 14 ) );
        setLayoutPolicy( AutoAdjustSamples );
        setLayoutHint( 4.0 ); // minimum width for a single bar

        setSpacing( 10 ); // spacing between bars
    }

    void addDistro( const QString& distro, const QColor& color )
    {
        m_colors += color;
        m_distros += distro;
        itemChanged();
    }

    virtual QwtColumnSymbol* specialSymbol(
        int index, const QPointF& ) const QWT_OVERRIDE
    {
        // we want to have individual colors for each bar
        //新建一个标记
        QwtColumnSymbol* symbol = new QwtColumnSymbol( QwtColumnSymbol::Box );
        symbol->setLineWidth( 2 );  //设置线宽
        symbol->setFrameStyle( QwtColumnSymbol::Raised );//设置边框风格

        QColor c( Qt::white );
        if ( index >= 0 && index < m_colors.size() )
            c = m_colors[ index ];

        //设置颜色
        symbol->setPalette( c );

        return symbol;
    }

    //设置bar的标题
    virtual QwtText barTitle( int sampleIndex ) const QWT_OVERRIDE
    {
        QwtText title;
        if ( sampleIndex >= 0 && sampleIndex < m_distros.size() )
            title = m_distros[ sampleIndex ];

        return title;
    }

  private:
    QList< QColor > m_colors;       //每个bar的颜色
    QList< QString > m_distros;     //每个bar的标题
};

static QwtPlot *g_plot = nullptr;

BarChartSingleWidget::BarChartSingleWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::BarChartSingleWidget)
{
    ui->setupUi(this);

    const struct
    {
        const char* distro;
        const int hits;
        QColor color;

    } pageHits[] =
    {
        { "一年级", 1114, QColor( "DodgerBlue" ) },
        { "二年级", 1373, QColor( "#d70751" ) },
        { "三年级", 1638, QColor( "SteelBlue" ) },
        { "四年级", 1395, QColor( "Indigo" ) },
        { "五年级", 3874, QColor( 183, 255, 183 ) },
        { "六年级", 1532, QColor( 115, 186, 37 ) },
        { "七年级", 1059, QColor( "LightSkyBlue" ) },
        { "八年级", 2391, QColor( "FireBrick" ) }
    };

    //设置plot背景色
    g_plot = new QwtPlot(QwtText("XX学校学生人数统计"),this);
    g_plot->setAutoFillBackground( true );
    g_plot->setPalette( QColor( "Linen" ) );

    //设置画布
    QwtPlotCanvas* canvas = new QwtPlotCanvas();
    canvas->setLineWidth( 2 );
    canvas->setFrameStyle( QFrame::Box | QFrame::Sunken );
    canvas->setBorderRadius( 10 );

    //设置画布的背景色
    QPalette canvasPalette( QColor( "Plum" ) );
    canvasPalette.setColor( QPalette::WindowText, QColor( "Indigo" ) );
    canvas->setPalette( canvasPalette );

    g_plot->setCanvas( canvas );

    // 创建柱状图
    ChartItem* chartItem = new ChartItem();

    //设置条形图数据
    QVector< double > samples;

    for ( uint i = 0; i < sizeof( pageHits ) / sizeof( pageHits[ 0 ] ); i++ )
    {
        m_distros += pageHits[ i ].distro;
        samples += pageHits[ i ].hits;

        chartItem->addDistro( pageHits[ i ].distro, pageHits[ i ].color );
    }

    chartItem->setSamples( samples );
    chartItem->attach( g_plot );

    //设置坐标轴
    //设置自定义的坐标轴
    g_plot->setAxisTitle( QwtAxis::XBottom, "年级" );
    g_plot->setAxisMaxMinor( QwtAxis::XBottom, 3 );
    g_plot->setAxisScaleDraw( QwtAxis::XBottom, new ScaleDraw( Qt::Vertical, m_distros ) );

    g_plot->setAxisTitle( QwtAxis::YLeft, "人数" );
    g_plot->setAxisMaxMinor( QwtAxis::YLeft, 3 );

    //设置自定义的坐标轴
    QwtScaleDraw* scaleDraw = new QwtScaleDraw();
    scaleDraw->setTickLength( QwtScaleDiv::MediumTick, 4 );
    g_plot->setAxisScaleDraw( QwtAxis::YLeft, scaleDraw );

    g_plot->plotLayout()->setCanvasMargin( 0 );
    g_plot->replot();

    // 显示绘图对象
    ui->verticalLayout->addWidget(g_plot);
}

BarChartSingleWidget::~BarChartSingleWidget()
{
    delete ui;
}

4.相关参考

Qwt QwtLegend和QwtPlotLegendItem图例类详解-CSDN博客

Qwt QwtPlot类详解-CSDN博客

Qwt QwtPlotMultiBarChart绘制多列柱状图-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1151813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle (8)Managing Tablespace Data File

Managing Tablespace & Data File &#xff08;维护表空间和数据文件&#xff09; 目标&#xff1a; 定义表空间和数据文件的用途创建表空间管理表空间学会使用甲骨文托管文件(OMF) 创建和管理表空间&#xff08;不是重点&#xff09;获取表空间信息 一、基础知识 1、表…

【0基础学Java第四课】-- 逻辑控制

4. 逻辑控制 4.1 顺序结构4.2 分支结构4.2.1 if语句判断一个数字是奇数还是偶数判断一个数字是正数&#xff0c;负数&#xff0c;还是零判断一个年份是否为闰年 4.2.2 switch 语句 4.3 while循环打印 1 - 10 的数字计算 1 - 100 的和计算 5 的阶乘计算1&#xff01;2&#xff0…

FHE 的高精度算术:BGV-big、BFV-big

参考文献&#xff1a; [NL11] Naehrig M, Lauter K, Vaikuntanathan V. Can homomorphic encryption be practical?[C]//Proceedings of the 3rd ACM workshop on Cloud computing security workshop. 2011: 113-124.[GC15] Geihs M, Cabarcas D. Efficient integer encoding…

TypeScript:简介(附思维导图)

TypeScript&#xff1a;简介 Date: May 23, 2023 思维导图&#xff1a; TypeScript简介 注&#xff1a;已用XMind总结 什么是 TypeScript Typed JavaScript at Any Scale. 添加了类型系统的 JavaScript&#xff0c;适用于任何规模的项目。 以上描述是官网[1]对于 TypeScript…

【软考】14.3 设计模式

《设计模式》 有下划线&#xff1a;类模式 / 对象模式无下划线&#xff1a;对象模式 创建型 设计模式 创建对象 构建器&#xff08;Builder&#xff09;&#xff1a;类和构造分离抽象工厂&#xff08;Abstract Factory&#xff09;&#xff1a;抽象接口工厂&#xff08;Factor…

Kubernetes Service 详解

Author&#xff1a;rab 目录 前言一、ClusterIP1.1 简介1.2 案例 二、NodePort2.1 简介2.2 案例 三、LoadBalancer3.1 简介3.1.1 MetalLB 简介3.1.2 MetalLB 部署3.1.3 MetalLB 配置3.1.3.1 Layer 2 模式3.1.3.2 BGP 模式 3.2 案例3.2.1 部署3.2.2 验证 四、ExternalName4.1 简…

大数据技能大赛平台搭建(容器环境)

大数据技能大赛平台搭建&#xff08;容器环境&#xff09; 一、Hadoop3.X 完成分布式安装部署1、 JDK安装1、解压jdk2、修改配置文件3、免密登录 2、hadoop集群环境搭建1、配置文件2、配置环境变量3、给slave1和slave2分发配置文件4、启动Hadoop集群 3、配置完成&#xff01; 二…

奇富科技引领大数据调度革命:高效、稳定、实时诊断

日前&#xff0c;在世界最大的开源基金会 Apache旗下最为活跃的项目之一DolphinScheduler组织的分享活动上&#xff0c;奇富科技的数据平台专家刘坤元应邀为国内外技术工作者献上一场题为《Apache DolphinScheduler在奇富科技的优化实践》的精彩分享&#xff0c;为大数据任务调…

[推荐]SpringBoot,邮件发送附件含Excel文件(含源码)。

在阅读本文前&#xff0c;可以先阅读我的上一篇文章&#xff1a; SpringBoot&#xff0c;使用JavaMailSender发送邮件(含源码)。 &#xff0c;本文使用的代码案例涉及到的 jar包、application.properties配置与它相同。 先看一下效果。 图一 图二 在下方代码案例中&#xff0c;…

智安网络|保护您的应用程序免受攻击:重要的安全强化措施

在今天的数字化时代&#xff0c;应用程序安全成为了企业和个人必须重视的重要领域。应用程序普遍存在的安全漏洞成为黑客们进行攻击的一个突破口。为了保护敏感数据和个人隐私&#xff0c;我们必须了解并实施一系列的关键措施来加固应用程序的安全性。 首先&#xff0c;一个关…

3D max软件有哪些技巧可快速选择区域?

使用3D max软件时&#xff0c;有新手朋友反馈说&#xff0c;为什么3dmax选择区域怎么改不了&#xff1f; 还有就是3dmax选择区域不显示该怎么办&#xff1f; 或者是3dmax选择区域变成圆形了。 针对以上这几类问题&#xff0c;只要掌握这几种方法就可以。小编整理了几种3D max…

一天收入500元的货拉拉运费差项目靠谱吗?

最近的货拉拉运费差项目有点火呀&#xff01;收费也不低&#xff0c;1680-16980的比比皆是。 这个项目去年我就在某些平台看到过&#xff0c;今天就跟大家详细聊聊这个项目&#xff0c;想入坑的不妨先看看这篇文章。 一&#xff1a;项目原理 有人叫它货拉拉搬砖项目&#xf…

2023应届生能力考试含解析(Java后端开发)——(1)

1.以下代码的循环次数是 ( ) public class Test {public static void main(String[] args) {int i 7;do {System.out.println(--i);--i;} while (i ! 0);System.out.println(i);} } A 0 B 1 C 7 D 无限次 这段代码会导致无限循环的原因是在 do-while 循环中&#…

毕业设计基于SpringMVC+Mybatis+Bootstrap的电影院管理系统源码+数据库

<<电影院管理系统>> 电影院管理系统&#xff1a;SpringMVCJSPTomcatMybatisBootstrapJqueryAnimateCSSLayerJS 项目部署&#xff1a;该项目是IDEA版本&#xff0c;Maven项目 前端依赖&#xff1a; Bootstrap-3.4.1Animate.css- 4.1.1Jquery-3.6.0Layer-v3.5.1B…

83.每日一练:搜索插入位置(力扣第35题)

问题描述 代码解决以及思想 class Solution { public:int searchInsert(vector<int>& nums, int target) {int left 0; // 定义左边界int right nums.size() - 1; // 定义右边界while (left < right) { // 当左边界小于…

基于【逻辑回归】的评分卡模型金融借贷风控项目实战

背景知识&#xff1a; 在银行借贷过程中&#xff0c;评分卡是一种以分数形式来衡量一个客户的信用风险大小的手段。今天我们来复现一个评分A卡的模型。完整的模型开发所需流程包括&#xff1a;获取数据&#xff0c;数据清洗和特征工程&#xff0c;模型开发&#xff0c…

python读取列数不规则文件/python数据框分割

问题 将探空数据读取&#xff0c;并按每日单纯储存&#xff0c;数据如下&#xff1a; 为一年数据&#xff0c;存在部分列的数据缺失问题。 数据读取 使用read_csv文件读取文件&#xff0c;由于列数存在不一致问题&#xff0c;需要固定最大列数&#xff1a; names["da…

function函数指针和lamada的[]和[=]注意事项

在工作的过程中&#xff0c;lamda表达式的 重点&#xff1a; 1.function对象存储函数指针。 2.lamada表达式&和捕捉的方式 lamda传入引用&&#xff0c;导致作用域消失&#xff0c;最终报错 std::function<void()> pFun; void GetNum1(const std::function<…

python随手小练14

题目&#xff1a; 文件操作 &#xff1a; 根据文件要求&#xff08;测试&#xff09;筛选出数据并且放入一个新的文件 具体操作&#xff1a; f1 open("1.txt","r",encoding"UTF-8") f2 open("2.txt","w",encoding"U…

【Linux】:Linux开发工具之Linux编译器——gcc/g++的使用

&#x1f4bb;1.背景知识 &#x1f372;1. 预处理&#xff08;进行宏替换) 预处理阶段我们要分为1.头文件展开2.宏替换3.条件编译4.去掉注释 这一步会帮助我们生成.i文件 &#x1f372;2. 编译&#xff08;生成汇编) 编译阶段我们要分为1.检查语法2.生成汇编代码 最后生成.s文…