关于图表:制作一个动态图表
常常看到这样的视频,动静的图表,看起来很炫酷,本人想做一个。https://www.bilibili.com/vide... 能够应用小滑轮(https://www.feiaci.com/xhl/chart), 它提供编辑这样的动静图表,并且能够导出视频。图表的款式,都能够进行更改。 自己每天就用它制作一个视频公布在抖音或者西瓜视频上,例如这个(https://www.ixigua.com/714880...)。 感兴趣的能够去试试。
常常看到这样的视频,动静的图表,看起来很炫酷,本人想做一个。https://www.bilibili.com/vide... 能够应用小滑轮(https://www.feiaci.com/xhl/chart), 它提供编辑这样的动静图表,并且能够导出视频。图表的款式,都能够进行更改。 自己每天就用它制作一个视频公布在抖音或者西瓜视频上,例如这个(https://www.ixigua.com/714880...)。 感兴趣的能够去试试。
若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110941614长期继续带来更多我的项目与技术分享,征询请加QQ:21497936、微信:yangsir198808 红瘦子(红模拟)的博文大全:开发技术汇合(蕴含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬联合等等)继续更新中…(点击传送门) 开发专栏:我的项目实战 需要 1.通道使能、抉择、更改通道名称、设置显示色彩 2.采样率可设置(Sa/s/chj) 3.单位换算,依照给定的进行换算 4.对通道可进行设置弥补值 5.通道勾销可动态显示和暗藏,并可动静调整显示色彩 6.肯定范畴的X轴、全范畴Y轴、反对主动X轴、主动Y轴 7.革除图表(理论数据不分明),不便比照跟踪 8.反对将已有的采集数据依照指定规定导出到excel表 9.将以后二维表导出为图标保留 10.定时采集,抉择试验采集多久,到工夫后进行采集 11.通信设置,应用串口,可设置串口号和波特率 12.对设置设置界面和主界面的所有相干配置参数进行保留,并在下次启动时复原最初一次启动的配置数据 13.反对日志零碎,对相干操作和数据忘性日志输入 性能 反对长时间采集,几万点同时显示,不卡顿 补充阐明 反对模仿形式,带有模仿下位机数据输出上位机,点击“开始采集”即可 模仿形式阐明 留神:同时反对理论下位机协定数据和模仿数据两种形式,模仿数据次要是不便客户与开发者调试、测试和修复 1.应用模仿数据时,请先随便关上串口,点击“启动”后即可模仿数据 2.应用模仿数据是,导出excel,为“hello world”内容” Demo 体验下载地址 特地留神:公布的用模仿数据形式,模仿数据形式请先随便关上串口,点击“启动”后即可模仿数据 CSDN:https://download.csdn.net/download/qq21497936/13613493 QQ群:1047134658(点击“文件”搜寻“debugTool”,群内与博文同步更新) 若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110941614
常识是永远的流行色!码友们,点赞再看,养成好习惯~ 一:存储模式留言或私信我,邀请你退出“图数据库交换”微信群! 1、图内容本文以下所有内容基于:JanusGraph基于属性图来进行结构图数据: 属性图: 属性图是由 顶点(Vertex),边(Edge),属性(Property)组成的有向图 Vertex能够蕴含Properties;Edge也能够蕴含Properties; 2、存储办法图存储的形式罕用的有两种:邻接列表 和 邻接矩阵 JanusGraph采纳邻接列表进行图数据的存储,如下图所示:(此处将图中节点形象为 只有节点,没有属性) 在Janusgraph中一个顶点的邻接列表蕴含该节点对应的属性和关联的边,下述会具体阐明 Janusgraph中邻接列表是如何实现的; 3、图切割形式图的切割形式分为两种:按节点切割(Vertex Cut)和按边切割(Edge Cut) Vertex Cut:依据点进行切割,每个边只存储一次,只有是节点对应的边便会多一份该节点的存储Edge Cut:依据边进行切割,以节点为核心,边会存储两次,源节点的邻接列表存储一次,指标节点的邻接列表存储一次在Janusgraph中既存在Edge Cut,也存在Vertex Cut的状况; 在默认的状况下应用边切割,而针对热点节点能够通过配置makeVertexLabel('product').partition()来将节点类型为product类型的节点进行Vertex Cut; 也就是说,在没有上述makeVertexLabel('product').partition()配置的话,JanusGraph所有的图数据都是以Edge Cut的形式来进行切割存储的; 具体能够查看文章:《JanusGraph-分区》中自定义分区局部中对于图切割局部的介绍; 咱们例子来阐明一下: 如下图: 张三用户节点通过手机号关联进去李四用户节点 张三 和 李四 代表Vertex;指向的name、age、gender代表张三的属性edgeA 和edgeB 代表Edge;也能够蕴含边的属性,例如下图中边蕴含属性create_time 按边切割后: 节点 张三name(property)age(property)gender(property)edgeA(edge)phonephone(property)edgeA(edge)edgeB(edge) 李四name(property)age(property)gender(property)edgeB(edge)上述能够看到,依照边切割后每一条边会存储两次! 二:BigTable模型在JanusGraph的存储中, JanusGraph将图形的邻接列表的示意存储在反对Bigtable数据模型的任何存储后端中BigTable模型如下图: 在Bigtable数据模型中,每个表是行的汇合,由一个key惟一标识。 每行由任意(能够很大数量然而必须无限数量)数量的cell组成;cell由column和value组成,column惟一标识某一个cell。 上述图中,有两局部须要排序的反对:sorted by key 和 sorted by column: sorted by key:标识存储后端存储的数据时依照key的大小进行排序存储的sorted by column:这是JanusGraph对Bigtable数据模型有一个额定要求,存储edge(边)的单元格必须按column排序,并且列范畴指定的单元格子集必须是无效可检索的; 这句话具体解答在下述文章中有体现在Bigtable模型中的行称为“宽行”,因为它们反对大量cell,并且不用像关系数据库中那样事后定义这些cell的column。 在关系型数据库中咱们必须先定义好表的schema,才能够存储数据,如果存储过程中想要扭转表构造,则所有的数据都要对变动的列做出变动。然而Bigtable模型存储中就不用如此,每个行的column不同,咱们能够随时仅对某一行进行变动,也不许事后定义行的schema,只须要定义图的schema即可。 此外,特定的Bigtable实现能够使行按其键的程序排序。JanusGraph能够利用这样的键序来无效地划分图形,从而为十分大的图形提供更好的加载和遍历性能。 JanusGraph是如何基于BigTable数据模型针对于本身的图数据个性进行设计的呢? 上面咱们看下JanusGraph的逻辑存储构造 ...
Online开发——初体验(在线配置图表) 01 JSON数据格式演示.gif02 SQL-统计用户登录数量.gif03 图表合并展示.gif04 展示模板风格演示.gif
一句话总结:使用import F2 from “@antv/f2/lib/index-all”;代替import F2 from “@antv/f2”;import F2 from “@antv/f2”;如果已心领神会,可以关闭该页面啦~~~叨叨叨如下;举一个小小例子,例子来源于官方文档:https://antv.alipay.com/zh-cn…使用Antv过程中,需要给饼图配置Label,官方例子提供的代码如下:chart.pieLabel({sidePadding: 75,label1: function label1(data) { return { text: data.memo, fill: ‘#808080’ };},label2: function label2(data) { return { fill: ‘#000000’, text: ‘$’ + data.amount.toFixed(2), fontWeight: 500, fontSize: 10 };}});这时候会发现你的饼图没法像官方例子那样如愿出现,而且报了个错chart.pieLabel is not a function,刚好我也遇到了跟你同样的问题,于是我找到github,看到了这么一个文件 https://github.com/antvis/f2/…于是,我改变了F2的import的方式,用"import F2 from “@antv/f2/lib/index-all”;“代替"import F2 from “@antv/f2”;",于是问题就解决了,道理就不多说了,你可以举一反三,恰好你遇到Antv的任何别的方法找不到的报错,请想到这篇文章
一句话总结:position([name, value])解决变量传参,如果已经解决你的问题,那么就不用往下看啦!!!想了解更多,看下以下的叨叨叨~~~借用官网的一段代码,链接:https://antv.alipay.com/zh-cn…chart.interval().position(‘apercent’).color(’name’, [’#1890FF’, ‘#13C2C2’, ‘#2FC25B’, ‘#FACC14’, ‘#F04864’, ‘#8543E0’]).adjust(‘stack’).style({lineWidth: 1,stroke: ‘#fff’,lineJoin: ‘round’,lineCap: ‘round’}).animate({appear: { duration: 1200, easing: ‘bounceOut’}});这里的position稍微解释下: position:位置,二维坐标系内映射至 x 轴、y 轴; 及position()里的变量apercent即指定x轴,y轴,但实际应用中我们希望定义一个公共方法,以变量形式传参生成多个图表,那么换做数组传参position([name, value]),name,value分别是你的指定的x轴、y轴变量。
如何用echarts实现半圆图表?在echarts官方实例倒腾一波,发现官方并没有提供半圆图表的写法,那怎么办呢?官方没提供,但需求还是要实现的。半圆图表其实就是饼图的一半,那么简单的思路如下:设置一个sum值,用来累计所有要展示的数据的总和,再添加到数据里面,那么整个饼图就可以分成均匀的两半,然后将sum值的数据在饼图里面隐藏,就只剩下半圆。下面上代码:安装echartsnpm install echarts –save全局引入、配置// main.js 文件import echarts from ’echarts’Vue.prototype.$echarts = echarts 全局引入echarts,文件会比较大,我们实现半圆其实只需要饼图,那么建议还是按需引入// MyChart.vueimport echarts from ’echarts’// 引入饼图require(’echarts/lib/chart/pie’)// 引入提示框等组件require(’echarts/lib/component/tooltip’)require(’echarts/lib/component/title’)创建容器// MyChart.vue <div id=“myChart” style=“width: 400px;height: 400px;"></div>初始化容器let pieChart = echarts.init(document.getElementById(‘myChart’))// 初始化数据let data = [{name: ‘游泳健身’, value: 1024}, {name: ‘学车考驾照’, value: 2048}]let sum = 0// 放置需要显示的图例(if you need)let legendData = []// 循环数据 累计sum值data.forEach(item => { sum += item.value * 1 // *1保证sum值为数值 legendData.push(item.name)})// 给数据加上总数sum 通过颜色及透明度设置不显示data.push({name: ‘总数’, value: sum, itemStyle: {normal: {color: ‘rgba(0, 0, 0, 0)’}}})// 下面给图例加上配置 都是官方的apipieChart.setOption({ tooltip: { trigger: ‘item’, // formatter: ‘{a}<br/>{b}:{c}({d}%)’ formatter: ‘{b}:{c}({d}%)’ }, legend: { orient: ‘horizontal’, // vertical 设置图例展示方向 data: legendData }, series: [ { name: ‘随意啦’, // 上面formatter的a,不显示a可不设置 type: ‘pie’, startAngle: 180, // 重点!这里设置饼图从180°初渲染,刚好从上下将饼图平分成两部分 radius: [‘50%’, ‘60%’], center: [‘50%’, ‘60%’], data: data, itemStyle: { emphasis: { shadowBlur: 10, shadowOffsetX: 10, shadowColor: ‘rgba(0, 0, 0, 0.5)’ } } } ]})配置完毕,来对比一下:配置之前(环形):配置之后: 哈哈,半圆就已经出来了,但是不是已经完美了呢?我们把鼠标覆盖上其中一个数据试试:吃惊!果然有问题,这里因为我们给数据加上了一条{name: ‘总数’, value: sum}这样总的数据,所以图表统计的时候,其它数据占比就是原来比例的50%!那要怎么处理呢?formatter了解一下。将原来的formatter改造:// 原先的formatterformatter: ‘{b}:{c}({d}%)’// 改造formatterformatter: function (param) { let str = ’’ let c = (param[‘value’] / sum) * 100 // 算出百分比 c = c.toFixed(2) str = str + c + ‘%’ return str}看下效果图:nice!改造成功。但这里还有一个小小的问题,那就是把鼠标覆盖上被隐藏那部分圆形的时候,还是会有提示显示:这里的一个处理就是,当我们在添加最后这一条总数据的时候,把它的tooltip设置为空就行了data.push({name: ‘总数’, value: sum, tooltip: {formatter: () => ‘’}, itemStyle: {normal: {color: ‘rgba(0, 0, 0, 0)’}}})最后,该渲染方法应该放在vue的mounted生命周期里,当dom渲染后再初始化容器mounted () { this.drawPie()},methods: { drawPie () { … }}OK,这样就大功告成了!吐槽:晚上改完的图表,隔天早上领导就说还是换回环形图展示吧(・`´・) ...
文章首发自公众号:: nullobject 。个人站点:https://www.nullobject.cn 这篇文章主要讲解QValueAxis类的API及其使用。0x00 关于QValueAxisQValueAxis,即数值轴,适用于具有连续数据坐标的图表。QValueAxis作为QAbstractAxis的实现类之一,在继承了QAbstractAxis特性的同时,根据数值轴的特点封装实现了许多方便实用的功能。QValueAxis使用起来也非常简单,在上一篇文章QAbstractAxis中的示例代码均是使用QValueAxis实例来说明的。本文主要介绍QValueAxis实现的功能。QValueAxis使用示例:#include <QApplication>#include <QChartView>#include <QLineSeries>#include <QValueAxis>#include <QDebug>QT_CHARTS_USE_NAMESPACEint main(int argc, char *argv[]){ QApplication a(argc, argv); // 创建QChartView对象 QChartView *chartView = new QChartView; chartView->setRenderHint(QPainter::Antialiasing); // 创建序列 QLineSeries *series = new QLineSeries(); // 隐藏图例 chartView->chart()->legend()->hide(); // 添加数据 series->append(0,2); series->append(QPointF(2,6)); series->append(3,8); series->append(7,9); series->append(11,3); *series << QPointF(11,2) << QPointF(15,5) << QPointF(18,4) << QPointF(19,2); // 添加序列到图表 chartView->chart()->addSeries(series); // 创建X轴 QValueAxis *axisX = new QValueAxis; // 设置QValueAxis属性 axisX->setRange(10, 20.5); axisX->setTickCount(5); axisX->setLabelFormat("%.2f"); chartView->chart()->setAxisX(axisX, series); // 创建Y轴 QValueAxis *axisY = new QValueAxis; axisY->setRange(0, 10); axisY->setTickCount(5); axisY->setLabelFormat("%.2f"); chartView->chart()->setAxisY(axisY, series); chartView->resize(400,300); chartView->show(); return a.exec();}效果:0x01 设置刻度线在Qt 5.12版本之前,QValueAxis只支持固定的刻度线设置,只能通过setTickCount设置刻度线的数量,刻度线会平均分布在坐标轴。而在Qt最新版本5.12版中,QValueAxis支持通过tickType属性来设置刻度线为固定分布(TicksFixed)或者是动态分布(TicksDynamic)。QValueAxis::TickType tickType:设置刻度类型QValueAxis::TickType tickType() const;void setTickType(QValueAxis::TickType type);其中TickType为QValueAxis中声明的用于描述刻度类型(刻度线和刻度标签在轴上的位置)的枚举类:enum TickType { TicksDynamic = 0, TicksFixed};tickType属性改变时触发tickTypeChanged(QValueAxis::TickType)信号TicksFixed 设置刻度位置为均匀分布QValueAxis默认的刻度类型为TicksFixed。将刻度类型设置为TicksFixed,可以通过设置tickCount属性值来指定刻度线的数量,此时刻度线会被均匀地地分布在坐标轴上。默认的刻度线数量是5条,最低数量不能低于2。:axisY->setRange(0, 10);axisY->setTickType(QValueAxis::TickType::TicksFixed);axisY->setTickCount(6);效果:其中tickCount的操作函数声明如下:int tickCount() const;void setTickCount(int count);tickCount属性修改只在tickType值为TicksFixed时有效。tickCount属性改变时触发tickCountChanged(int)信号。TicksDynamic 设置刻度位置为动态分布动态设置刻度的位置,需要通过设置锚点tickAnchor和刻度间距tickInterval属性值来实现,必须要设置指定tickInterval才有效果:axisY->setRange(0, 10);axisY->setTickType(QValueAxis::TickType::TicksDynamic);// 设置刻度间距为3axisY->setTickInterval(3);// 设置锚点坐标为5axisY->setTickAnchor(5);效果:其中锚点tickAnchor属性用于指定刻度线和标签开始绘制的位置,刻度间距tickInterval属性用于指定刻度与刻度之间的距离。上示例子中将tickAnchor和tickInterval分别设置为5和3,表示刻度将从坐标为5的位置开始,向轴两端分布,如果不显示设置tickAnchor,则默认从坐标轴的起始位置开始分布;tickInterval的类型为qreal类型,支持设置刻度间隔为小数。修改tickAnchor和tickInterval对应会触发的信号分别为:tickAnchorChanged(int)和tickIntervalChanged(qreal)。0x02 设置坐标轴显示范围QValueAxis通过max和min两个属性来表示坐标轴的最大和最小值,可以通过调用对应的方法来设置坐标轴的显示范围。qreal max:设置坐标轴最大值qreal max() const;void setMax(qreal max);max属性修改会触发maxChanged(qreal)信号。qreal min:设置坐标轴最小值qreal min() const;void setMin(qreal min);min属性修改会触发minChanged(qreal)信号。setRange:设置坐标轴显示范围void setRange(qreal min, qreal max);除了可以调用setMax或setMin单独设置坐标轴的极值外,也可以直接调用setRange同时设置坐标轴的最大、最小值:// axisY->setMin(0);// axisY->setMax(10);// 等价于setRange(0,10);axisY->setRange(0, 10);当坐标轴的最大值max或者最小值min发生改变时,都会触发rangeChanged(qreal min,qreal max)信号。0x03 设置刻度标签显示格式QValueAxis坐标轴支持通过labelFormat属性设置标签的显示格式,例如指定显示小数位数等。QString labelFormat:设置标签格式QString labelFormat() const;void setLabelFormat(const QString &format);其中传参format为需要指定的字符串格式,例如设置为显示小数点后两位数:axisX->setLabelFormat("%.2f");目前labelFormat支持设置以下转换说明符、长度修饰符以及标准C++库中printf()函数提供的格式标志:d, i, o, x, X, f, F, e, E, g, G, c。具体使用可以百度搜索了解:printf() 输出格式。修改该属性会触发labelFormatChanged(const QString&)信号。0x04 The End :) ...
文章首发自公众号:: nullobject 。个人站点:https://www.nullobject.cn这篇文章主要介绍QXYSeries类的API及其使用0x00 前言QXYSeries作为QAbstractSeries的派生类之一,主要负责实现以二维点集为数据源,坐标类型为二维坐标系的图表类型,包括折线图、曲线图和散点图等。QXYSeries封装了大量对数据源进行增删改操作的函数和信号,同时内部实现了控制数据点在坐标系上的显示形态(点标签的格式、颜色、是否显示等)的功能。0x01 显示和控制点标签Qt图表中的点标签指的是数据点在图表上对应位置的附加信息显示(比如点的坐标或者其他信息):QXYSeries类中提供了pointLabels*开头的五个属性及对应的方法和信号来操作点标签的显示风格。pointLabelsClipping : 获取和设置是否对点标签超出绘图区域边缘的部分进行裁剪:bool pointLabelsClipping() const;void setPointLabelsClipping(bool enabled = true);效果:可以看到,当设置pointLabelsClipping属性为true(默认值)时,点标签超出绘图区域的部分会被裁剪掉。pointLabelsClipping属性发生改变时,会触发pointLabelsClippingChanged(bool clipping)信号。pointLabelsColor : 获取和设置点标签的显示颜色:QColor pointLabelsColor() const;void setPointLabelsColor(const QColor &color);效果:上图分别为将pointLabelsColor属性设置为黑色和绿色的效果。看到这您有可能会有疑问:咦怎么只改变了坐标的颜色,而折线上点的颜色没有变?注意了,这里的点标签是指图表上对数据点加以说明的信息部分,不包括点本身的显示。pointLabelsColor属性发生改变时,会触发pointLabelsColorChanged(const QColor &color)信号。pointLabelsFont : 获取和设置点标签的显示字体:QFont pointLabelsFont() const;void setPointLabelsFont(const QFont &font);该属性通过一个QFont设置来实现:// 获取pointLabels默认字体QFont font = series->pointLabelsFont();// 加粗font.setBold(true);// 斜体font.setItalic(true);// 设置字体大小font.setPointSize(12);// 设置字体为Arial类型font.setFamily(QStringLiteral(“Arial”));// 更新pointLabels字体series->setPointLabelsFont(font);效果:pointLabelsFont属性发生改变时,会触发pointLabelsFontChanged(const QFont &font)信号。pointLabelsFormat : 获取和设置点标签的显示格式:QString pointLabelsFormat() const;void setPointLabelsFormat(const QString &format);QXYSeries类提供了两个占位符来设置点标签显示真实坐标数据:@xPointX轴坐标@yPointY轴坐标例如,我们需要以:(15,23)这样的格式来显示点标签,可以这样设置,即可实现上文中点标签的显示格式效果:// 设置点标签格式series->setPointLabelsFormat(QStringLiteral("(@xPoint,@yPoint)"));pointLabelFormat属性默认被设置为没有括号的坐标格式:@xPoint, @yPoint。pointLabelsFormat属性发生改变时,会触发pointLabelsFormatChanged(const QString &format)信号。pointLabelsVisible : 获取和设置显示/隐藏点标签:bool pointLabelsVisible() const;void setPointLabelsVisible(bool visible=true);该属性默认被设置为false。// 隐藏点标签series->setPointLabelsVisible(false);效果:pointLabelsVisible属性发生改变时,会触发pointLabelsVisibilityChanged(bool visible)信号。pointsVisible : 获取和设置显示/隐藏点在图表上的标注:bool pointsVisible() const;void setPointsVisible(bool visible=true);与pointsLabelVisible不同,pointsLabelVisible设置的是点标签的显示,而pointsVisible设置的是点本身在图表上的位置标注。该属性默认被设置为false。对比显示和隐藏点标注效果:0x02 对数据源进行增删改QXYSeries类中封装了一系列的重载方法用于操作图表的数据源进行增删改。QXYSeries内部用一个模板类型为QPointF的QVector来持有数据源,其声明在qxyseries_p.h头文件内:增加数据可以调用append的对应重载方法,或者是重载操作符<<添加单个点或者整个点集到数据源的尾部:void append(qreal x, qreal y);void append(const QPointF &point);void append(const QList<QPointF> &points);QXYSeries& operator<<(const QPointF &point);QXYSeries& operator<<(const QList<QPointF> &points);也可以调用insert方法将数据点插入到数据源的指定位置:void insert(int index, const QPointF &point);对应地,不管以何种方式,成功添加数据后都会触发pointAdded(int index)信号,index为被添加的数据的下标。需要注意:每添加一个点就会触发一次pointAdded信号,即批量添加数据时会触发对应次数的pointAdded。删除数据QXYSeries提供了remove重载方法和removePoints方法来移除目标数据:// 删除指定坐标的点void remove(qreal x, qreal y);void remove(const QPointF &point);// 删除指定索引下标的点void remove(int index);// 从下标index位置开始,删除count数量的点void removePoints(int index, int count);与增加数据类似,成功删除数据后会触发对应次数的pointRemoved(int index)信号,index为被删除的数据的下标。修改数据源修改数据源通过replace系列的重载方法实现:// 替换具体坐标的点void replace(qreal oldX, qreal oldY, qreal newX, qreal newY);void replace(const QPointF &oldPoint, const QPointF &newPoint);// 替换指定索引下标的点void replace(int index, qreal newX, qreal newY);void replace(int index, const QPointF &newPoint);// 替换整个数据源void replace(QList<QPointF> points);void replace(QVector<QPointF> points);当只替换数据源的局部数据点(调用前四种重载方法)时,会触发pointReplaced(int index)信号,index为被替换的点的下标;而当替换了整个数据源数据(调用后两种方法)时,则会触发pointsReplaced()信号。需要注意:调用replace后两种重载替换整个数据源时,传QList还是传QVector在性能上是有所区别的:直接传入QList结构的数据集远远比逐个点替换或者先清除所有点再添加这两种方式的效率要高。而直接传入QVector结构的数据集又比前者效率要高。因此:需要批量更新数据点时,应当优先选择void replace(QVector<QPointF> points);这个重载方法。究其原因:本小节一开始就介绍了,QXYSeries内部持有数据源的数据结构为QVector<QPointF>,而参数为QList<QPointF>的重载方法的内部实现也是将QList转换为QVector,再调用参数为QVector<QPointF> 的重载方法实现对数据的更新,无形中多了一个数据转换的步骤,拉低性能:Tips:QList和QVector两个容器本身的效率上也是有区别的,Qt官方推荐优先使用QVector。详细可以参考QVector的官方文档介绍。获取数据源QXYseries提供了返回类型分别为QList<QPointF>和QVector<QPointF>的方法获取数据源:QList<QPointF> points() const;QVector<QPointF> pointsVector() const;与更新replace方法批量更新数据源的重载类似,points()方法获取数据源的方法,内部实现也是获取原始数据源再将其转为QList类型返回;pointsVector()方法则直接返回原始的QVector数据源。0x03 QXYSeries中的鼠标操作QXYSeries共提供了五个鼠标事件响应信号,分别是:单击clicked、双击doubleClicked、鼠标键按下pressed,鼠标键松开released、光标移到图表线上或从图表移开hovered:series->connect(series,&QLineSeries::clicked,[](const QPointF& point){ qDebug() << “point clicked:” << point;});series->connect(series,&QLineSeries::doubleClicked,[](const QPointF& point){ qDebug() << “point double clicked:” << point;});series->connect(series,&QLineSeries::hovered,[](const QPointF& point,bool state){ qDebug() << “point hovered:” << point << " state:" << (state?“光标移动到图表上”:“光标从图表上移开”);});series->connect(series,&QLineSeries::pressed,[](const QPointF& point){ qDebug() << “point pressed:” << point;});series->connect(series,&QLineSeries::released,[](const QPointF& point){ qDebug() << “point released:” << point;});运行程序,执行光标移动到图表序列上->左键双击->光标从图表序列上方移开,结果如下:point hovered: QPointF(4.58291,8.71473) state: moved to seriespoint pressed: QPointF(4.58291,8.71473)point released: QPointF(4.58291,8.71473)point clicked: QPointF(4.58291,8.71473)point double clicked: QPointF(4.58291,8.71473)point pressed: QPointF(4.58291,8.71473)point released: QPointF(4.58291,8.71473)point clicked: QPointF(4.58291,8.71473)point hovered: QPointF(4.71022,8.18182) state: moved from series0x04 The End. ...
这篇文章主要讲解QAbstractSeries的API及其使用。0x00 写在前面:Qt Charts的组成结构 理解本文章内容之前,需要读者对Qt Charts的基本组成有个整体认识,具体可以参考这篇文章:Qt Charts 基本组成。Qt Charts主要由QChartView、QChart、QLegend图例、坐标轴(由QAbstractAxis子类实现)、数据源(由QAbstractSeries子类实现)等组成:0x01 QAbstractSeries类 由上图可知,Qt Charts图表中,数据的最终呈现主要由QAbstractSeries及其派生类负责(上图为QLineSeries),通常在实际开发中都是直接使用QAbstractSeries的派生类来实现功能。QAbstractSeries作为Qt Charts模块中所有数据序列类(Q*Series)的基类,与其子类的继承关系大致如下:Tips:由于QAbstractSeries的子类及其子类的子类数目众多,这里只大致列出了从QAbstractSeries<–QXYSeries<–QLineSeries的继承关系,详情可以参考上文提到的文章链接以及Qt官方文档。可以看到,以QLineSeries为例,QLineSeries继承自QXYSeries,而QXYSeries正是继承自QAbstractSeries类,同时通过学习QLineSeries相关文档和源码了解到,QLineSeries的功能实现几乎都继承于其父类QXYSeries和QAbstractSeries类,因此。要想熟练使用QLineSeries,实现美丽的折线图,学习理解QXYSeries和QAbstractSeries类的API是必须的,本文主要介绍QAbstractSeries。0x02 QAbstractSeries属性QString name;获取和设置series名称,即QAbstractSeries所表示的图形图例名称,支持HTML格式的文本。QString name() const;获取series图例名称。void setName(const QString &name);设置series图例名称。当图例名称发生改变时,会触发QAbstractSeries的nameChanged()信号。bool useOpenGL;获取和设置series是否开启OpenGL加速。bool useOpenGL() const;获取是否开启OpenGL加速。void setUseOpenGL(bool enable=true);设置开启/关闭OpenGL加速渲染,默认关闭。该选项发生改变时会触发QAbstractSeries的useOpenGLChanged()信号。Tips : 在不开启OpenGL加速就能满足性能要求且对该选项带来的副作用不熟悉的情况下,建议不要开启OpenGL加速!当需要绘制大数据量的图表序列时,开启OpenGL加速之后series的绘制性能显著提升。但是Qt Charts实现的OpenGL加速(依托QOpenGLWidget组件实现)迄今为止仍存在一些问题,比如MDI程序环境下,开启了OpenGL加速的图表序列会被置顶于所有MDI子窗口之上,造成图表重叠错乱的问题:而且,目前只有QLineSeries和QScatterSeries两种类型的图表支持开启OpenGL绘制,且当QLineSeries作为面积图QAreaSeries的边缘线时也不能开启OpenGL。因此,慎重开启此选项!qreal opacity;获取和设置图表序列显示的透明度。qreal opacity() const;获取series当前设置的透明度。void setOpacity(qreal opacity);设置series显示的透明度,设置范围:全透明0.0~1.0不透明,该属性值发生改变时会触发opacityChanged()信号。bool visible;获取和设置是否显示当前图表。bool isVisible() const;获取是否显示当前图表;void setVisible(bool visible = true);设置是否显示当前图表,该属性值发生改变时会触发visibleChanged()信号。const SeriesType type;该属性代表当前图表序列series的类型,QAbstractSeries中声明了一个纯虚函数用于操作该属性:virtual QAbstractSeries::SeriesType type() const = 0;QAbstractSeries的子类需要手动实现该函数并返回对应的图表类型。SeriesType是一个枚举类,描述了Qt Charts当前支持的图表类型:0x03 QAbstractSeries公有方法QAbstractSeries主要的公有方法有:bool QAbstractSeries::attachAxis(QAbstractAxis *axis);附加坐标轴到图表序列series,附加成功时返回true,否则返回false: // 创建横、纵坐标轴 QValueAxis *axisX = new QValueAxis; QValueAxis *axisY = new QValueAxis; // 设置坐标轴颜色 axisX->setLinePen(QPen(Qt::blue)); axisY->setLinePen(QPen(Qt::blue)); // 设置坐标轴刻度线颜色和宽度 QPen pen(Qt::black); pen.setWidth(1); axisX->setGridLinePen(pen); axisY->setGridLinePen(pen); // 添加坐标轴到QChart组件 chart->addAxis(axisX,Qt::AlignBottom); chart->addAxis(axisY,Qt::AlignLeft); // 设置显示刻度范围 axisX->setRange(0,25); axisY->setRange(0,15); // 附加坐标系到图表序列series series->attachAxis(axisX); series->attachAxis(axisY); 效果:当同一方向上有多个坐标轴同时依附到同一个图表序列上时,这些坐标轴将会被设置为相同的刻度范围,且经过实践证明,自动调整后的刻度范围是最后被依附到图标序列的坐标轴刻度范围: //增加第二条个横纵坐标系 QValueAxis *axisX1 = new QValueAxis; QValueAxis *axisY1 = new QValueAxis; axisX1->setRange(-5,15); axisY1->setRange(0,5); chart->addAxis(axisX1,Qt::AlignBottom); chart->addAxis(axisY1,Qt::AlignLeft); //将两个坐标系依附到图标序列series series->attachAxis(axisX1); series->attachAxis(axisY1); 效果:QList<QAbstractAxis *> QAbstractSeries::attachedAxes();获取图表序列当前依附的所有坐标轴集合: // 打印上一步中依附到series的所有坐标轴集合 qDebug() << “attached axes:” << series->attachedAxes(); 结果:QChart *QAbstractSeries::chart() const;获取当前图表序列series所属的QChart组件。通过QChart::addSeries()方法将series添加到QChart组件后可以通过此方法获取series被添加到的QChart对象指针。bool QAbstractSeries::detachAxis(QAbstractAxis *axis);从当前图表序列分离坐标轴。0x04 The End. ...
如果您曾尝试使用MSVisio®创建流程图,您知道这并不容易。Visual Paradigm Online(VP Online)更加用户友好且直观,更不用说它的成本更低且平台中立。让我们来看看为什么Visual Paradigm Online是最好的Visio®替代软件。VP Online更具成本效益为 您的整个组织提供低于MSVisio®等效座位数的维护成本 - 节省高达50%。在此请求网站许可证报价。VP Online是跨平台的 作为基于云的图表软件,VP Online支持各种在线图表工具,如UML,BPMN,ArchiMate,ERD,组织结构图,PERT,SWOT,思维导图等。因为VP Online工作原理在网络上,用户可以通过任何Web浏览器在线创建图表,无论他们的操作系统如何。VP Online不需要任何安装 VP Online允许您和您的团队在线编辑图表。没有人需要下载和安装任何软件才能绘制图表。VP Online可以导入Visio®绘图和Visio®模板 VP Online允许您在VP Online中打开Visio®绘图和模板并进行编辑。即使您没有安装Visio®,这也可以使用。只需点击几下,您就可以放弃桌面软件,享受更时尚,更直观的图表解决方案。许多用户正在使用VP Online VP Online的资源目录,无论其复杂程度如何,都可以轻松创建任何类型的图表。许多用户使用VP Online创建技术和业务绘图,并将结果包含在他们的文档和演示文稿中VP Online不需要支援服务 VP Online在构建时非常简单。即使没有技术背景的用户也可以使用VP Online而无需事先培训。VP Online不仅仅是图表软件 除了图表,VP Online还支持许多强大的功能。例如仪表板,流程图,客户旅程映射,信息图表制作工具等。常问问题Visual Paradigm Online多少钱?免费用于非商业用途。Visual Paradigm Online的Express Edition是一款免费的图表软件,可用于个人,教育和其他非营利目的。对于商业用途,每个用户每月仅花费4美元,比市场上的其他流程图软件便宜。模板是免费的吗?是的,包括免费的图表模板。您可以根据需要多次使用它们。自己动手吧了解VP Online的最佳方法是亲自尝试。:-)您无需注册或下载。时间很宝贵。只需单击下面的链接即可打开VP Online的图表编辑器并立即尝试。Visual Paradigm Online - 图编辑器如果您想了解有关Visual Paradigm Online的更多信息,请阅读:Visual Paradigm 特征列表相信我。你会喜欢的。请享用!
VP Online是一个基于Web的图表软件。它支持广泛的业务和技术图表,如ArchiMate,BPMN,UML,ERD,组织结构图,平面图,PERT等。图编辑器非常直观,具有许多出色的编辑功能,使用户能够快速创建图表。顺利。在线UML类图工具 - Visual Paradigm Online让我们来看看一些主要的好处和功能。易于图表使用拖放创建和连接形状。将形状与对齐导向器对齐。使用Visual Paradigm Online快速创建图表,创建的图表具有专业性和视觉吸引力。在Visual Paradigm Online中创建图表非常简单直接!1000多个免费图表模板大量预制,专业外观的图表模板供您快速入门。您不必是专家就可以创建具有专业外观的图表和其他视觉效果。许多图表类型,图表示例和图表模板团队协作云工作区,用于存储团队的工作,便于共享图表和协作设计。同步图表之间的变化MS Office集成将交互式图表嵌入到Microsoft文档和PowerPoint演示文稿中。单击以就地打开编辑器,以便即时编辑嵌入的图表。有了这个很酷的功能,我可以准备好的演示文稿,轻松修改,无需任何导出或复制和粘贴。Microsoft Word中的UML图自己动手吧了解VP Online的最佳方法是亲自尝试。:-)您无需注册或下载。时间很宝贵。只需单击下面的链接即可打开VP Online的图表编辑器并立即尝试。Visual Paradigm Online - 图编辑器如果您想了解有关Visual Paradigm Online的更多信息,请阅读:Visual Paradigm 特征相信我。你会喜欢的。请享用!