精华内容
下载资源
问答
  • iMindMap思维导图中,iMindMap分支有两种绘制模式,一种为普通分支模式,另一种为手绘分支模式。而这两种分支绘制模式又有哪些区别
           iMindMap思维导图中,iMindMap分支有两种绘制模式,一种为普通分支模式,另一种为手绘分支模式。而这两种分支绘制模式又有哪些区别呢?下面就和大家好好介绍下iMindMap中的这两种分支绘制模式。
           当我们打开【设计】工具栏,便可以看到绘制模式板块。
     
           打开下拉框有两个选项,分支、手绘。
           首先讲一讲分支。这个就是普通的分支模式,根据系统的或者你新建时的选择来添加分支,iMindMap默认的也就是分支模式。
     
           着重要讲的是手绘。我们点击手绘后,绘制模式中的图标就会变成手绘,表示现在处于手绘模式。
           这时候,我们就可以大展手脚,用鼠标来任性的进行创作,我们也会注意到,原本主题图标的位置也发生了变化,红色的分支线与蓝色操控图标换了位置。
     
           当然这个手绘功能并不能够对带有主题框的分支产生作用。
           以上就是关于iMindMap中关于分支绘制模式的具体内容了,通过上述内容相信就能帮助大家对于iMindMap中的这个分支绘制模式有了更深刻的了解,帮助大家更好的用好iMindMap这款思维导图软件。

    展开全文
  • 本文将带大家使用免费开源的PyMOL软件绘制D715-2441蛋白与与PB2cap配体分子的结合模式图。 我们先来看一张成品图: 研究背景 根据分析结果,我们获得以下相互作用: 1、化合物D715-2441的芳环夹氨基酸残基H357...

    更好的阅读体验:使用PyMOL绘制蛋白与配体分子结合模式图

    摘要

    本文将带大家使用免费开源的PyMOL软件绘制D715-2441蛋白与与PB2cap配体分子的结合模式图。

    我们先来看一张成品图:
    在这里插入图片描述

    研究背景

    根据分析结果,我们获得以下相互作用:

    1、化合物D715-2441的芳环夹在氨基酸残基H357和F404之间并形成π-π堆积作用,还与F404形成疏水作用;

    2、化合物苯环上的羟基与E361的羧基和K376的N+原子形成氢键作用,另一个羟基与F404的O原子形成氢键作用;

    3、化合物吡喃酮环酯基与K339的N+原子和H357的咪唑基形成盐桥作用。

    操作步骤

    PyMOL作图通常是对特定对象进行展示形式、颜色、字体等方面的修饰。PyMOL的精髓在于命令行与鼠标的配合使用,本文高度依赖命令行,请做好心理准备。大多数命令格式较为一致,请注意总结归纳。

    PyMOL作图
    1 设定工作目录,打开文件
    打开PyMOL软件,导入刚才下载的复合物PDB文件(rli-D715-2441-1.pdb)。

    注意:有两种方法导入文件,一种是鼠标点击菜单栏File -> Open…,另一种是通过命令行。在这里,我们采用命令来操作,因为这样可以同时把工作目录设置好,方便后续保存文件。

    假设我们的工作目录为D:\demo。注意:路径中不要有中文和空格,这是导致很多计算类软件(尤其是免费软件)出现问题的原因。

    在PyMOL上界面或下界面的命令输入框输入以下命令(PyMOL>表示这是PyMOL的命令),每行输入完毕后按【Enter】键:
    在这里插入图片描述在这里插入图片描述
    2 设置操作对象

    结合模式图通常涉及到受体(蛋白)与配体(小分子化合物)两部分(有的还可能涉及水分子、金属离子、辅酶;等等),需为之分别设置对象,以便后续操作。设置配体对象:按照下图顺序,将配体设置为lig对象。在这里插入图片描述
    3 设置关键残基对象

    关键残基包括:A链的K339、H357、E361、K376和F404。由于该蛋白只有一条链,在使用命令选择残基时,可以不用指定链名。按照下图顺序,将关键残基设置为res对象。
    在这里插入图片描述
    4 显示所需,隐藏多余
    在PyMOL中输入以下命令:
    在这里插入图片描述
    然后,进行鼠标操作:
    在这里插入图片描述
    5 绘制相互作用力
    前面说过,命令行和鼠标的配合是很重要的。这里再简单讲讲鼠标的几个操作用法:

    A) 拖动鼠标左键:按住右键,任意方向拖动鼠标,使视图转动;

    B) 上下拖动鼠标右键:按住右键,上下拖动鼠标,使视图缩放;

    C) 拖动鼠标中间滚轮:按住滚轮,任意方向拖动鼠标,使视图移动;

    D)滚动鼠标中间滚轮:拉进或拉远镜头,使近处原子逐渐显示或隐藏。

    我们参照平台给出的结合模式图(本文第二张图),通过下面的键鼠操作来绘制相互作用力。

    · 绘制π-π堆积与盐桥作用

    首先,确保鼠标模式(Mouse Mode)为Viewing状态,选择(Selecting)模式为Atoms状态(位置在PyMOL右下方)。然后,按照下面步骤操作:在这里插入图片描述然后,点击PyMOL菜单栏的Wizard -> Measurement,然后根据示意图点击刚才创建的小球,两两一组,便画出虚线(相应地,生成对象measure01~05)。在这里插入图片描述
    · 绘制其他作用力

    采用相同的办法,把氢键和疏水作用也画出来。由于这些作用力的两端刚好落在原子上,因此,不用绘制小球。
    在这里插入图片描述
    6 最后加工
    为方便调整,也为图片规格符合要求(通常,出版社要求全版图片宽度≤2000像素,半版图片宽度≤1000像素,分辨率≥300 dpi),我们将PyMOL界面放大或靠边最大化,并将上半部分的对话框往上拉到最小,让视图最大。然后放大、摆动视图至合适的角度,使尽可能清晰地看到各关键细节。

    基本的创建工作已经完成,接下来进行细致的修饰。
    在这里插入图片描述我们还可按下图步骤微调cartoon样式:
    在这里插入图片描述
    还可移动label的位置(设置Mouse Mode为Editing模式后,按住Ctrl键,用鼠标左键或右键拖动label;必要时,可先将cartoo隐藏起来,等调整好label后,再显示出来),让视图更清晰。经过上述一系列操作,得到下图:
    在这里插入图片描述
    7 生成图片
    上面的图已经可以发表文章了,但为了更好看,还需要进行一步:光线追踪(Ray tracing)。

    继续使用命令:
    在这里插入图片描述
    至此,我们拿到3张图片:focus.png、label.png和overview.png。

    说明

    本文由 生化环材摘编自 高质量PyMOL作图教程,遵循 CC 4.0 BY-SA 版权协议
    展开全文
  • 绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的...在绘制文字时会默认使用抗锯齿。 QPainter painter(this); painter.setPen(Qt...

    绘制文字

    除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象。在绘制文字时会默认使用抗锯齿。

        QPainter painter(this);
        painter.setPen(Qt::blue);
        painter.setFont(QFont("Arial", 30));
        painter.drawText(rect(), Qt::AlignCenter, "Qt");

    绘制文本函数的一种重载形式

    QPainter::drawText ( const QRectF & rectangle, int flags, const QString & text, QRectF * boundingRect = 0 )
    • 第一个参数指定了绘制文字所在的矩形;
    • 第二个参数指定了文字在矩形中的对齐方式,它由Qt::AlignmentFlag枚举变量进行定义,不同对齐方式也可以使用“|”操作符同时使用,这里还可以使用Qt::TextFlag定义的其他一些标志,比如自动换行等;
    • 第三个参数就是所要绘制的文字,这里可以使用“\n”来实现换行;
    • 第四个参数一般不用设置。

    如果绘制的文字和它的布局不用经常改动,那么也可以使用drawStaticText()函数,它更高效。

    实例:

        QPainter painter(this);
        QRectF rect(10.0, 10.0, 380.0, 280.0);
        painter.setPen(Qt::red);
        painter.drawRect(rect);
        painter.setPen(Qt::blue);
        painter.drawText(rect, Qt::AlignHCenter, tr("AlignHCenter"));
        painter.drawText(rect, Qt::AlignLeft, tr("AlignLeft"));
        painter.drawText(rect, Qt::AlignRight, tr("AlignRight"));
        painter.drawText(rect, Qt::AlignVCenter, tr("AlignVCenter"));
        painter.drawText(rect, Qt::AlignBottom, tr("AlignBottom"));
        painter.drawText(rect, Qt::AlignCenter, tr("AlignCenter"));
        painter.drawText(rect, Qt::AlignBottom | Qt::AlignRight,
                         tr("AlignBottom\nAlignRight"));

    运行结果:

    实例:

    QFont font("宋体", 15, QFont::Bold, true);
    //设置下划线
    font.setUnderline(true);
    //设置上划线
    font.setOverline(true);
    //设置字母大小写
    font.setCapitalization(QFont::SmallCaps);
    //设置字符间的间距
    font.setLetterSpacing(QFont::AbsoluteSpacing, 10);
    //使用字体
    painter.setFont(font);
    painter.setPen(Qt::green);
    painter.drawText(120, 80, tr("yafeilinux"));
    painter.translate(100, 100);
    painter.rotate(90);
    painter.drawText(0, 0, tr("helloqt"));

    运行结果:

    绘制路径

    如果要绘制一个复杂的图形,尤其是要重复绘制这样的图形,那么可以使用QPainterPath类对象,然后使用QPainter::drawPath()来进行绘制。QPainterPath类为绘制操作提供了一个容器,可以用来创建图形并且进行重复使用。

    一个绘图路径就是由多个矩形、椭圆、线条或者曲线等组成的对象,一个路径可以是封闭的,例如矩形和椭圆;也可以是非封闭的,例如线条和曲线。

    实例:

    void Widget::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        QPainterPath path;
        // 移动当前点到点(50, 250)
        path.moveTo(50, 250);
        // 从当前点即(50, 250)绘制一条直线到点(50, 230),完成后当前点更改为(50, 230)
        path.lineTo(50, 230);
        // 从当前点和点(120, 60)之间绘制一条三次贝塞尔曲线
        path.cubicTo(QPointF(105, 40), QPointF(115, 80), QPointF(120, 60));
        path.lineTo(130, 130);
        // 向路径中添加一个椭圆
        path.addEllipse(QPoint(130, 130), 30, 30);
        painter.setPen(Qt::darkYellow);
        // 绘制路径
        painter.drawPath(path);
        // 平移坐标系统后重新绘制路径
        path.translate(200,0);
        painter.setPen(Qt::darkBlue);
        painter.drawPath(path);
    }

    运行结果:

    当创建一个QPainterPath对象后就会以坐标原点为当前点进行绘制,可以随时使用moveTo()函数改变当前点,比如程序中移动到了点(50, 250),那么下次就会从该点开始进行绘制;可以使用lineTo()、arcTo()、cubicTo()和quadTo()等函数将直线或者曲线添加到路径中。

    QPainterPath::cubicTo ( const QPointF & c1, const QPointF & c2, const QPointF & endPoint )函数可以在当前点和endPoint点之间添加一个三次贝塞尔曲线,其中的c1和c2是控制点。quadTo()函数可以绘制一个二次贝塞尔曲线。

    可以使用addEllipse()、addPath()、addRect()、addRegion()、addText()和addPolygon()来向路径中添加一些图形或者文字,它们都从当前点开始进行绘制,绘制完成后以结束点作为新的当前点,这些图形都是由一组直线或者曲线组成的。例如矩形就是顺时针添加的一组直线,绘制完成后当前点在矩形的左上角;而椭圆由一组顺时针曲线组成,开始点和结束点都在0度处(3点钟的位置)。另外还可以使用addPath()来添加其他的路径,这样会从本路径的当前点和要添加路径的第一个组件间添加一条直线。

    可以使用currentPosition()函数获取当前点,使用moveTo()函数改变当前点;当组建好路径后可以使用drawPath()函数来绘制路径,这里使用translate()函数将路径平移后又重新绘制了路径,可以看到这样就可以重复绘制复杂的图形了,这也是QPainterPath的主要作用。

    填充规则

    填充路径时也要使用填充规则,这里一共有两个填充规则:Qt::OddEvenFill和Qt::WindingFill。其中Qt::OddEvenFill使用的是奇偶填充规则,具体来说就是:如果要判断一个点是否在图形中,那么可以从该点向图形外引一条水平线,如果该水平线与图形的交点的个数为奇数,那么该点就在图形中。这个规则是默认值;而Qt::WindingFill使用的是非零弯曲规则,具体来说就是:如果要判断一个点是否在图形中,那么可以从该点向图形外引一条水平线,那么如果该水平线与图形的边线相交,这个边线是顺时针绘制的,就记为1,是逆时针绘制的就记为-1,然后将所有数值相加,如果结果不为0,那么该点就在图形中。

    下图是这两种规则的示意图,对于Qt::OddEvenFill规则,第一个交点记为1,第二个交点记为2;对于Qt::WindingFill规则,因为椭圆和矩形都是以顺时针进行绘制的,所以各个交点对应的边都使用1来代表。

    实例:

    void Widget::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        QPainterPath path;
        path.addEllipse(10,50,100,100);
        path.addRect(50,100,100,100);
        painter.setBrush(Qt::cyan);
        painter.drawPath(path);
        painter.translate(180,0);
        path.setFillRule(Qt::WindingFill);
        painter.drawPath(path);
    }

    运行结果:

    绘制图像

    Qt提供了四个类来处理图像数据:QImage、QPixmap、QBitmap和QPicture,它们也都是常用的绘图设备。

    • QImage主要用来进行I/O处理,它对I/O处理操作进行了优化,而且也可以用来直接访问和操作像素;
    • QPixmap主要用来在屏幕上显示图像,它对在屏幕上显示图像进行了优化;
    • QBitmap是QPixmap的子类,它是一个便捷类,用来处理颜色深度为1的图像,即只能显示黑白两种颜色;
    • QPicture用来记录并重演QPainter命令。

    QImage

    QImage类提供了一个与硬件无关的图像表示方法,可以直接访问像素数据,也可以作为绘图设备。

    因为QImage是QPaintDevice的子类,所以QPainter可以直接在QImage对象上进行绘制。当在QImage上使用QPainter时,绘制操作会在当前GUI线程以外的其他线程中执行。

    QImage支持的图像格式包含了单色、8位、32位和alpha混合格式图像。QImage提供了获取图像各种信息的相关函数,还提供了一些转换图像的函数。

    QImage使用了隐式数据共享,所以可以进行值传递,QImage对象还可以使用数据流或者进行比较。

    void Widget::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        QImage image;
        // 加载一张图片
        image.load("image.png");
        // 输出图片的一些信息
        qDebug() << image.size() << image.format() << image.depth();
        // 在界面上绘制图片
        painter.drawImage(QPoint(10, 10), image);
        // 获取镜像图片
        QImage mirror = image.mirrored();
        // 将图片进行扭曲
        QTransform transform;
        transform.shear(0.2, 0);
        QImage image2 = mirror.transformed(transform);
        painter.drawImage(QPoint(10, 160), image2);
        // 将镜像图片保存到文件
        image2.save("../myDrawing3/mirror.png");
    }

    运行结果:

    QPixmap

    QPixmap可以作为一个绘图设备将图像显示在屏幕上。QPixmap中的像素在内部由底层的窗口系统来进行管理。因为QPixmap是QPaintDevice的子类,所以QPainter也可以直接在它上面进行绘制。要想访问像素,只能使用QPainter的相应函数,或者将QPixmap转换为QImage。而与QImage不同,QPixmap中的fill()函数可以使用指定的颜色初始化整个pixmap图像。

    可以使用toImage()和fromImage()函数在QImage和QPixmap之间进行转换。通常情况下,QImage类用来加载一个图像文件,随意操纵图像数据,然后将QImage对象转换为QPixmap类型再显示到屏幕上。当然,如果不需要对图像进行操作,那么也可以直接使用QPixmap来加载图像文件。与QImage不同,QPixmap依赖于具体的硬件。QPixmap类也是使用隐式数据共享,可以作为值进行传递。

    QPixmap可以很容易的使用QLabel或QAbstractButton的子类(比如QPushButton)来显示在屏幕上。QLabel拥有一个pixmap属性,而QAbstractButton拥有一个icon属性。我们还可以使用grabWidget()和grabWindow()等静态函数来实现截屏功能,使用mask()等函数实现遮罩效果。

    实例:

    void Widget::paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        QPixmap pix;
        pix.load("iamge.png");
        painter.drawPixmap(0, 0, pix.width(), pix.height(), pix);
        painter.setBrush(QColor(255, 255, 255, 100));
        painter.drawRect(0, 0, pix.width(), pix.height());
        painter.drawPixmap(100, 0, pix.width(), pix.height(), pix);
        painter.setBrush(QColor(0, 0, 255, 100));
        painter.drawRect(100, 0, pix.width(), pix.height());
    }

    运行结果:

    QPicture

     QPicture是一个可以记录和重演QPainter命令的绘图设备。QPicture可以使用一个平台无关的格式(.pic格式)将绘图命令序列化到IO设备中,所有可以绘制在QWidget部件或者QPixmap上的内容,都可以保存在QPicture中。QPicture与分辨率无关,在不同设备上的显示效果都是一样的。要记录QPainter命令,可以像如下代码这样进行:

    QPicture picture;
    QPainter painter;
    painter.begin(&picture);
    painter.drawEllipse(10,20, 80,70);
    painter.end();
    picture.save("drawing.pic");
    

    要重演QPainter命令,可以像如下代码这样进行:

    QPicture picture;
    picture.load("drawing.pic");
    QPainter painter;
    painter.begin(&myImage);
    painter.drawPicture(0, 0, picture);
    painter.end();

    复合模式

    QPainter提供了复合模式(Composition Modes)来定义如何完成数字图像的复合,即如何将源图像的像素和目标图像的像素进行合并。

    实例:

    void Widget::paintEvent(QPaintEvent *event)
    {
        QPainter painter;
        QImage image(400, 300, QImage::Format_ARGB32_Premultiplied);
        painter.begin(&image);
        painter.setBrush(Qt::green);
        painter.drawRect(100, 50, 200, 200);
        painter.setBrush(QColor(0, 0, 255, 150));
        painter.drawRect(50, 0, 100, 100);
        painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
        painter.drawRect(250, 0, 100, 100);
        painter.setCompositionMode(QPainter::CompositionMode_DestinationOver);
        painter.drawRect(50, 200, 100, 100);
        painter.setCompositionMode(QPainter::CompositionMode_Xor);
        painter.drawRect(250, 200, 100, 100);
        painter.end();
        painter.begin(this);
        painter.drawImage(0, 0, image);
    }

    运行结果:

     

     

     

     

     

     

     

     

    展开全文
  • Matplotlib绘制动图

    千次阅读 2020-09-21 16:13:22
    介绍如何使用Matplotlib绘制动态图。

    简介

    Matplotlib是非常著名的Python绘图库,支持非常复杂的底层定制化操作。本文通过Matplotlib中的动画绘制工具来讲解如何绘制动态图,首先讲解通过交互模式如何显示动态图,继而讲解通过两个动画类来实现动图地保存(GIF格式)。

    显示动态图

    首先,需要明确,Matplotlib绘图有两种显示模式,分别为阻塞模式交互模式,他们具体的说明如下。

    1. 阻塞模式,该模式下绘制地图地显示必须使用plt.show()进行展示(默认会弹出一个窗口),代码会运行到该行阻塞不继续执行,直到关闭这个展示(默认是关闭弹出的显示窗口,Pycharm等集成开发环境会自动捕获图片然后跳过阻塞)。
    2. 交互模式,该模式下任何绘图相关的操作如plt.plot()会立即显示绘制的图形然后迅速关闭,继续代码的运行,不发生阻塞。

    默认情况下,Matplotlib使用阻塞模式,要想打开交互模式需要通过下面的几个函数来做操作,下面直接列出要用的核心函数。

    plt.ion()  # 打开交互模式
    plt.ioff()  # 关闭交互模式
    plt.clf()  # 清除当前的Figure对象
    plt.pause()  # 暂停GUI功能多少秒
    

    然后就是要清楚,所谓的动图或者视频是怎么做到的,其实它们本质上就是很多静态图以较快的速度连续播放从而给人一种动感,利用Matplotlib绘制动图的原理也是一样的,遵循画布绘图->清理画布->画布绘图的循环就行了,不过这里注意,由于交互模式下绘图都是一闪而过,因此通过plt.pause(n)暂停GUI显示n秒才能得到连续有显示的图像

    import matplotlib.pyplot as plt
    import numpy as np
    
    
    def io_test():
        fig = plt.figure()  # 生成画布
        plt.ion()  # 打开交互模式
        for index in range(50):
            fig.clf()  # 清空当前Figure对象
            fig.suptitle("3d io pic")
    
            # 生成数据
            point_count = 100  # 随机生成100个点
            x = np.random.random(point_count)
            y = np.random.random(point_count)
            z = np.random.random(point_count)
            color = np.random.random(point_count)
            scale = np.random.random(point_count) * 100
            ax = fig.add_subplot(111, projection="3d")
            # 绘图
            ax.scatter3D(x, y, z, s=scale, c=color, marker="o")
            ax.set_xlabel("X")
            ax.set_ylabel("Y")
            ax.set_zlabel("Z")
            # 暂停
            plt.pause(0.2)
    
        # 关闭交互模式
        plt.ioff()
    
        plt.show()
    
    
    if __name__ == '__main__':
        io_test()
    

    上述代码演示了三维空间如何动态显示100个随机点的变化,使用录制软件得到的动图如下,其本质就是不停显示不同的图像而已。

    在这里插入图片描述

    动图保存

    很多时候我们的需求并不是在窗口中动态显示图像,还需要保存到本地GIF图像,显然使用录制工具是一个比较低效的用法,Matplotlib的animation模块提供了两个动画绘制接口,分别是FuncAnimationArtistAnimation,它们都是继承自TimedAnimation的类,因而也具有Animation对象的通用方法,如Animation.save()Animation.to_html5_video()两个方法实例化一个Animation对象后均可调用,前者表示将动画保存为一个图像,后者表示将动画表示为一个HTML视频。

    • FuncAnimation: 通过反复调用同一更新函数来制作动画。
    • ArtistAnimation: 通过调用一个固定的Artist对象来制作动画,例如给定的图片序列或者Matplotlib的绘图对象。

    下面给出上述两个类的构造函数所需参数,它们的主要参数也是类似的,都是一个Figure对象作为画布,然后一个对象作为更新的实现方式(前者需要一个反复绘图的更新函数,后者则为一个图像列表或者绘图对象列表)。

    ani = animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)
    ani = animation.ArtistAnimation(fig, artists, *args, **kwargs)
    

    相比较而言,我更喜欢使用FuncAnimation,它的使用要求简洁且定制化程度较高。但是如果想将很多图片合并为一个动图,那么ArtistAnimation是最合适的选择。

    下面的代码演示了如何保存一个动态变化渲染的柱状图,ArtistAnimation传入了一个图像序列,序列中每个元素为绘制的柱状图。然后通过使用Animationsave方法保存了动态图,**需要注意的是,这里有个动画写入器(writer)可以选择,默认不是pillow,我个人觉得pillow安装简单一些。

    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    
    fig, ax = plt.subplots()
    x, y, tmp = [], [], []
    
    for i in range(10):
        x.append(i)
        y.append(i+1)
        temp = ax.bar(x, height=y, width=0.3)
        tmp.append(temp)
    
    ani = animation.ArtistAnimation(fig, tmp, interval=200, repeat_delay=1000)
    ani.save("bar.gif", writer='pillow')
    

    上面代码的执行结果如下图。

    在这里插入图片描述

    接着,演示使用范围更广的FuncAnimation如何使用。下面的代码中,动态展示了梯度下降在三维图上的优化过程,其中最为核心的代码如下。用于构造Animation对象的除了画布就是一个更新函数,在这个更新函数内部多次绘制散点图从而形成动态效果, frames是帧数,如果设置了这个帧数,那么update函数第一个参数必须有一个num占位,这个numAnimation对象维护,每次内部执行update会自动递增,后面的参数列表fargs只需要传入除了num后面的参数即可。

    def update(num, x, y, z, ax):
        x, y, z = x[:num], y[:num], z[:num]
        ax.scatter3D(x, y, z, color='black', s=100)
        return ax
    
    ani = animation.FuncAnimation(fig, update, frames=25, fargs=(x_list, y_list, z_list, ax3d), interval=50, blit=False)
    

    上面的代码演示效果如下图,完整的代码附在文末补充说明中。

    在这里插入图片描述

    补充说明

    本文介绍了如何使用Matplotlib绘制动态图,主要通过交互模式和animation模块进行,如果觉得有所帮助,欢迎点赞。

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.animation as animation
    
    
    def GD(x0, y0, lr, epoch):
        f = lambda x, y: x ** 2 - y ** 2
        g_x = lambda x: 2 * x
        x, y = x0, y0
        x_list, y_list, z_list = [], [], []
        for i in range(epoch):
            x_list.append(x)
            y_list.append(y)
            z_list.append(f(x, y) * 1.01)
    
            grad_x, grad_y = g_x(x), g_x(y)
            x -= lr * grad_x
            y -= lr * grad_y
            print("Epoch{}: grad={} {}, x={}".format(i, grad_x, grad_y, x))
            if abs(grad_x) < 1e-6 and abs(grad_y) < 1e-6:
                break
        return x_list, y_list, z_list
    
    
    def update(num, x, y, z, ax):
        x, y, z = x[:num], y[:num], z[:num]
        ax.scatter3D(x, y, z, color='black', s=100)
        return ax
    
    
    def draw_gd():
        fig = plt.figure()
        x, y = np.meshgrid(np.linspace(-3, 3, 1000), np.linspace(-3, 3, 1000))
        z = x ** 2 - y ** 2
        ax3d = plt.gca(projection='3d')
        ax3d.set_xlabel("X")
        ax3d.set_ylabel("Y")
        ax3d.set_zlabel("Z")
        plt.tick_params(labelsize=10)
        ax3d.plot_surface(x, y, z, cstride=20, rstride=20, cmap="jet")
    
        x_list, y_list, z_list = GD(-3, 0, 0.01, 100)
        x_list, y_list, z_list = np.array(x_list), np.array(y_list), np.array(z_list)
    
        ani = animation.FuncAnimation(fig, update, frames=25, fargs=(x_list, y_list, z_list, ax3d), interval=50, blit=False)
        ani.save('test.gif')
    
    
    if __name__ == '__main__':
        draw_gd()
    
    展开全文
  • Qt下绘制PPI扫描的雷达图

    千次阅读 2019-10-23 10:47:08
    简述 PPI扫描,即每次按一个仰角进行扫描,得到二维图像的方式。它的特点是来自不同...Qt可以用OpenGL绘制复杂的图像,但为了简单和兼容性,这里介绍的是用Qt自己的绘图工具QPainter绘制PPI二维图像。 代码之路 ...
  • PhotoShop绘制原画讲解

    千次阅读 2016-08-14 19:03:00
    还有很多不懂希望有这方面经验的朋友可以提供一些经验和素材 今天对于游戏原画绘制进行了一些了解,并切自己动手用Photoshop绘制了一些,因为没有笔触板,纯鼠标绘制,线条的流场图不能保证,不过重要的还是学习如何...
  • 第二章 绘制与编辑对象 Flash新增功能 合并绘制模式 重叠绘制图形时图形会自动进行合并 填充色相同的融合一起产生相加效果 填充色不同的部分产生减切效果 对象绘制模式 制作成独立的对象不会自动合并 第一节 绘图...
  • Q:CAD中如何将绘制的线组成一个封闭的边框? A:1.首先将电脑的输入法调成英文模式; 2.命令栏中输入“PE”; 3.然后选择你要封闭图形的一条边(首先这这个图形是能够封闭的图形),点击鼠标右键,选择合并...
  • PHP 并不仅限于创建 HTML 输出, ... 要想 PHP 中使用图像处理功能,你需要连带 GD 库一起来编译 PHP。 GD 库和 PHP 可能需要其他的库, 这取决于你要处理的图像格式。 你可以使用 PHP 中的图像函数来获取下列格式
  • . . . . doc. . PAGE / NUMPAGES doc. . . .... Flash动画制作期末模拟试题 一单项选择题每小题2分共40分 如图所示要创建冰雕旋转并逐渐消失的动画应该使用动画...图 缩放 旋转 扭曲 封套 在合并绘制模式下绘制了如左图所
  • 安卓屏幕图层绘制

    千次阅读 2018-06-23 17:29:49
    Android系统中的所有UI类都是建立View和ViewGroup这两个类的基础上的。所有View的子类成为”Widget”,所有ViewGroup的子类成为”Layout”。View和ViewGroup之间采用了组合设计模式,可以使得“部分-整体”同等...
  • Android绘制优化(二)布局优化

    千次阅读 2017-03-27 11:18:05
    我们知道一个界面的测量和绘制是通过递归来完成的,减少布局的层数就会减少测量和绘制的时间,从而性能就会得到提升。当然这只是布局优化的一方面,那么如何来进行布局的分析和优化呢?本篇文章会给你一个满意的答案...
  • Flutter 绘制Paint

    千次阅读 2019-08-31 10:40:17
    Flutter 的绘制主要涉及两个Widget: CustomPainter, CustomPaint CustomPainter:提供画布的...它的绘制children之前。如果设置了children,该painter绘制的内容会被覆盖。  b. foregroundPainter: 绘制...
  • PAGE PAGE 12 Flash动画制作综合模拟习题及解答2015秋 一单项选择题 如图所示要创建冰雕...缩放 B旋转 C扭曲 D封套 在合并绘制模式下绘制了如左图所示的一个椭圆下面哪种操作可以椭圆图形变成右边图形的效果A 选择菜单
  • PAGE 1 Flash动画制作模拟题2 一单项选择题 ...图 缩放 旋转 扭曲 封套 在合并绘制模式下绘制了如左图所示的一个椭圆下面哪种操作可以椭圆图形变成右边图形的效果 选择菜单栏的修改/修改/柔化填充边缘然后使用选择工具
  • Flash 动画制作综合模拟习题及解答 2015 秋 一单项选择题 1. 如图所示要创建冰雕旋转并逐渐... 缩放 B旋转 C扭曲 D封套 在合并绘制模式下绘制了如左图所示的一个椭圆下面哪种操作可以椭圆图形变成右边图形的效果 A 选
  • Flash 动画制作综合模拟习题及解答 2015 秋 一单项选择题 1. 如图所示要创建冰雕旋转并逐渐消失的动画应该使用动画的哪种类型 A 图 A.... 在合并绘制模式下绘制了如左图所示的一个椭圆下面哪种操作可
  • Flash 动画制作综合模拟习题及解答 2015 秋 一单项选择题 1. 如图所示要创建冰雕旋转并逐渐消失的动画应该使用动画的哪种类型 A 图 A.... 在合并绘制模式下绘制了如左图所示的一个椭圆下面哪种操作可
  • Chromium网页Layer Tree绘制过程分析

    万次阅读 热门讨论 2016-04-25 00:59:57
    网页绘图表面创建完成之后,调度器就会请求绘制CC Layer Tree,这样网页加载完成之后就能快速显示出来。通过CC Layer Tree可以依次找到Graphics Layer Tree、Render Layer Tree和Render Object Tree。有了Render ...
  • D3D的绘制函数总结

    千次阅读 2015-07-19 23:37:10
    动态顶点缓冲的推荐使用模式是一个可以合并Batch的模式,即不断地填充顶点数据,但不立刻绘制缓冲填满时才提交绘制一次,当然能合并的前提是各个batch都使用相同的设备状态,即纹理、材质、RenderStates、变换...
  • Android性能优化--过度绘制

    千次阅读 2017-05-12 17:58:18
    渲染机制前提知识android 的渲染主要分为两个组件:1.CPU 2.GPU,由这两者共同完成屏幕上绘制 。 CPU:中央处理器,它集成了运算,缓冲,控制等单元,包括绘图功能.CPU将对象处理为多维图形,纹理(Bitmaps、Drawables等...
  • PS实现时钟绘制

    千次阅读 2019-10-20 17:38:54
    秒针和定时针在绘制时需要进行形状调节。使用圆角矩形工具,绘制好秒针使用的圆角矩形后,选择直接选择工具,拖动锚点,即可调节圆角矩形形状,成功get秒针和定时针。 时针和分针上的黄色形状,为了效果...
  • libgdx 绘制图像

    千次阅读 2012-05-03 16:11:27
    Drawing images(绘制图像) 一张从它最初的格式(eg,PNG)被解码然后上传到图形处理器的图片被叫做纹理。 ...实际绘图中,首先纹理是有边界的,那么几何图形用OpenGL来绘制。由2者确认纹理屏幕
  • unity 多重纹理 绘制 shader处理

    千次阅读 2016-07-13 11:40:43
    最近想把多个mesh上的纹理的绘制合并到一个mesh上,处理shader时遇到了问题 使用纹理渲染模式公式实现正常的纹理叠加效果(SrcAlpha OneMinusSrcAlpha)并不能得到正常的效果  公式为 Factor = SrcTextureA_...
  • Android开发者选项之GPU过度绘制
  • 本文描述了Cocoa中设计模式的主要实现,主要关注模型(Model) - 视图(View) - 控制器(Controller)和对象建模。 本章的主要目的是让您更深入地了解Cocoa的设计模式,并鼓励您自己的软件项目中利用这些模式
  • 组合图像 版本 0.1.0 将图像与画布合并 更改日志 ... 如果指定负值,则在绘制时将水平翻转图像。 sHeight - 要绘制到目标上下文中的源图像子矩形的高度。 如果指定负值,则在绘制时将垂直翻转图像。 dx
  • 怎么用ZBrush绘制套索与曲线遮罩

    千次阅读 2017-03-03 10:18:08
    承接ZBrush正圆与正方形遮罩的绘制的内容,下面我们来学习剩下的两种遮罩绘制模式——套索遮罩与曲线遮罩。
  • R绘制热图

    万次阅读 2017-07-06 08:40:44
    我们还提供了Bash的封装,不修改R脚本的情况,改变参数绘制出不同的图形。 生成测试数据 绘图首先需要数据。通过生成一堆的向量,转换为矩阵,得到想要的数据。 data ( 1 : 6 , 6 : 1 , 6 : 1 , 1 ...
  • OSG可绘制体Drawable

    千次阅读 2017-09-29 19:22:29
    osg中可绘制体对象

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,981
精华内容 11,192
关键字:

在合并绘制模式下