| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037 |
- <!DOCTYPE html>
- <!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
- <!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
- <head>
- <meta charset="utf-8">
-
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
- <title>CBD.realtime.plotting — CBD Simulation Development Kit documentation</title>
-
-
-
-
-
-
-
-
-
-
- <link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
- <!-- <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" /> -->
- <link rel="stylesheet" href="../../../_static/style.css" type="text/css" />
- <link rel="index" title="Index" href="../../../genindex.html" />
- <link rel="search" title="Search" href="../../../search.html" />
-
- <script async src="https://www.googletagmanager.com/gtag/js?id=UA-167094275-1"></script>
- <script src="../../../_static/js/googleanalytics.min.js"></script>
-
- <script src="../../../_static/js/modernizr.min.js"></script>
- <!-- Preload the theme fonts -->
- <link rel="preload" href="../../../_static/fonts/FreightSans/freight-sans-book.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="../../../_static/fonts/FreightSans/freight-sans-medium.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="../../../_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="../../../_static/fonts/FreightSans/freight-sans-bold.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="../../../_static/fonts/FreightSans/freight-sans-medium-italic.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="../../../_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <!-- Preload the katex fonts -->
- <link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Math-Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Main-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Main-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size1-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size4-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size2-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size3-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- <link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Caligraphic-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
- </head>
- <div class="container-fluid header-holder tutorials-header" id="header-holder">
- <div class="container">
- <div class="header-container">
- <a class="header-logo" href="https://catalyst-team.com/" aria-label="Catalyst"></a>
- <div class="main-menu">
- <ul>
- <li>
- <div class="ecosystem-dropdown">
- <a id="dropdownMenuButtonEcosystem" data-toggle="ecosystem-dropdown">
- Ecosystem
- </a>
- <div class="ecosystem-dropdown-menu">
- <a class="nav-dropdown-item" href="https://alchemy.host">
- <span class=dropdown-title>Alchemy</span>
- <p>Experiments logging & visualization</p>
- </a>
- <a class="nav-dropdown-item" href="https://github.com/catalyst-team/catalyst">
- <span class=dropdown-title>Catalyst</span>
- <p>Accelerated deep learning R&D</p>
- </a>
- <a class="nav-dropdown-item" href="https://github.com/catalyst-team/reaction">
- <span class=dropdown-title>Reaction</span>
- <p>Convenient deep learning models serving</p>
- </a>
- </div>
- </div>
- </li>
- <li>
- <div class="projects-dropdown">
- <a id="dropdownMenuButtonProjects" data-toggle="projects-dropdown">
- Projects
- </a>
- <div class="projects-dropdown-menu">
- <a class="nav-dropdown-item" href="https://github.com/catalyst-team/codestyle">
- <span class=dropdown-title>Codestyle</span>
- <p>Joint R&D codestyle</p>
- </a>
- <a class="nav-dropdown-item" href="https://github.com/catalyst-team/neuro">
- <span class=dropdown-title>Catalyst.Neuro</span>
- <p>Catalyst.Team and TReNDS collaborative project</p>
- </a>
- <a class="nav-dropdown-item" href="https://github.com/catalyst-team/classification">
- <span class=dropdown-title>Classification</span>
- <p>Image classification pipeline with transfer learning</p>
- </a>
- <a class="nav-dropdown-item" href="https://github.com/catalyst-team/detection">
- <span class=dropdown-title>Detection</span>
- <p>Object detection pipeline</p>
- </a>
- <a class="nav-dropdown-item" href="https://github.com/catalyst-team/segmentation">
- <span class=dropdown-title>Segmentation</span>
- <p>Image semantic segmentation pipeline</p>
- </a>
- <a class="nav-dropdown-item" href="https://github.com/catalyst-team/gan">
- <span class=dropdown-title>Catalyst.GAN</span>
- <p>GAN pipelines</p>
- </a>
- </div>
- </div>
- </li>
- <li>
- <a href="https://github.com/catalyst-team/dl-course">Deep learning course</a>
- </li>
- </ul>
- </div>
- <a class="main-menu-open-button" href="#" data-behavior="open-mobile-menu"></a>
- </div>
- </div>
- </div>
- <body class="catalyst-body">
-
-
- <div class="table-of-contents-link-wrapper">
- <span>Table of Contents</span>
- <a href="#" class="toggle-table-of-contents" data-behavior="toggle-table-of-contents"></a>
- </div>
- <nav data-toggle="wy-nav-shift" class="catalyst-left-menu" id="catalyst-left-menu">
- <div class="catalyst-side-scroll">
- <div class="catalyst-menu catalyst-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
- <div class="catalyst-left-menu-search">
-
-
-
-
-
-
-
- <div role="search">
- <form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
- <input type="text" name="q" placeholder="Search Docs" />
- <input type="hidden" name="check_keywords" value="yes" />
- <input type="hidden" name="area" value="default" />
- </form>
- </div>
-
- </div>
-
-
-
-
-
-
- <ul>
- <li class="toctree-l1"><a class="reference internal" href="../../../CBD.html">CBD package</a></li>
- </ul>
-
-
- </div>
- </div>
- </nav>
- <div class="catalyst-container">
- <div class="catalyst-page-level-bar" id="catalyst-page-level-bar">
- <div class="catalyst-breadcrumbs-wrapper">
-
- <div role="navigation" aria-label="breadcrumbs navigation">
- <ul class="catalyst-breadcrumbs">
-
- <li>
- <a href="../../../index.html">
-
- Docs
-
- </a> >
- </li>
-
- <li><a href="../../index.html">Module code</a> ></li>
-
- <li>CBD.realtime.plotting</li>
-
-
- <li class="catalyst-breadcrumbs-aside">
-
- </li>
-
- </ul>
-
- </div>
- </div>
- <div class="catalyst-shortcuts-wrapper" id="catalyst-shortcuts-wrapper">
- Shortcuts
- </div>
- </div>
- <section data-toggle="wy-nav-shift" id="catalyst-content-wrap" class="catalyst-content-wrap">
- <div class="catalyst-content-left">
-
- <div class="rst-content">
-
- <div role="main" class="main-content" itemscope="itemscope" itemtype="http://schema.org/Article">
- <article itemprop="articleBody" id="catalyst-article" class="catalyst-article">
-
- <h1>Source code for CBD.realtime.plotting</h1><div class="highlight"><pre>
- <span></span>
- <span class="k">try</span><span class="p">:</span>
- <span class="kn">import</span> <span class="nn">matplotlib.animation</span> <span class="k">as</span> <span class="nn">animation</span>
- <span class="n">_MPL_FOUND</span> <span class="o">=</span> <span class="kc">True</span>
- <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
- <span class="n">_MPL_FOUND</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="kn">import</span> <span class="n">curdoc</span>
- <span class="n">_BOKEH_FOUND</span> <span class="o">=</span> <span class="kc">True</span>
- <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
- <span class="n">_BOKEH_FOUND</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="c1"># TODO: Bokeh (see TODOs), GGplot, Seaborn</span>
- <span class="c1"># Note: Seaborn is built on top of matplotlib</span>
- <span class="c1"># TODO: Jupyter?</span>
- <div class="viewcode-block" id="Backend"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.Backend">[docs]</a><span class="k">class</span> <span class="nc">Backend</span><span class="p">:</span>
- <span class="sd">"""</span>
- <span class="sd"> In which framework the plots need to be made.</span>
- <span class="sd"> Note:</span>
- <span class="sd"> Some attributes won't be available if the corresponding framework is not installed.</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">_MPL_FOUND</span><span class="p">:</span>
- <span class="n">MPL</span> <span class="o">=</span> <span class="mi">1</span>
- <span class="sd">""" : : Use `Matplotlib <https://matplotlib.org/>`_."""</span>
- <span class="n">MATPLOTLIB</span> <span class="o">=</span> <span class="mi">1</span>
- <span class="sd">""" : : Use `Matplotlib <https://matplotlib.org/>`_."""</span>
- <span class="k">if</span> <span class="n">_BOKEH_FOUND</span><span class="p">:</span>
- <span class="n">BOKEH</span> <span class="o">=</span> <span class="mi">2</span>
- <span class="sd">"""</span>
- <span class="sd"> : : Use `Bokeh <//docs.bokeh.org/en/latest/index.html>`_.</span>
- <span class="sd"> </span>
- <span class="sd"> Important:</span>
- <span class="sd"> For :code:`BOKEH`, a server must be started with:</span>
- <span class="sd"> </span>
- <span class="sd"> .. code-block:: bash</span>
- <span class="sd"> </span>
- <span class="sd"> bokeh serve</span>
- <span class="sd"> </span>
- <span class="sd"> |</span>
- <span class="sd"> </span>
- <span class="sd"> Attention:</span>
- <span class="sd"> This backend is still in beta.</span>
- <span class="sd"> """</span>
- <div class="viewcode-block" id="Backend.exists"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.Backend.exists">[docs]</a> <span class="nd">@staticmethod</span>
- <span class="k">def</span> <span class="nf">exists</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Checks that a given backend exists.</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="n">value</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">getattr</span><span class="p">(</span><span class="n">Backend</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">Backend</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">x</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"_"</span><span class="p">)</span> <span class="ow">and</span> \
- <span class="ow">not</span> <span class="n">callable</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">Backend</span><span class="p">,</span> <span class="n">x</span><span class="p">))]</span></div></div>
- <div class="viewcode-block" id="PlotHandler"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotHandler">[docs]</a><span class="k">class</span> <span class="nc">PlotHandler</span><span class="p">:</span>
- <span class="sd">"""</span>
- <span class="sd"> Handles Real-Time plotting, independent of a plotting framework.</span>
- <span class="sd"> Every :code:`interval` time, data will be polled from the :code:`object`,</span>
- <span class="sd"> w.r.t. the given plotting :code:`backend`. The handler will use the knowledge</span>
- <span class="sd"> of a backend to determine how the given :code:`figure` must be updated.</span>
- <span class="sd"> This class can be used in any simulation context, where plotting data can be</span>
- <span class="sd"> polled from an object or a resource.</span>
- <span class="sd"> Note:</span>
- <span class="sd"> While technically framework-independent, matplotlib has the least external</span>
- <span class="sd"> overhead in your code.</span>
- <span class="sd"> Tip:</span>
- <span class="sd"> When using multiple plots/plotting instances, you should make use of the</span>
- <span class="sd"> :class:`PlotManager`.</span>
- <span class="sd"> Warning:</span>
- <span class="sd"> Bokeh is still in beta. Not all features will work as required.</span>
- <span class="sd"> Raises:</span>
- <span class="sd"> AssertionError: if the backend cannot be located.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> object (Any): The object from which data needs to be polled. By default,</span>
- <span class="sd"> the :code:`data_xy` attribute will be used on the object,</span>
- <span class="sd"> which should result in a 2xN array in the form of</span>
- <span class="sd"> :code:`([x1, x2, x3...], [y1, y2, y3...])`. Change this</span>
- <span class="sd"> behaviour with the :func:`set_data_getter` function.</span>
- <span class="sd"> figure: The figure object required for plotting. This has been made</span>
- <span class="sd"> externally to allow for full manipulation of the plotting</span>
- <span class="sd"> framework itself. The following explains the axxepted data</span>
- <span class="sd"> types:</span>
- <span class="sd"> - **matplotlib:** Tuple (pair) of :code:`(Figure, Axes)`</span>
- <span class="sd"> - **bokeh:** :code:`Figure`</span>
- <span class="sd"> kind (PlotKind): What needs to be plotted. See :class:`PlotKind` for more</span>
- <span class="sd"> info.</span>
- <span class="sd"> interval (int): Amount of milliseconds between plot refreshes.</span>
- <span class="sd"> backend (Backend): The backend to use for plotting. Defaults to</span>
- <span class="sd"> :attr:`Backend.MPL` (= matplotlib).</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> - :class:`Backend`</span>
- <span class="sd"> - :class:`PlotKind`</span>
- <span class="sd"> - :class:`PlotManager`</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">object</span><span class="p">,</span> <span class="n">figure</span><span class="p">,</span> <span class="n">kind</span><span class="p">,</span> <span class="n">interval</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">backend</span><span class="o">=</span><span class="n">Backend</span><span class="o">.</span><span class="n">MPL</span><span class="p">):</span>
- <span class="k">assert</span> <span class="n">Backend</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">backend</span><span class="p">),</span> <span class="s2">"Invalid backend."</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">object</span> <span class="o">=</span> <span class="nb">object</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">kind</span> <span class="o">=</span> <span class="n">kind</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">figure</span> <span class="o">=</span> <span class="n">figure</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">kind</span><span class="o">.</span><span class="n">_backend</span> <span class="o">=</span> <span class="n">backend</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">elm</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">kind</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">figure</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__opened</span> <span class="o">=</span> <span class="kc">True</span>
- <span class="c1"># obtaining information</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__get_data</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">obj</span><span class="p">:</span> <span class="n">obj</span><span class="o">.</span><span class="n">data_xy</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__events</span> <span class="o">=</span> <span class="p">{</span>
- <span class="s2">"update_event"</span><span class="p">:</span> <span class="p">[],</span>
- <span class="s2">"close_event"</span><span class="p">:</span> <span class="p">[]</span>
- <span class="p">}</span>
- <span class="c1"># backend info:</span>
- <span class="k">if</span> <span class="n">backend</span> <span class="o">==</span> <span class="n">Backend</span><span class="o">.</span><span class="n">MPL</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__ani</span> <span class="o">=</span> <span class="n">animation</span><span class="o">.</span><span class="n">FuncAnimation</span><span class="p">(</span><span class="n">figure</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="k">lambda</span> <span class="n">_</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(),</span> <span class="n">interval</span><span class="o">=</span><span class="n">interval</span><span class="p">)</span>
- <span class="n">figure</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">canvas</span><span class="o">.</span><span class="n">mpl_connect</span><span class="p">(</span><span class="s1">'close_event'</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">evt</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">__close_event</span><span class="p">())</span>
- <span class="k">elif</span> <span class="n">backend</span> <span class="o">==</span> <span class="n">Backend</span><span class="o">.</span><span class="n">BOKEH</span><span class="p">:</span>
- <span class="n">curdoc</span><span class="p">()</span><span class="o">.</span><span class="n">add_periodic_callback</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(),</span> <span class="n">interval</span><span class="p">)</span>
- <span class="c1"># TODO (is this even possible?):</span>
- <span class="n">curdoc</span><span class="p">()</span><span class="o">.</span><span class="n">on_session_destroyed</span><span class="p">(</span><span class="k">lambda</span> <span class="n">ctx</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">close_event</span><span class="p">())</span>
- <div class="viewcode-block" id="PlotHandler.signal"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotHandler.signal">[docs]</a> <span class="k">def</span> <span class="nf">signal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Raise a signal with a specific name and arguments.</span>
- <span class="sd"> The accepted signals are:</span>
- <span class="sd"> - :code:`update_event(data)`: Raised whenever the plot updates. It takes the</span>
- <span class="sd"> new plot data that has been polled.</span>
- <span class="sd"> - :code:`close_event`: Raised whenever the plot closes. No additional arguments</span>
- <span class="sd"> are associated with this event.</span>
- <span class="sd"> Note:</span>
- <span class="sd"> Normally, users do not need to call this function.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> name (str): The name of the signal to raise.</span>
- <span class="sd"> *args: Additional arguments to pass to the connected events.</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> - :func:`PlotHandler.connect`</span>
- <span class="sd"> - :func:`PlotManager.connect`</span>
- <span class="sd"> - :func:`follow`</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Invalid signal '</span><span class="si">%s</span><span class="s2">' in PlotHandler."</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">evt</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">[</span><span class="n">name</span><span class="p">]:</span>
- <span class="n">evt</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span></div>
- <div class="viewcode-block" id="PlotHandler.connect"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotHandler.connect">[docs]</a> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">function</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Connect an event with an additional function.</span>
- <span class="sd"> Useful for e.g. updating the plot axes w.r.t. the data.</span>
- <span class="sd"> The functions will be called in the order they were connected to the</span>
- <span class="sd"> events, with the associated arguments. The accepted signals are:</span>
- <span class="sd"> - :code:`update_event(data)`: Raised whenever the plot updates. It takes the</span>
- <span class="sd"> new plot data that has been polled.</span>
- <span class="sd"> - :code:`close_event`: Raised whenever the plot closes. No additional arguments</span>
- <span class="sd"> are associated with this event.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> name (str): The name of the signal to raise.</span>
- <span class="sd"> function: A function that will be called with the optional arguments</span>
- <span class="sd"> whenever the event is raised.</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> - :func:`PlotHandler.signal`</span>
- <span class="sd"> - :func:`PlotManager.connect`</span>
- <span class="sd"> - :func:`follow`</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Invalid signal '</span><span class="si">%s</span><span class="s2">' in PlotHandler."</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__events</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">function</span><span class="p">)</span></div>
- <div class="viewcode-block" id="PlotHandler.set_data_getter"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotHandler.set_data_getter">[docs]</a> <span class="k">def</span> <span class="nf">set_data_getter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">function</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Sets the data getter function call. By default, the :code:`data_xy` attribute</span>
- <span class="sd"> is polled, but this function provides the flexibility to alter this behaviour.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> function: The function to obtain the data. Takes the :code:`object` as an</span>
- <span class="sd"> input and should return a 2xN array in the form of</span>
- <span class="sd"> :code:`([x1, x2, x3...], [y1, y2, y3...])`.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__get_data</span> <span class="o">=</span> <span class="n">function</span></div>
- <div class="viewcode-block" id="PlotHandler.get_data"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotHandler.get_data">[docs]</a> <span class="k">def</span> <span class="nf">get_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Actually gets the data from the object.</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__get_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">object</span><span class="p">)</span></div>
- <div class="viewcode-block" id="PlotHandler.close_plot"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotHandler.close_plot">[docs]</a> <span class="k">def</span> <span class="nf">close_plot</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Closes the plot/figure associated with this handler.</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> :func:`PlotHandler.close_event`</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">kind</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">MPL</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">figure</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">kind</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">BOKEH</span><span class="p">):</span>
- <span class="c1"># TODO</span>
- <span class="k">pass</span></div>
- <div class="viewcode-block" id="PlotHandler.close_event"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotHandler.close_event">[docs]</a> <span class="k">def</span> <span class="nf">close_event</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Closes the plots and raises the `close_event` signal.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">close_plot</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__close_event</span><span class="p">()</span></div>
- <span class="k">def</span> <span class="nf">__close_event</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Raises the `close_event` signal.</span>
- <span class="sd"> Note:</span>
- <span class="sd"> This function is only used in the backend to prevent double</span>
- <span class="sd"> closing of the plots.</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__opened</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="s1">'close_event'</span><span class="p">)</span>
- <div class="viewcode-block" id="PlotHandler.is_opened"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotHandler.is_opened">[docs]</a> <span class="k">def</span> <span class="nf">is_opened</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Checks if the plots are still open.</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__opened</span></div>
- <div class="viewcode-block" id="PlotHandler.update"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotHandler.update">[docs]</a> <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Updates the plot information.</span>
- <span class="sd"> """</span>
- <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_data</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">kind</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">elm</span><span class="p">,</span> <span class="o">*</span><span class="n">data</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="s1">'update_event'</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span></div></div>
- <div class="viewcode-block" id="follow"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.follow">[docs]</a><span class="k">def</span> <span class="nf">follow</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">lower_bound</span><span class="o">=-</span><span class="nb">float</span><span class="p">(</span><span class="s1">'inf'</span><span class="p">),</span> <span class="n">upper_bound</span><span class="o">=</span><span class="nb">float</span><span class="p">(</span><span class="s1">'inf'</span><span class="p">),</span> <span class="n">perc_keep</span><span class="o">=</span><span class="mf">0.5</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Compute the new limits for the given dataset if the last data point must be followed.</span>
- <span class="sd"> This is a convenience function for updating the plotting axes' limits. Whenever not</span>
- <span class="sd"> enough data is available, the axis won't scale down.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> data (list): The data that must be plotted on the axes. Can be a</span>
- <span class="sd"> shortened version of only the final n values (n > 0).</span>
- <span class="sd"> size (float): The total size of the axis to show, even if the data</span>
- <span class="sd"> did not get there.</span>
- <span class="sd"> lower_bound (float): The lower bound of the axis, i.e. the minimal value to</span>
- <span class="sd"> show, even if the data lies outside of this interval.</span>
- <span class="sd"> Defaults to :code:`-float('inf')` (-infinity = no limit).</span>
- <span class="sd"> upper_bound (float): The upper bound of the axis, i.e. the maximal value to</span>
- <span class="sd"> show, even if the data lies outside of this interval.</span>
- <span class="sd"> Defaults to :code:`float('inf')` (infinity = no limit).</span>
- <span class="sd"> perc_keep (float): The percentage at which the final data point must be</span>
- <span class="sd"> shown. When :code:`0.0`, this point is the lowest value</span>
- <span class="sd"> shown. When :code:`1.0`, this point is the highest value</span>
- <span class="sd"> shown. Use this value to change how "centered" the last</span>
- <span class="sd"> datapoint will be. When the axis grows in a positive</span>
- <span class="sd"> direction, a value of :code:`0.0` will never show the</span>
- <span class="sd"> data. When growing negatively, the opposite is true:</span>
- <span class="sd"> the data will not be shown for a value of :code:`1.0`.</span>
- <span class="sd"> Defaults to :code:`0.5` (= the middle).</span>
- <span class="sd"> Danger:</span>
- <span class="sd"> * The lower bound must be strictly smaller than the upper bound.</span>
- <span class="sd"> * The size cannot be larger than the distance between the bounds.</span>
- <span class="sd"> Examples:</span>
- <span class="sd"> - Follow a sine wave in the positive-x direction, always keeping a width of 10, in matplotlib.</span>
- <span class="sd"> .. code-block:: python</span>
- <span class="sd"> manager = PlotManager()</span>
- <span class="sd"> manager.register("sin", cbd.findBlock("plot")[0], (fig, ax), LinePlot())</span>
- <span class="sd"> manager.connect('sin', 'update_event', lambda d, a=ax: a.set_xlim(follow(d[0], 10.0, lower_bound=0.0)))</span>
- <span class="sd"> - Follow a sine wave in the negative-x direction, always keeping a width of 10, in matplotlib.</span>
- <span class="sd"> .. code-block:: python</span>
- <span class="sd"> manager = PlotManager()</span>
- <span class="sd"> manager.register("sin", cbd.findBlock("plot")[0], (fig, ax), LinePlot())</span>
- <span class="sd"> manager.connect('sin', 'update_event', lambda d, a=ax: a.set_xlim(follow(d[0], 10.0, upper_bound=0.0)))</span>
- <span class="sd"> - Follow a positive sine-wave, but keep a 10% margin from the right edge of the plot, in matplotlib.</span>
- <span class="sd"> .. code-block:: python</span>
- <span class="sd"> manager = PlotManager()</span>
- <span class="sd"> manager.register("sin", cbd.findBlock("plot")[0], (fig, ax), LinePlot())</span>
- <span class="sd"> manager.connect('sin', 'update_event', lambda d, a=ax: a.set_xlim(follow(d[0], 10.0, 0.0, perc_keep=0.9)))</span>
- <span class="sd"> """</span>
- <span class="k">assert</span> <span class="n">lower_bound</span> <span class="o"><</span> <span class="n">upper_bound</span><span class="p">,</span> <span class="s2">"Lower bound must be strictly smaller than the upper bound."</span>
- <span class="k">assert</span> <span class="n">upper_bound</span> <span class="o">-</span> <span class="n">lower_bound</span> <span class="o">>=</span> <span class="n">size</span><span class="p">,</span> <span class="s2">"Invalid size: outside bounds."</span>
- <span class="k">if</span> <span class="n">upper_bound</span> <span class="o">-</span> <span class="n">lower_bound</span> <span class="o">==</span> <span class="n">size</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">lower_bound</span><span class="p">,</span> <span class="n">upper_bound</span>
- <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
- <span class="k">return</span> <span class="o">-</span><span class="n">size</span> <span class="o">/</span> <span class="mf">2.0</span><span class="p">,</span> <span class="n">size</span> <span class="o">/</span> <span class="mf">2.0</span>
- <span class="n">value</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
- <span class="n">low</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">value</span> <span class="o">-</span> <span class="n">size</span> <span class="o">*</span> <span class="n">perc_keep</span><span class="p">,</span> <span class="n">lower_bound</span><span class="p">)</span>
- <span class="n">high</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">low</span> <span class="o">+</span> <span class="n">size</span><span class="p">,</span> <span class="n">upper_bound</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">high</span> <span class="o">==</span> <span class="n">upper_bound</span><span class="p">:</span>
- <span class="n">low</span> <span class="o">=</span> <span class="n">high</span> <span class="o">-</span> <span class="n">size</span>
- <span class="k">return</span> <span class="n">low</span><span class="p">,</span> <span class="n">high</span></div>
- <div class="viewcode-block" id="PlotKind"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotKind">[docs]</a><span class="k">class</span> <span class="nc">PlotKind</span><span class="p">:</span>
- <span class="sd">"""</span>
- <span class="sd"> The kind of plot that needs to be rendered. This class is an abstract superclass.</span>
- <span class="sd"> Not all backends provide the same functionality for plotting the same shape.</span>
- <span class="sd"> This class provides a wrapper around all those functionalities to allow for users</span>
- <span class="sd"> that they only need to change the figure information.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> *args: The arguments to add to the 'shape', excluding the data points.</span>
- <span class="sd"> **kwargs: The keyword arguments to add to the 'shape'.</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> - :class:`LinePlot`</span>
- <span class="sd"> - :class:`StepPlot`</span>
- <span class="sd"> - :class:`ScatterPlot`</span>
- <span class="sd"> - Information on the individual plot instances in the corresponding frameworks.</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_backend</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="n">args</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">=</span> <span class="n">kwargs</span>
- <div class="viewcode-block" id="PlotKind.is_backend"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotKind.is_backend">[docs]</a> <span class="k">def</span> <span class="nf">is_backend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">backend</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Checks the backend for the plot.</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_backend</span> <span class="o">==</span> <span class="n">backend</span></div>
- <div class="viewcode-block" id="PlotKind.create"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotKind.create">[docs]</a> <span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">figure</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Called when the figure is first created in the manager.</span>
- <span class="sd"> Returns:</span>
- <span class="sd"> The 'shape' information that is created on the plot.</span>
- <span class="sd"> """</span>
- <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
- <div class="viewcode-block" id="PlotKind.update"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotKind.update">[docs]</a> <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">element</span><span class="p">,</span> <span class="o">*</span><span class="n">data</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Called when the figure is updated in the manager.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> element: The shape that was returned from the :func:`PlotKind.create`</span>
- <span class="sd"> method.</span>
- <span class="sd"> *data: The data with which to update the plot.</span>
- <span class="sd"> """</span>
- <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div></div>
- <div class="viewcode-block" id="LinePlot"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.LinePlot">[docs]</a><span class="k">class</span> <span class="nc">LinePlot</span><span class="p">(</span><span class="n">PlotKind</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Draws a line between all given coordinates.</span>
- <span class="sd"> Backend Information:</span>
- <span class="sd"> - **matplotlib:** :func:`matplotlib.axes.Axes.plot`</span>
- <span class="sd"> - **bokeh:** :func:`bokeh.plotting.Figure.line`</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> - :class:`PlotKind`</span>
- <span class="sd"> - :class:`StepPlot`</span>
- <span class="sd"> - :class:`ScatterPlot`</span>
- <span class="sd"> """</span>
- <div class="viewcode-block" id="LinePlot.create"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.LinePlot.create">[docs]</a> <span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">figure</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">MPL</span><span class="p">):</span>
- <span class="c1"># matplotlib: figure[1] is the axis</span>
- <span class="n">line</span><span class="p">,</span> <span class="o">=</span> <span class="n">figure</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">plot</span><span class="p">([],</span> <span class="p">[],</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">line</span>
- <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">BOKEH</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">figure</span><span class="o">.</span><span class="n">line</span><span class="p">([],</span> <span class="p">[],</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span></div>
- <div class="viewcode-block" id="LinePlot.update"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.LinePlot.update">[docs]</a> <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">element</span><span class="p">,</span> <span class="o">*</span><span class="n">data</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">MPL</span><span class="p">):</span>
- <span class="n">element</span><span class="o">.</span><span class="n">set_data</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
- <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">BOKEH</span><span class="p">):</span>
- <span class="n">element</span><span class="o">.</span><span class="n">data_source</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">y</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span></div></div>
- <div class="viewcode-block" id="StepPlot"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.StepPlot">[docs]</a><span class="k">class</span> <span class="nc">StepPlot</span><span class="p">(</span><span class="n">PlotKind</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Draws a stepped line between all given coordinates.</span>
- <span class="sd"> See the corresponding backend information to change the step "levels".</span>
- <span class="sd"> Backend Information:</span>
- <span class="sd"> - **matplotlib:** :func:`matplotlib.axes.Axes.step`</span>
- <span class="sd"> - **bokeh:** :func:`bokeh.plotting.Figure.step`</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> - :class:`PlotKind`</span>
- <span class="sd"> - :class:`LinePlot`</span>
- <span class="sd"> - :class:`StepPlot`</span>
- <span class="sd"> """</span>
- <div class="viewcode-block" id="StepPlot.create"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.StepPlot.create">[docs]</a> <span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">figure</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">MPL</span><span class="p">):</span>
- <span class="c1"># matplotlib: figure[1] is the axis</span>
- <span class="n">line</span><span class="p">,</span> <span class="o">=</span> <span class="n">figure</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">step</span><span class="p">([],</span> <span class="p">[],</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">line</span>
- <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">BOKEH</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">figure</span><span class="o">.</span><span class="n">step</span><span class="p">([],</span> <span class="p">[],</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span></div>
- <div class="viewcode-block" id="StepPlot.update"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.StepPlot.update">[docs]</a> <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">element</span><span class="p">,</span> <span class="o">*</span><span class="n">data</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">MPL</span><span class="p">):</span>
- <span class="n">element</span><span class="o">.</span><span class="n">set_data</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
- <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">BOKEH</span><span class="p">):</span>
- <span class="n">element</span><span class="o">.</span><span class="n">data_source</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">y</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span></div></div>
- <div class="viewcode-block" id="ScatterPlot"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.ScatterPlot">[docs]</a><span class="k">class</span> <span class="nc">ScatterPlot</span><span class="p">(</span><span class="n">PlotKind</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Draws all given coordinates as points in a 2D space.</span>
- <span class="sd"> See the corresponding backend information to change the shape of the indicators.</span>
- <span class="sd"> Backend Information:</span>
- <span class="sd"> - **matplotlib:** :func:`matplotlib.axes.Axes.scatter`</span>
- <span class="sd"> - **bokeh:** :func:`bokeh.plotting.Figure.scatter`</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> - :class:`PlotKind`</span>
- <span class="sd"> - :class:`LinePlot`</span>
- <span class="sd"> - :class:`StepPlot`</span>
- <span class="sd"> """</span>
- <div class="viewcode-block" id="ScatterPlot.create"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.ScatterPlot.create">[docs]</a> <span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">figure</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">MPL</span><span class="p">):</span>
- <span class="c1"># matplotlib: figure[1] is the axis</span>
- <span class="n">pathc</span> <span class="o">=</span> <span class="n">figure</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">scatter</span><span class="p">([],</span> <span class="p">[],</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">pathc</span>
- <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">BOKEH</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">figure</span><span class="o">.</span><span class="n">scatter</span><span class="p">([],</span> <span class="p">[],</span> <span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span></div>
- <div class="viewcode-block" id="ScatterPlot.update"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.ScatterPlot.update">[docs]</a> <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">element</span><span class="p">,</span> <span class="o">*</span><span class="n">data</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">MPL</span><span class="p">):</span>
- <span class="n">element</span><span class="o">.</span><span class="n">set_offsets</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">data</span><span class="p">)))</span>
- <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_backend</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">BOKEH</span><span class="p">):</span>
- <span class="n">element</span><span class="o">.</span><span class="n">data_source</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">y</span><span class="o">=</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span></div></div>
- <div class="viewcode-block" id="PlotManager"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotManager">[docs]</a><span class="k">class</span> <span class="nc">PlotManager</span><span class="p">:</span>
- <span class="sd">"""</span>
- <span class="sd"> Manages multiple :class:`PlotHandler` instances.</span>
- <span class="sd"> Use this class as a centralized unit to manage one or more plots in the system.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> backend (Backend): The backend to use.</span>
- <span class="sd"> Raises:</span>
- <span class="sd"> AssertionError: if the backend cannot be located.</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> - :class:`Backend`</span>
- <span class="sd"> - :class:`PlotHandler`</span>
- <span class="sd"> """</span>
- <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">backend</span><span class="o">=</span><span class="n">Backend</span><span class="o">.</span><span class="n">MPL</span><span class="p">):</span>
- <span class="k">assert</span> <span class="n">Backend</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">backend</span><span class="p">),</span> <span class="s2">"Invalid backend."</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__handlers</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">backend</span> <span class="o">=</span> <span class="n">backend</span>
- <div class="viewcode-block" id="PlotManager.is_opened"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotManager.is_opened">[docs]</a> <span class="k">def</span> <span class="nf">is_opened</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Checks if there is at least a single plot left open.</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="nb">any</span><span class="p">([</span><span class="n">h</span><span class="o">.</span><span class="n">is_opened</span><span class="p">()</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__handlers</span><span class="o">.</span><span class="n">values</span><span class="p">()])</span></div>
- <div class="viewcode-block" id="PlotManager.all_opened"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotManager.all_opened">[docs]</a> <span class="k">def</span> <span class="nf">all_opened</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Checks if all plots are still open.</span>
- <span class="sd"> """</span>
- <span class="k">return</span> <span class="nb">all</span><span class="p">([</span><span class="n">h</span><span class="o">.</span><span class="n">is_opened</span><span class="p">()</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__handlers</span><span class="o">.</span><span class="n">values</span><span class="p">()])</span></div>
- <div class="viewcode-block" id="PlotManager.register"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotManager.register">[docs]</a> <span class="k">def</span> <span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="nb">object</span><span class="p">,</span> <span class="n">figure</span><span class="p">,</span> <span class="n">kind</span><span class="p">,</span> <span class="n">interval</span><span class="o">=</span><span class="mi">100</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Register a single :class:`PlotHandler` to plot information.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> name (str): The name for this handler. Will be used to optionally</span>
- <span class="sd"> access it afterwards.</span>
- <span class="sd"> object (Any): The object from which data needs to be polled. By default,</span>
- <span class="sd"> the :code:`data_xy` attribute will be used on the object,</span>
- <span class="sd"> which should result in a 2xN array in the form of</span>
- <span class="sd"> :code:`([x1, x2, x3...], [y1, y2, y3...])`.</span>
- <span class="sd"> figure: The figure object required for plotting. This has been made</span>
- <span class="sd"> externally to allow for full manipulation of the plotting</span>
- <span class="sd"> framework itself.</span>
- <span class="sd"> kind (PlotKind): What needs to be plotted. See :class:`PlotKind` for more</span>
- <span class="sd"> info.</span>
- <span class="sd"> interval (int): Amount of milliseconds between plot refreshes.</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> :class:`PlotHandler`</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__handlers</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"PlotManager: PlotHandler '</span><span class="si">%s</span><span class="s2">' already registered."</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__handlers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">PlotHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">,</span> <span class="n">figure</span><span class="p">,</span> <span class="n">kind</span><span class="p">,</span> <span class="n">interval</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">backend</span><span class="p">)</span></div>
- <div class="viewcode-block" id="PlotManager.unregister"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotManager.unregister">[docs]</a> <span class="k">def</span> <span class="nf">unregister</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Removes a single :class:`PlotHandler` from the manager.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> name (str): The identifying name for the handler.</span>
- <span class="sd"> """</span>
- <span class="n">h</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
- <span class="n">h</span><span class="o">.</span><span class="n">close_event</span><span class="p">()</span>
- <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__handlers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span></div>
- <div class="viewcode-block" id="PlotManager.get"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotManager.get">[docs]</a> <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Obtains a single :class:`PlotHandler`, given its name.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> name (str): The identifying name for the handler to obtain.</span>
- <span class="sd"> """</span>
- <span class="k">if</span> <span class="n">name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__handlers</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"PlotManager: No PlotHandler exists with name '</span><span class="si">%s</span><span class="s2">'."</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__handlers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span></div>
- <div class="viewcode-block" id="PlotManager.connect"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.PlotManager.connect">[docs]</a> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handler_name</span><span class="p">,</span> <span class="n">event_name</span><span class="p">,</span> <span class="n">function</span><span class="p">):</span>
- <span class="sd">"""</span>
- <span class="sd"> Connect an event to a specific handler.</span>
- <span class="sd"> Args:</span>
- <span class="sd"> handler_name (str): The identifying name for the handler.</span>
- <span class="sd"> event_name (str): The name for the event.</span>
- <span class="sd"> function: A function to execute whenever the event is raised.</span>
- <span class="sd"> See Also:</span>
- <span class="sd"> - :func:`PlotHandler.connect`</span>
- <span class="sd"> - :func:`PlotHandler.signal`</span>
- <span class="sd"> """</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">handler_name</span><span class="p">)</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">event_name</span><span class="p">,</span> <span class="n">function</span><span class="p">)</span></div></div>
- <span class="c1"># TEMPORARY TEST OBJECT:</span>
- <span class="kn">import</span> <span class="nn">math</span>
- <span class="k">class</span> <span class="nc">__Block</span><span class="p">:</span>
- <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">y</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">int</span> <span class="o">=</span> <span class="mf">0.0</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">method</span>
- <span class="nd">@property</span>
- <span class="k">def</span> <span class="nf">data_xy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">int</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">math</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">method</span><span class="p">)(</span><span class="bp">self</span><span class="o">.</span><span class="n">int</span><span class="p">))</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">int</span> <span class="o">+=</span> <span class="mf">0.1</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span>
- <div class="viewcode-block" id="mpl"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.mpl">[docs]</a><span class="k">def</span> <span class="nf">mpl</span><span class="p">():</span>
- <span class="sd">"""</span>
- <span class="sd"> Example usage for a matplotlib backend.</span>
- <span class="sd"> """</span>
- <span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
- <span class="n">fig</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span> <span class="n">dpi</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
- <span class="n">ax</span> <span class="o">=</span> <span class="n">fig</span><span class="o">.</span><span class="n">add_subplot</span><span class="p">(</span><span class="mi">111</span><span class="p">)</span>
- <span class="n">ax</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">((</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
- <span class="n">manager</span> <span class="o">=</span> <span class="n">PlotManager</span><span class="p">()</span>
- <span class="n">manager</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s2">"sin"</span><span class="p">,</span> <span class="n">__Block</span><span class="p">(</span><span class="s1">'sin'</span><span class="p">),</span> <span class="p">(</span><span class="n">fig</span><span class="p">,</span> <span class="n">ax</span><span class="p">),</span> <span class="n">ScatterPlot</span><span class="p">())</span>
- <span class="n">manager</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s2">"cos"</span><span class="p">,</span> <span class="n">__Block</span><span class="p">(</span><span class="s1">'cos'</span><span class="p">),</span> <span class="p">(</span><span class="n">fig</span><span class="p">,</span> <span class="n">ax</span><span class="p">),</span> <span class="n">LinePlot</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="s1">'red'</span><span class="p">))</span>
- <span class="n">manager</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s1">'sin'</span><span class="p">,</span> <span class="s1">'update_event'</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">d</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="n">ax</span><span class="p">:</span> <span class="n">axis</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">(</span><span class="n">PlotHandler</span><span class="o">.</span><span class="n">follow</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mf">10.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">)))</span>
- <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span></div>
- <div class="viewcode-block" id="bkh"><a class="viewcode-back" href="../../../CBD.realtime.plotting.html#CBD.realtime.plotting.bkh">[docs]</a><span class="k">def</span> <span class="nf">bkh</span><span class="p">():</span>
- <span class="sd">"""</span>
- <span class="sd"> Example usage for a bokeh backend.</span>
- <span class="sd"> """</span>
- <span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="kn">import</span> <span class="n">figure</span>
- <span class="kn">from</span> <span class="nn">bokeh.client</span> <span class="kn">import</span> <span class="n">push_session</span>
- <span class="n">fig</span> <span class="o">=</span> <span class="n">figure</span><span class="p">(</span><span class="n">plot_width</span><span class="o">=</span><span class="mi">400</span><span class="p">,</span> <span class="n">plot_height</span><span class="o">=</span><span class="mi">400</span><span class="p">,</span> <span class="n">y_range</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
- <span class="n">curdoc</span><span class="p">()</span><span class="o">.</span><span class="n">add_root</span><span class="p">(</span><span class="n">fig</span><span class="p">)</span>
- <span class="n">manager</span> <span class="o">=</span> <span class="n">PlotManager</span><span class="p">(</span><span class="n">Backend</span><span class="o">.</span><span class="n">BOKEH</span><span class="p">)</span>
- <span class="n">manager</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s2">"sin"</span><span class="p">,</span> <span class="n">__Block</span><span class="p">(</span><span class="s1">'sin'</span><span class="p">),</span> <span class="n">fig</span><span class="p">,</span> <span class="n">ScatterPlot</span><span class="p">())</span>
- <span class="n">manager</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s2">"cos"</span><span class="p">,</span> <span class="n">__Block</span><span class="p">(</span><span class="s1">'cos'</span><span class="p">),</span> <span class="n">fig</span><span class="p">,</span> <span class="n">LinePlot</span><span class="p">(</span><span class="n">color</span><span class="o">=</span><span class="s1">'red'</span><span class="p">))</span>
- <span class="k">def</span> <span class="nf">set_xlim</span><span class="p">(</span><span class="n">limits</span><span class="p">):</span>
- <span class="n">lower</span><span class="p">,</span> <span class="n">upper</span> <span class="o">=</span> <span class="n">limits</span>
- <span class="n">fig</span><span class="o">.</span><span class="n">x_range</span><span class="o">.</span><span class="n">start</span> <span class="o">=</span> <span class="n">lower</span>
- <span class="n">fig</span><span class="o">.</span><span class="n">x_range</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="n">upper</span>
- <span class="n">manager</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s1">'sin'</span><span class="p">,</span> <span class="s1">'update_event'</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">d</span><span class="p">:</span> <span class="n">set_xlim</span><span class="p">(</span><span class="n">PlotHandler</span><span class="o">.</span><span class="n">follow</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mf">10.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">)))</span>
- <span class="n">session</span> <span class="o">=</span> <span class="n">push_session</span><span class="p">(</span><span class="n">curdoc</span><span class="p">())</span>
- <span class="n">session</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
- <span class="c1"># TODO: disable flickering? (is this possible?)</span>
- <span class="kn">import</span> <span class="nn">time</span>
- <span class="k">while</span> <span class="n">manager</span><span class="o">.</span><span class="n">is_opened</span><span class="p">():</span>
- <span class="n">session</span><span class="o">.</span><span class="n">push</span><span class="p">()</span>
- <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span></div>
- <span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
- <span class="n">bkh</span><span class="p">()</span>
- </pre></div>
- </article>
-
- </div>
- <footer>
-
- <hr>
- <div role="contentinfo">
- <p>
- © Copyright 2020, Randy Paredis.
- </p>
- </div>
-
- <div>
- Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
- </div>
-
- </footer>
- </div>
- </div>
- <div class="catalyst-content-right" id="catalyst-content-right">
- <div class="catalyst-right-menu" id="catalyst-right-menu">
- <div class="catalyst-side-scroll" id="catalyst-side-scroll-right">
-
- </div>
- </div>
- </div>
- </section>
- </div>
-
-
-
- <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
- <script type="text/javascript" src="../../../_static/jquery.js"></script>
- <script type="text/javascript" src="../../../_static/underscore.js"></script>
- <script type="text/javascript" src="../../../_static/doctools.js"></script>
- <script type="text/javascript" src="../../../_static/language_data.js"></script>
-
-
- <script type="text/javascript" src="../../../_static/js/vendor/popper.min.js"></script>
- <script type="text/javascript" src="../../../_static/js/vendor/bootstrap.min.js"></script>
- <script type="text/javascript" src="../../../_static/js/theme.js"></script>
- <script type="text/javascript">
- jQuery(function () {
- SphinxRtdTheme.Navigation.enable(true);
- });
- </script>
- <!-- Begin Footer -->
- <footer class="site-footer" id="site-footer">
- <div class="container footer-container">
- <div class="footer-logo-wrapper">
- <a href="https://catalyst-team.com/" class="footer-logo"></a>
- </div>
- <div class="footer-links-wrapper">
- <div class="footer-links-col">
- <ul>
- <li class="list-title"><a href="https://github.com/catalyst-team">Ecosystem</a></li>
- <li><a class="nav-dropdown-item" href="https://alchemy.host">Alchemy</a></li>
- <li><a class="nav-dropdown-item" href="https://github.com/catalyst-team/catalyst">Catalyst</a></li>
- <li><a class="nav-dropdown-item" href="https://github.com/catalyst-team/reaction">Reaction</a></li>
- </ul>
- </div>
- <div class="footer-links-col">
- <ul>
- <li class="list-title"><a href="https://github.com/catalyst-team">Projects</a></li>
- <li><a class="nav-dropdown-item" href="https://github.com/catalyst-team/codestyle">Codestyle</a></li>
- <li><a class="nav-dropdown-item" href="https://github.com/catalyst-team/neuro">Catalyst.Neuro</a></li>
- <li><a class="nav-dropdown-item" href="https://github.com/catalyst-team/classification">Classification</a></li>
- <li><a class="nav-dropdown-item" href="https://github.com/catalyst-team/detection">Detection</a></li>
- <li><a class="nav-dropdown-item" href="https://github.com/catalyst-team/segmentation">Segmentation</a></li>
- <li><a class="nav-dropdown-item" href="https://github.com/catalyst-team/gan">Catalyst.GAN</a></li>
- </ul>
- </div>
- <div class="footer-links-col">
- <ul>
- <li class="list-title"><a href="https://catalyst-team.com/">Support</a></li>
- <li><a href="https://github.com/catalyst-team/catalyst/issues" target="_blank">Github Issues</a></li>
- <li><a href="https://github.com/catalyst-team/catalyst/blob/master/CONTRIBUTING.md" target="_blank">Contributing</a></li>
- <li><a href="https://www.patreon.com/catalyst_team" target="_blank">Patreon</a></li>
- </ul>
- </div>
- <div class="footer-links-col follow-us-col">
- <div class="footer-social-icons">
- <a href="https://t.me/catalyst_team" target="_blank" class="telegram"></a>
- <a href="https://twitter.com/catalyst_core" target="_blank" class="twitter"></a>
- <a href="https://join.slack.com/t/catalyst-team-core/shared_invite/zt-d9miirnn-z86oKDzFMKlMG4fgFdZafw" target="_blank" class="ods"></a>
- </div>
- </div>
- </div>
- </div>
- </footer>
- <!-- End Footer -->
- <!-- Begin Mobile Menu -->
- <div class="mobile-main-menu">
- <div class="container-fluid">
- <div class="container">
- <div class="mobile-main-menu-header-container">
- <a class="header-logo" href="https://catalyst-team.com/" aria-label="Catalyst"></a>
- <a class="main-menu-close-button" href="#" data-behavior="close-mobile-menu"></a>
- </div>
- </div>
- </div>
- <div class="mobile-main-menu-links-container">
- <div class="main-menu">
- <ul>
- <li>
- <a href="">Get Started</a>
- </li>
- <li>
- <a href="https://github.com/catalyst-team/catalyst">Github</a>
- </li>
- </ul>
- </div>
- </div>
- </div>
- <!-- End Mobile Menu -->
- <script type="text/javascript" src="../../../_static/js/vendor/anchor.min.js"></script>
- <script type="text/javascript">
- $(document).ready(function() {
- mobileMenu.bind();
- mobileTOC.bind();
- catalystAnchors.bind();
- sideMenus.bind();
- scrollToAnchor.bind();
- highlightNavigation.bind();
- mainMenuDropdown.bind();
- // Add class to links that have code blocks, since we cannot create links in code blocks
- $("article.catalyst-article a span.pre").each(function(e) {
- $(this).closest("a").addClass("has-code");
- });
- })
- </script>
- </body>
- </html>
|