Pyqt QCustomPlot 简介、安装与实用代码示例(三)

news2024/11/27 9:49:19

目录

  • 前言
  • 实用代码示例
    • Line Style Demo
    • Date Axis Demo
    • Parametric Curves Demo
    • Bar Chart Demo
    • Statistical Box Demo

所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nixgnauhcuy’s blog!

如需转载,请标明出处!

完整代码我已经上传到 Github 上了,可前往 https://github.com/nixgnauhcuy/QCustomPlot_Pyqt_Study 获取。
完整文章路径:

  • Pyqt QCustomPlot 简介、安装与实用代码示例(一) | nixgnauhcuy
  • Pyqt QCustomPlot 简介、安装与实用代码示例(二) | nixgnauhcuy
  • Pyqt QCustomPlot 简介、安装与实用代码示例(三) | nixgnauhcuy
  • Pyqt QCustomPlot 简介、安装与实用代码示例(四) | nixgnauhcuy

前言

继上文,继续补充官方示例 demo 实现~

实用代码示例

Line Style Demo

A demonstration of several line styles

import sys, math

from PyQt5.QtWidgets import QApplication, QGridLayout, QWidget
from PyQt5.QtGui import QPen, QColor, QFont
from QCustomPlot_PyQt5 import QCustomPlot, QCPGraph, QCPScatterStyle

class MainForm(QWidget):

    def __init__(self) -> None:
        super().__init__()

        self.setWindowTitle("Line Style Demo")
        self.resize(600,400)

        self.customPlot = QCustomPlot(self)
        self.gridLayout = QGridLayout(self).addWidget(self.customPlot)

        self.customPlot.legend.setVisible(True)
        self.customPlot.legend.setFont(QFont("Helvetica", 9))
        pen = QPen()
        lineNames = ["lsNone", "lsLine", "lsStepLeft", "lsStepRight", "lsStepCenter", "lsImpulse"]
        # add graphs with different line styles:
        for i in range(QCPGraph.lsNone, QCPGraph.lsImpulse+1):
            self.customPlot.addGraph()
            pen.setColor(QColor(int(math.sin(i*1+1.2)*80+80), int(math.sin(i*0.3+0)*80+80), int(math.sin(i*0.3+1.5)*80+80)))
            self.customPlot.graph().setPen(pen)
            self.customPlot.graph().setName(lineNames[i-QCPGraph.lsNone])
            self.customPlot.graph().setLineStyle(QCPGraph.LineStyle(i))
            self.customPlot.graph().setScatterStyle(QCPScatterStyle(QCPScatterStyle.ssCircle, 5))
            # generate data:
            x = [j/15.0 * 5*3.14 + 0.01 for j in range(15)]
            y = [7*math.sin(x[j])/x[j] - (i-QCPGraph.lsNone)*5 + (QCPGraph.lsImpulse)*5 + 2 for j in range(15)]
            self.customPlot.graph().setData(x, y)
            self.customPlot.graph().rescaleAxes(True)
        # zoom out a bit:
        self.customPlot.yAxis.scaleRange(1.1, self.customPlot.yAxis.range().center())
        self.customPlot.xAxis.scaleRange(1.1, self.customPlot.xAxis.range().center())
        # set blank axis lines:
        self.customPlot.xAxis.setTicks(False)
        self.customPlot.yAxis.setTicks(True)
        self.customPlot.xAxis.setTickLabels(False)
        self.customPlot.yAxis.setTickLabels(True)
        # make top right axes clones of bottom left axes:
        self.customPlot.axisRect().setupFullAxesBox()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainForm = MainForm()
    mainForm.show()
    sys.exit(app.exec())

Date Axis Demo

Random walks with fill and smart date ticks on the bottom axis

import sys, math, random

from PyQt5.QtWidgets import QApplication, QGridLayout, QWidget
from PyQt5.QtGui import QPen, QColor, QBrush, QFont
from PyQt5.QtCore import QDateTime, QLocale
from QCustomPlot_PyQt5 import QCustomPlot, QCPGraph, QCPGraphData, QCPAxisTickerText, QCPAxisTickerDateTime

class MainForm(QWidget):

    def __init__(self) -> None:
        super().__init__()

        self.setWindowTitle("Date Axis Demo")
        self.resize(600,400)

        self.customPlot = QCustomPlot(self)
        self.gridLayout = QGridLayout(self).addWidget(self.customPlot)

        # set locale to english, so we get english month names:
        self.customPlot.setLocale(QLocale(QLocale.English, QLocale.UnitedKingdom))
        # seconds of current time, we'll use it as starting point in time for data:
        self.now = QDateTime.currentDateTime().toTime_t()
        # create multiple graphs:
        for i in range(5):
            self.customPlot.addGraph()
            color = QColor(int(20+200/4.0*i), int(70*(1.6-i/4.0)), 150, 150)
            self.customPlot.graph().setLineStyle(QCPGraph.lsLine)
            self.customPlot.graph().setPen(QPen(color.lighter(200)))
            self.customPlot.graph().setBrush(QBrush(color))

            # generate random walk data:
            timeData = [QCPGraphData() for k in range(250)]
            for j in range(250):
                timeData[j].key = self.now + 24*3600*j
                if j == 0:
                    timeData[j].value = (j/50.0+1)*(random.random()/5.0-0.5)
                else:
                    timeData[j].value = math.fabs(timeData[j-1].value)*(1+0.02/4.0*(4-i)) + (j/50.0+1)*(random.random()-0.5)
            self.customPlot.graph().data().set(timeData)

        # configure bottom axis to show date instead of number:
        dateTicker = QCPAxisTickerDateTime()
        dateTicker.setDateTimeFormat("d. MMMM\nyyyy")
        self.customPlot.xAxis.setTicker(dateTicker)

        # configure left axis text labels:
        textTicker = QCPAxisTickerText()
        textTicker.addTick(10, "a bit\nlow")
        textTicker.addTick(50, "quite\nhigh")
        self.customPlot.yAxis.setTicker(textTicker)

        # set a more compact font size for bottom and left axis tick labels:
        self.customPlot.xAxis.setTickLabelFont(QFont(QFont().family(), 8))
        self.customPlot.yAxis.setTickLabelFont(QFont(QFont().family(), 8))

        # set axis labels:
        self.customPlot.xAxis.setLabel("Date")
        self.customPlot.yAxis.setLabel("Random wobbly lines value")

        # make top and right axes visible but without ticks and labels:
        self.customPlot.xAxis2.setVisible(True)
        self.customPlot.yAxis2.setVisible(True)
        self.customPlot.xAxis2.setTicks(False)
        self.customPlot.yAxis2.setTicks(False)
        self.customPlot.xAxis2.setTickLabels(False)
        self.customPlot.yAxis2.setTickLabels(False)

        # set axis ranges to show all data:
        self.customPlot.xAxis.setRange(self.now, self.now+24*3600*249)
        self.customPlot.yAxis.setRange(0, 60)

        # show legend with slightly transparent background brush:
        self.customPlot.legend.setVisible(True)
        self.customPlot.legend.setBrush(QColor(255, 255, 255, 150))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainForm = MainForm()
    mainForm.show()
    sys.exit(app.exec())

Parametric Curves Demo

Parametric curves with translucent gradient filling

import sys, math

from PyQt5.QtWidgets import QApplication, QGridLayout, QWidget
from PyQt5.QtGui import QPen, QColor, QBrush, QRadialGradient
from PyQt5.QtCore import QPointF
from QCustomPlot_PyQt5 import QCustomPlot, QCP, QCPCurve, QCPCurveData

class MainForm(QWidget):

    def __init__(self) -> None:
        super().__init__()

        self.setWindowTitle("Parametric Curves Demo")
        self.resize(600,400)

        self.customPlot = QCustomPlot(self)
        self.gridLayout = QGridLayout(self).addWidget(self.customPlot)

        # create empty curve objects:
        self.fermatSpiral1 = QCPCurve(self.customPlot.xAxis, self.customPlot.yAxis)
        self.fermatSpiral2 = QCPCurve(self.customPlot.xAxis, self.customPlot.yAxis)
        self.deltoidRadial = QCPCurve(self.customPlot.xAxis, self.customPlot.yAxis)

        # generate the curve data points:
        pointCount = 500
        dataSpiral1 = [QCPCurveData() for i in range(pointCount)]
        dataSpiral2 = [QCPCurveData() for i in range(pointCount)]
        dataDeltoid = [QCPCurveData() for i in range(pointCount)]
        for i in range(pointCount):
            phi = i/(pointCount-1)*8*math.pi
            theta = i/(pointCount-1)*2*math.pi
            dataSpiral1[i] = QCPCurveData(i, math.sqrt(phi)*math.cos(phi), math.sqrt(phi)*math.sin(phi))
            dataSpiral2[i] = QCPCurveData(i, -dataSpiral1[i].key, -dataSpiral1[i].value)
            dataDeltoid[i] = QCPCurveData(i, 2*math.cos(2*theta)+math.cos(1*theta)+2*math.sin(theta), 2*math.sin(2*theta)-math.sin(1*theta))

        # pass the data to the curves; we know t (i in loop above) is ascending, so set alreadySorted=True (saves an extra internal sort):
        self.fermatSpiral1.data().set(dataSpiral1, True)
        self.fermatSpiral2.data().set(dataSpiral2, True)
        self.deltoidRadial.data().set(dataDeltoid, True)

        # color the curves:
        self.fermatSpiral1.setPen(QPen(QColor(0, 0, 255)))
        self.fermatSpiral1.setBrush(QBrush(QColor(0, 0, 255, 20)))
        self.fermatSpiral2.setPen(QPen(QColor(255, 120, 0)))
        self.fermatSpiral2.setBrush(QBrush(QColor(255, 120, 0, 30)))
        radialGrad = QRadialGradient(QPointF(310, 180), 200)
        radialGrad.setColorAt(0, QColor(170, 20, 240, 100))
        radialGrad.setColorAt(0.5, QColor(20, 10, 255, 40))
        radialGrad.setColorAt(1,QColor(120, 20, 240, 10))
        self.deltoidRadial.setPen(QPen(QColor(170, 20, 240)))
        self.deltoidRadial.setBrush(QBrush(radialGrad))

        # set some basic customPlot config:
        self.customPlot.setInteractions(QCP.iRangeDrag | QCP.iRangeZoom | QCP.iSelectPlottables)
        self.customPlot.axisRect().setupFullAxesBox()
        self.customPlot.rescaleAxes()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainForm = MainForm()
    mainForm.show()
    sys.exit(app.exec())

Bar Chart Demo

Three stacked bar charts with manual x axis tick labels

import sys

from PyQt5.QtWidgets import QApplication, QGridLayout, QWidget
from PyQt5.QtGui import QPen, QColor, QBrush, QFont, QLinearGradient
from PyQt5.QtCore import Qt
from QCustomPlot_PyQt5 import QCustomPlot, QCPBars, QCP, QCPAxisTickerText

class MainForm(QWidget):

    def __init__(self) -> None:
        super().__init__()

        self.setWindowTitle("Bar Chart Demo")
        self.resize(600,400)

        self.customPlot = QCustomPlot(self)
        self.gridLayout = QGridLayout(self).addWidget(self.customPlot)

        # set dark background gradient:
        gradient = QLinearGradient(0, 0, 0, 400)
        gradient.setColorAt(0, QColor(90, 90, 90))
        gradient.setColorAt(0.38, QColor(105, 105, 105))
        gradient.setColorAt(1, QColor(70, 70, 70))
        self.customPlot.setBackground(QBrush(gradient))

        # create empty bar chart objects:
        self.regen = QCPBars(self.customPlot.xAxis, self.customPlot.yAxis)
        self.nuclear = QCPBars(self.customPlot.xAxis, self.customPlot.yAxis)
        self.fossil = QCPBars(self.customPlot.xAxis, self.customPlot.yAxis)
        self.regen.setAntialiased(False) # gives more crisp, pixel aligned bar borders
        self.nuclear.setAntialiased(False)
        self.fossil.setAntialiased(False)
        self.regen.setStackingGap(1)
        self.nuclear.setStackingGap(1)
        self.fossil.setStackingGap(1)
        # set names and colors:
        self.fossil.setName("Fossil fuels")
        self.fossil.setPen(QPen(QColor(111, 9, 176).lighter(170)))
        self.fossil.setBrush(QColor(111, 9, 176))
        self.nuclear.setName("Nuclear")
        self.nuclear.setPen(QPen(QColor(250, 170, 20).lighter(150)))
        self.nuclear.setBrush(QColor(250, 170, 20))
        self.regen.setName("Regenerative")
        self.regen.setPen(QPen(QColor(0, 168, 140).lighter(130)))
        self.regen.setBrush(QColor(0, 168, 140))
        # stack bars on top of each other:
        self.nuclear.moveAbove(self.fossil)
        self.regen.moveAbove(self.nuclear)

        # prepare x axis with country labels:
        ticks = [1, 2, 3, 4, 5, 6, 7]
        labels = ["USA", "Japan", "Germany", "France", "UK", "Italy", "Canada"]
        textTicker = QCPAxisTickerText()
        textTicker.addTicks(ticks, labels)
        self.customPlot.xAxis.setTicker(textTicker)
        self.customPlot.xAxis.setTickLabelRotation(60)
        self.customPlot.xAxis.setSubTicks(False)
        self.customPlot.xAxis.setTickLength(0, 4)
        self.customPlot.xAxis.setRange(0, 8)
        self.customPlot.xAxis.setBasePen(QPen(Qt.white))
        self.customPlot.xAxis.setTickPen(QPen(Qt.white))
        self.customPlot.xAxis.grid().setVisible(True)
        self.customPlot.xAxis.grid().setPen(QPen(QColor(130, 130, 130), 0, Qt.DotLine))
        self.customPlot.xAxis.setTickLabelColor(Qt.white)
        self.customPlot.xAxis.setLabelColor(Qt.white)

        # prepare y axis:
        self.customPlot.yAxis.setRange(0, 12.1)
        self.customPlot.yAxis.setPadding(5) # a bit more space to the left border
        self.customPlot.yAxis.setLabel("Power Consumption in\nKilowatts per Capita (2007)")
        self.customPlot.yAxis.setBasePen(QPen(Qt.white))
        self.customPlot.yAxis.setTickPen(QPen(Qt.white))
        self.customPlot.yAxis.setSubTickPen(QPen(Qt.white))
        self.customPlot.yAxis.grid().setSubGridVisible(True)
        self.customPlot.yAxis.setTickLabelColor(Qt.white)
        self.customPlot.yAxis.setLabelColor(Qt.white)
        self.customPlot.yAxis.grid().setPen(QPen(QColor(130, 130, 130), 0, Qt.SolidLine))
        self.customPlot.yAxis.grid().setSubGridPen(QPen(QColor(130, 130, 130), 0, Qt.DotLine))

        # Add data:
        self.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]
        self.nuclearData = [0.08*10.5, 0.12*5.5, 0.40*5.8, 0.09*5.2, 0.00*4.2, 0.07*11.2]
        self.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]
        self.fossil.setData(ticks, self.fossilData)
        self.nuclear.setData(ticks, self.nuclearData)
        self.regen.setData(ticks, self.regenData)

        # setup legend:
        self.customPlot.legend.setVisible(True)
        self.customPlot.axisRect().insetLayout().setInsetAlignment(0, Qt.AlignTop|Qt.AlignHCenter)
        self.customPlot.legend.setBrush(QColor(255, 255, 255, 100))
        self.customPlot.legend.setBorderPen(QPen(Qt.PenStyle.NoPen))
        legendFont = QFont()
        legendFont.setPointSize(10)
        self.customPlot.legend.setFont(legendFont)
        self.customPlot.setInteractions(QCP.Interactions(QCP.iRangeDrag | QCP.iRangeZoom))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainForm = MainForm()
    mainForm.show()
    sys.exit(app.exec())

Statistical Box Demo

Statistical 5-parameter-box-plot with outliers

import sys

from PyQt5.QtWidgets import QApplication, QGridLayout, QWidget
from PyQt5.QtGui import QColor, QBrush
from PyQt5.QtCore import Qt
from QCustomPlot_PyQt5 import QCustomPlot, QCPStatisticalBox, QCP, QCPAxisTickerText

class MainForm(QWidget):

    def __init__(self) -> None:
        super().__init__()

        self.setWindowTitle("Statistical Box Demo")
        self.resize(600,400)

        self.customPlot = QCustomPlot(self)
        self.gridLayout = QGridLayout(self).addWidget(self.customPlot)

        statistical = QCPStatisticalBox(self.customPlot.xAxis, self.customPlot.yAxis)
        boxBrush = QBrush(QColor(60, 60, 255, 100))
        boxBrush.setStyle(Qt.Dense6Pattern)  # make it look oldschool
        statistical.setBrush(boxBrush)

        # specify data:
        statistical.addData(1, 1.1, 1.9, 2.25, 2.7, 4.2)
        statistical.addData(2, 0.8, 1.6, 2.2, 3.2, 4.9, [0.7, 0.34, 0.45, 6.2, 5.84])  # provide some outliers as list
        statistical.addData(3, 0.2, 0.7, 1.1, 1.6, 2.9)

        # prepare manual x axis labels:
        self.customPlot.xAxis.setSubTicks(False)
        self.customPlot.xAxis.setTickLength(0, 4)
        self.customPlot.xAxis.setTickLabelRotation(20)
        textTicker = QCPAxisTickerText()
        textTicker.addTick(1, "Sample 1")
        textTicker.addTick(2, "Sample 2")
        textTicker.addTick(3, "Control Group")
        self.customPlot.xAxis.setTicker(textTicker)

        # prepare axes:
        self.customPlot.yAxis.setLabel("O₂ Absorption [mg]")
        self.customPlot.rescaleAxes()
        self.customPlot.xAxis.scaleRange(1.7, self.customPlot.xAxis.range().center())
        self.customPlot.yAxis.setRange(0, 7)
        self.customPlot.setInteractions(QCP.iRangeDrag | QCP.iRangeZoom)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainForm = MainForm()
    mainForm.show()
    sys.exit(app.exec())

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

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

相关文章

最新QT安装程序安装QT旧版本

1、下载Qt在线安装程序 官方下载地址:https://download.qt.io/official_releases/online_installers/ 也可以选择国内镜像地址下载,如清华大学的镜像地址: https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/…

C#ListView的单元格支持添加基本及自定义任意控件

功能说明 使用ListView时,希望可以在单元格显示图片或其他控件,发现原生的ListView不支持,于是通过拓展,实现ListView可以显示任意控件的功能,效果如下: 实现方法 本来想着在单元格里面实现控件的自绘的…

python-日历库calendar

目录 打印日历 基本日历类Calendar TextCalendar类 HTMLCalendar类 打印日历 设置日历每周开始日期(周几) import calendarcalendar.setfirstweekday(calendar.SUNDAY) # 设置日历中每周以周几为第一天显示 打印某年日历 print(calendar.calendar(2024, w2, l1, c6, m…

事实证明:企业级中后台框架,大厂还是主角,小厂打酱油。

提及中后台框架,你或许能够想到antdesign、arcodesign还有fusion等等,这些都是背靠大厂,是市场的主角,而一些小厂框架往往是扮演者陪太子读书的角色。本文将给大家分享市面上有哪些大厂的中后台框架?为什么大厂要开源自…

MySQL修改用户权限(宝塔)

在我们安装好的MySQL中,很可能对应某些操作时,不具备操作的权限,如下是解决这些问题的方法 我以宝塔创建数据库为例,创建完成后,以创建的用户名和密码登录 这里宝塔中容易发生问题的地方,登录不上去&#…

29. 透镜阵列

导论: 物理传播光学(POP)不仅可以用于简单系统,也可以设计优化复杂的光学系统,比如透镜阵列。 设计流程: 透镜阵列建模 在孔径类型中选择“入瞳直径”,并输入2 在视场设定中。设置一个视场&…

求二叉树最大深度-二叉树

104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 1、用层序遍历&#xff0c;一层层遍历 class Solution { public:int maxDepth(TreeNode* root) {if(root nullptr)return 0;vector<TreeNode*> que;que.push_back(root);int res 0;//记层数while(!que.e…

【GIS技术】Shp矢量图斑数据的四至点坐标或四至坐标计算

经常有从事gis相关、地信相关行业的朋友或者是需要对图斑矢量进行四至坐标的计算的时候&#xff0c;按照各类搜索引擎或者是教学文章中的教学步骤求出来的四至坐标是错的。特别是比如林业图斑求四至点、农田四至点等等。 错的原因在于很多文章中教学的四至坐标实际上指的是图斑…

带你走进CCS光源——环形低角度光源LDR2-LA系列

机器视觉系统中&#xff0c;光源起着重要作用&#xff0c;不同类型的光源应用也不同&#xff0c;选择合适的光源成像效果非常明显。今天我们一起来看看CCS光源——工业用环形低角度光源LDR2-LA系列。 LDR2-LA系列 采用柔性基板&#xff0c;创造最佳倾斜角度。 通过从低角度向…

目标检测——室内服务机器人LifelongSLAM数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

scratch3编程01-山地足球+射击游戏

目录 一&#xff0c;山地足球 1&#xff0c;基础&#xff08;需要的素材&#xff09; 1&#xff09;使用“重复执行直到”语句块 2&#xff09;使用“如果那么否则”语句 2&#xff0c;效果 3&#xff0c;sb3文件 一&#xff0c;击败小怪兽 1&#xff0c;基础&#xff0…

gsoap2.8交叉编译方法(详细、亲测可用)

环境搭建 交叉编译器安装&#xff0c;过程略。 注意&#xff1a;如果要使用脚本配置环境变量&#xff0c;在运行脚本时&#xff0c;应该使用 . /绝对路径的方式&#xff0c;而不是直接/绝对路径或者./绝对路径&#xff0c;否则会导致配置失败。&#xff08;亲测如此&#xff0…

《失败的逻辑》|别再无效复盘了!学会认清每一次失败的必然性

为什么铁路信号系统工作正常时&#xff0c;列车仍然会发生撞车事故&#xff1f; 为什么所有操作人员都警觉地坚守着工作岗位&#xff0c;核反应堆依然会发生灾难性的熔化事故&#xff1f; 为什么我们制定得甚好的那么多专业和个人计划&#xff0c;会如此频繁地出岔子&#xff1…

让工业智能更简单

聚焦平台&#xff0c;深耕行业&#xff0c;蓝卓通过工业互联网平台赋能工厂数字化转型。 supOS是蓝卓自主研发的中国首个自主知识产权的工业操作系统&#xff0c;蓝卓数字科技有限公司总经理谭彰把它称为“嵌入到工厂内部的一个工业安卓系统”。如果把工厂看作智能手机&#x…

线下教育暑假班招生:教育行业营销短信群发平台是不二之选!

确实&#xff0c;对于线下教育暑假班的招生工作来说&#xff0c;利用教育行业营销短信群发平台是一个高效且实用的策略。以下是一些关于使用此类平台的好处&#xff1a; 1.快速传播&#xff1a;短信具有即时到达的特性&#xff0c;可以确保信息在第一时间传递给目标受众。这对…

汽车陪练app开发,安全上路,无忧前行

驾考作为我国报名人数最多的考试&#xff0c;每年都有无数人拿到驾照。但是这其中又有很多人望“本”兴叹&#xff0c;不敢上路。为此&#xff0c;试后练车成为驾考人熟练上路不可或缺的一环。大规模的需求与科技的不断发展&#xff0c;对汽车陪练行业提出了新的需求与挑战&…

代码随想录算法训练营第六十三天 | 42. 接雨水、84.柱状图中最大的矩形

42. 接雨水 文字讲解&#xff1a;代码随想录 视频讲解&#xff1a;单调栈&#xff0c;经典来袭&#xff01;LeetCode:42.接雨水_哔哩哔哩_bilibili 解题思路 思路一&#xff1a;单调栈 我们要找到矩形作为底时&#xff0c;左边和右边第一个比它大的元素 1.使用单调栈内元素的…

2024年退休金上调3%后一个扎心的现实。。。

个人原创&#xff0c;手写码字1050 你好&#xff0c;我是郭震 今天正式宣布&#xff0c;退休养老金上调3%&#xff1a; 1 现状分析 我对此做一些分析&#xff0c;从数据中帮助老铁们看清一些事实。 根据去年数据&#xff0c;农村老人1.2亿&#xff1a; 去年数据显示&#xff0c…

宝藏速成秘籍(8)基数排序法

一、前言 1.1、概念 基数排序法是一种非比较性的排序算法&#xff0c;通过将待排序的元素分割成独立的位数&#xff0c;然后按照每个位数的值进行排序。它可以用于对整数或字符串等数据类型进行排序。 1.2、排序步骤 确定待排序元素的位数&#xff0c;并根据最大位数创建对应…

LiveCharts2:简单灵活交互式且功能强大的.NET图表库

前言 之前的文章中提到过ScottPlot、与oxyplot&#xff0c;这两个是比较常用的.NET图表库&#xff0c;今天介绍一款新的.NET图表库&#xff1a;LiveCharts2。 LiveCharts2介绍 LiveCharts2 是一个现代化的数据可视化库&#xff0c;用于创建动态和交互式图表&#xff0c;支持…