Qwt QwtPlotMultiBarChart绘制多列柱状图

news2024/9/25 9:32:13

1.概述

QwtPlotMultiBarChart 是 Qwt 绘图库中的一个类,用于绘制多列柱状图。它可以显示多个柱状条并将它们按照不同的类别分组显示。每个类别下的柱状条可以有不同的颜色和宽度。

以下是类继承关系图:

2.常用方法

设置数据:

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

设置风格:

  • void setStyle (ChartStyle style)

设置间距:

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

设置bar title

  • void setBarTitles (const QList< QwtText > &)

设置图例:

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

设置符号:

  • void setSymbol (int valueIndex, QwtColumnSymbol *)

3.示例

统计各个年代,各个学校的人数。

#ifndef MULTIBARCHARTWIDGET_H
#define MULTIBARCHARTWIDGET_H

#include <QWidget>

namespace Ui {
class MultiBarChartWidget;
}

class MultiBarChartWidget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::MultiBarChartWidget *ui;
};

#endif // MULTIBARCHARTWIDGET_H


#include "MultiBarChartWidget.h"
#include "ui_MultiBarChartWidget.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"
#include "qwt_plot_multi_barchart.h"


//自定义坐标轴
class ScaleDraw : public QwtScaleDraw
{
  public:
    ScaleDraw( Qt::Orientation orientation, const QStringList& labels )
        : m_labels( labels )
    {
        //设置tick长度
        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 );
        }

        //设置label对齐方式
        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;
};

static QwtPlot *g_plot = nullptr;
static QwtPlotMultiBarChart *g_multiBarChart = nullptr;

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

    g_plot = new QwtPlot(QwtText("XX学校学生"),this);
    ui->verticalLayout->addWidget(g_plot);

    //设置画布
    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 );

    //设置坐标轴标题
    g_plot->setAxisTitle( QwtAxis::YLeft, "人数" );
    g_plot->setAxisTitle( QwtAxis::XBottom, "学校" );

    g_multiBarChart = new QwtPlotMultiBarChart( "Bar Chart " );
    g_multiBarChart->setLayoutPolicy( QwtPlotMultiBarChart::AutoAdjustSamples );
    g_multiBarChart->setSpacing( 10 );
    g_multiBarChart->setMargin( 3 );

    //bar的颜色
    static const char* colors[] = { "DarkOrchid", "SteelBlue", "Gold" };

    const int numSamples = 5;
    const int numBars = sizeof( colors ) / sizeof( colors[0] );

    QList< QwtText > titles;
    for ( int i = 0; i < numBars; i++ )
    {
        QString title("202%1");
        titles += title.arg( i );
    }

    //设置titles
    g_multiBarChart->setBarTitles( titles );
    //设置图标大小
    g_multiBarChart->setLegendIconSize( QSize( 10, 14 ) );

    for ( int i = 0; i < numBars; i++ )
    {
        QwtColumnSymbol* symbol = new QwtColumnSymbol( QwtColumnSymbol::Box );
        symbol->setLineWidth( 2 );
        symbol->setFrameStyle( QwtColumnSymbol::Raised );
        symbol->setPalette( QPalette( colors[i] ) );

        g_multiBarChart->setSymbol( i, symbol );
    }

    //设置数据
    QVector< QVector< double > > series;
    for ( int i = 0; i < numSamples; i++ )
    {
        QVector< double > values;
        for ( int j = 0; j < numBars; j++ )
            values += ( 2 + qwtRand() % 2000 );

        series += values;
    }

    //设置数据
    g_multiBarChart->setSamples( series );

    g_multiBarChart->attach( g_plot );

    //插入图例
    g_plot->insertLegend( new QwtLegend() );

    //设置x范围
    g_plot->setAxisScale( QwtAxis::XBottom, 0, g_multiBarChart->dataSize() - 1, 1.0 );

    //设置y轴自动缩放
    g_plot->setAxisAutoScale( QwtAxis::YLeft );

    QStringList distros;
    distros<<"成都一中"<<"成都二中"<<"成都三中"<<"成都四中"<<"成都五中";
    g_plot->setAxisScaleDraw( QwtAxis::XBottom, new ScaleDraw( Qt::Vertical, distros ) );
    QwtScaleDraw* scaleDraw1 = g_plot->axisScaleDraw( QwtAxis::XBottom );
    scaleDraw1->enableComponent( QwtScaleDraw::Backbone, false );//设置 不显示水平线
    scaleDraw1->enableComponent( QwtScaleDraw::Ticks, false );//设置不显示刻度线

    QwtScaleDraw* scaleDraw2 = g_plot->axisScaleDraw( QwtAxis::YLeft );
    scaleDraw2->enableComponent( QwtScaleDraw::Backbone, true );
    scaleDraw2->enableComponent( QwtScaleDraw::Ticks, true );

    g_plot->plotLayout()->setAlignCanvasToScale( QwtAxis::XBottom, true );
    g_plot->plotLayout()->setAlignCanvasToScale( QwtAxis::YLeft, false );

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

    g_plot->replot();

    g_plot->setAutoReplot( true );
}

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

4.相关推荐

Qwt QwtPlotBarChart自定义条形统计图-CSDN博客

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

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

相关文章

不小心commit错误代码,还没push的回滚解决方法

命令&#xff1a;git reset --soft HEAD^ 第一步&#xff1a;找到项目所在文件夹 第二步&#xff0c;右键点击git base here 第三步&#xff0c;命令行输入git reset --soft HEAD^ 回车即可

【java】【MyBatisPlus】【三】【完】MyBatisPlus扩展

目录 一、分页查询lambdaQueryWrapper 二、自定义分页查询 1、UserMapper 2、UserMapper.xml 3、测试方法 三、MybatisX插件 1、安装 2、MybatisX代码快速生成 2.1 连接数据库 2.2 操作需要生成代码的表 3、MybatisX快速生成CRUD&#xff08;前提步骤2生成&#xff…

FPGA_Quartus 如何生成 jic 文件

打开要转换 jic 的工程文件&#xff0c;打开 File——Convert Programming Files。如图所示&#xff1a; 进入下面界面后&#xff0c;在框 1 处选择将要转换的目标文件类型&#xff08;jic&#xff09;&#xff0c;在框 2 处选择配置芯片的型号&#xff08;此处选择 EPCS16&a…

代码随想录Day32 动态规划01 LeetCodeT509 斐波那契数列 T70 爬楼梯 T746 爬楼梯的最小消耗

前言:动态规划基础 动态规划首先可以解决的问题有背包问题,打家劫舍问题,股票问题,子序列问题等,主要是将一个大的问题切分成多个重叠的子问题,所以动态规划一定是上一个状态递推过来的,有一个重要的状态转移方程,但是这也并不是解题的全部,我们将动态规划的题目基本分为五步来…

【AI视野·今日Sound 声学论文速览 第八期】Wed, 20 Sep 2023

AI视野今日CS.Sound 声学论文速览 Wed, 20 Sep 2023 Totally 1 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Accelerating Diffusion-Based Text-to-Audio Generation with Consistency Distillation Authors Yatong Bai, Trung Dang, Dung Tran, K…

Qt QUrlQuery详解

1.概述 QUrlQuery 是Qt框架中用于操作URL查询部分的类&#xff0c;提供了一些方法来解析和构造URL查询字符串。URL查询部分通常是在URL中使用 "?" 后面的一串参数&#xff0c;用于传递数据或配置信息。 如下图所示&#xff1a;也就是 "?" 后面的一串参数…

30秒get视频号视频如何下载,保存视频号视频到本地方法!

终于可以告别无法下载视频号视频的烦恼啦&#xff01;下面是一些只需 30 秒就能get到的t视频号视频如何下载方法&#xff0c;让我们一起来探索如何保存视频号视频到本地方法吧&#xff01; 首先&#xff0c;要记得这些方法仅适用于个人观看或学习使用&#xff0c;不可用于商业用…

SpringBoot,使用JavaMailSender发送邮件(含源码)。

本文主要讲解使用JavaMailSender发送邮件&#xff0c;并给出对应的参考案例、源码。 1、使用的依赖jar包 JavaMailSender发送邮件&#xff0c;只需要 "spring-boot-starter-mail" jar包就可以。考虑到邮件发送时&#xff0c;使用 Hutool工具生成Excel文件做为附件&am…

4.编译多线程应用程序

在不同平台下使用多线程的程序编译时的编译选项设置如下图所示。 gcc下编译时我们会碰到两个选项-pthread和-lpthread&#xff0c;记住推荐使用-pthread而不是-lpthread&#xff0c;原因如下 -lpthread只是起到链接pthread库的作用&#xff1b;而-pthread选项除了会链接pthrea…

java爱心代码,脱单必备

package com.example.test;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit; import java.util.jar.JarOutputStream;import javax.swing.JFrame;class Cardioid extends JFrame {//定义窗口大小private …

MySQL数据类型、字符集、引擎、索引

MySQL数据类型、字符集、引擎、索引 数据类型 整型浮点类型字符类型时间类型复合类型整型 MySQL数据类型所占字节值范围tinyint1字节-128~127smallint2字节-32768~32767mediumint3字节-8388608~8388607int4字节-2147483648~2147483647bigint8字节9.22*10的18次方在创建表字段时…

《Linux创建新用户》

本文主要讲解linux下如何进行新用户创建、登录以及删除操作 文章目录 1、创建新普通用户2、登录普通用户&#xff08;一&#xff09;已经创建过普通用户&#xff08;二&#xff09;第一次创建普通用户 3、普通用户切换至超级用户&#xff08;root&#xff09;及超级用户&#x…

【NLP文本分类算法集锦】零基础入门经典文本分类项目实战(附代码+数据集)

前言 大家好&#xff0c;我是阿光。 本专栏整理了《NLP文本分类算法集锦》&#xff0c;内包含了各种常见的中英文文本分类算法&#xff0c;以及常见的NLP任务&#xff1a;情感分析、新闻分类以及谣言检测等。 文本分类是NLP的必备入门任务&#xff0c;在搜索、推荐、对话等场…

C++面试——多线程详解

C11提供了语言层面上的多线程&#xff0c;包含在头文件<thread>中。它解决了跨平台的问题&#xff0c;提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。C11 新标准中引入了5个头文件来支持多线程编程&#xff0c;如下图所示&#xff1a; 多进程与多线程 多…

微信黑名单在哪里找出来怎么恢复微信好友?

微信黑名单在哪里找出来&#xff1f; 1、打开手机微信&#xff0c;点击底部「我」进入找到「设置」&#xff1b; 2、在微信设置内找到「朋友权限」并点击进入&#xff1b; 3、在微信设置朋友权限内&#xff0c;即可找到微信通讯录黑名单&#xff0c;并点击微信「通讯录黑名单」…

1200*B. Interesting Subarray(贪心规律)

Problem - 1270B - Codeforces 解析&#xff1a; 可以发现&#xff0c;对于某个符合条件的数列&#xff0c;如果两个最值不在两端&#xff0c;那么可以删去两端多余的元素直到两个最值在两端为止。 我们观察某两个相邻元素a、b&#xff0c;可以发现这两个元素组成的序列成立的条…

基于旗鱼算法的无人机航迹规划-附代码

基于旗鱼算法的无人机航迹规划 文章目录 基于旗鱼算法的无人机航迹规划1.旗鱼搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用旗鱼算法来优化无人机航迹规划。 1.旗鱼搜索算法 …

C语言 每日一题 PTA 10.30 day8

1.高空坠球 皮球从某给定高度自由落下&#xff0c;触地后反弹到原高度的一半&#xff0c;再落下&#xff0c;再反弹&#xff0c;……&#xff0c;如此反复。问皮球在第n次落地时&#xff0c;在空中一共经过多少距离&#xff1f;第n次反弹的高度是多少&#xff1f; 输入格式 : …

excel求差公式怎么使用?

利用excel求差&#xff0c;可能有许多的小伙伴已经会了&#xff0c;不过还是存在一些不太熟悉的朋友们&#xff0c;所以这里有必要讲解一下。其实求差的实现主要就是一个公式&#xff0c;就是用一个单元格中的数字“减去”另一个单元格中的数字“等于”第三个单元格。此公式掌握…

854数据结构简答题---图

1.&#xff08;2015期末&#xff09;已知无环路有向图如图3.1,请在表2、表3中填写出各事件的最早发生时间、最迟发生时间、活动的最早、最迟开始时间&#xff0c;给出关键活动及关键路径。 从源点到汇点的有向路径可能有多条&#xff0c;所有路径中&#xff0c;具有最大路径长…