Skip to content
Snippets Groups Projects
Commit f32e7f9f authored by Dima Kogan's avatar Dima Kogan
Browse files

New upstream version 0.42

parent d1cfb911
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<svg
viewBox="0 0 800 600"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<title>Gnuplot</title>
<desc>Produced by GNUPLOT 6.1 patchlevel 0 </desc>
<g id="gnuplot_canvas">
<rect x="0" y="0" width="800" height="600" fill="none"/>
<defs>
<circle id='gpDot' r='0.5' stroke-width='0.5' stroke='currentColor'/>
<path id='gpPt0' stroke-width='0.190' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
<path id='gpPt1' stroke-width='0.190' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
<path id='gpPt2' stroke-width='0.190' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
<rect id='gpPt3' stroke-width='0.190' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
<rect id='gpPt4' stroke-width='0.190' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
<circle id='gpPt5' stroke-width='0.190' stroke='currentColor' cx='0' cy='0' r='1'/>
<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
<path id='gpPt7' stroke-width='0.190' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
<path id='gpPt13' stroke-width='0.190' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/>
<use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/>
<filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
<feFlood flood-color='white' flood-opacity='1' result='bgnd'/>
<feComposite in='SourceGraphic' in2='bgnd' operator='atop'/>
</filter>
<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
<feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
<feComposite in='SourceGraphic' in2='grey' operator='atop'/>
</filter>
</defs>
<g fill="none" color="white" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M84.63,558.00 L681.09,558.00 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M84.63,558.00 L95.13,558.00 '/> <g transform="translate(74.84,562.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="end">
<text> 0</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M84.63,450.60 L681.09,450.60 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M84.63,450.60 L95.13,450.60 '/> <g transform="translate(74.84,455.15)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="end">
<text> 20</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M84.63,343.20 L681.09,343.20 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M84.63,343.20 L95.13,343.20 '/> <g transform="translate(74.84,347.75)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="end">
<text> 40</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M84.63,235.81 L681.09,235.81 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M84.63,235.81 L95.13,235.81 '/> <g transform="translate(74.84,240.36)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="end">
<text> 60</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M84.63,128.41 L681.09,128.41 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M84.63,128.41 L95.13,128.41 '/> <g transform="translate(74.84,132.96)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="end">
<text> 80</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M84.63,21.01 L681.09,21.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M84.63,21.01 L95.13,21.01 '/> <g transform="translate(74.84,25.56)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="end">
<text> 100</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M84.63,558.00 L84.63,21.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M84.63,558.00 L84.63,547.50 M84.63,21.01 L84.63,31.51 '/> <g transform="translate(84.63,583.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="middle">
<text>-200000</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M169.84,558.00 L169.84,21.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M169.84,558.00 L169.84,547.50 M169.84,21.01 L169.84,31.51 '/> <g transform="translate(169.84,583.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="middle">
<text> 0</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M255.05,558.00 L255.05,21.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M255.05,558.00 L255.05,547.50 M255.05,21.01 L255.05,31.51 '/> <g transform="translate(255.05,583.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="middle">
<text> 200000</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M340.26,558.00 L340.26,21.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M340.26,558.00 L340.26,547.50 M340.26,21.01 L340.26,31.51 '/> <g transform="translate(340.26,583.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="middle">
<text> 400000</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M425.46,558.00 L425.46,21.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M425.46,558.00 L425.46,547.50 M425.46,21.01 L425.46,31.51 '/> <g transform="translate(425.46,583.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="middle">
<text> 600000</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M510.67,558.00 L510.67,73.51 M510.67,31.51 L510.67,21.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M510.67,558.00 L510.67,547.50 M510.67,21.01 L510.67,31.51 '/> <g transform="translate(510.67,583.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="middle">
<text> 800000</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M595.88,558.00 L595.88,73.51 M595.88,31.51 L595.88,21.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M595.88,558.00 L595.88,547.50 M595.88,21.01 L595.88,31.51 '/> <g transform="translate(595.88,583.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="middle">
<text> 1e+06</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="gray" stroke="currentColor" stroke-width="0.50" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='gray' stroke-dasharray='2,4' class="gridline" d='M681.09,558.00 L681.09,21.01 '/></g>
<g fill="none" color="gray" stroke="gray" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,558.00 L681.09,547.50 M681.09,21.01 L681.09,31.51 '/> <g transform="translate(681.09,583.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="middle">
<text> 1.2e+06</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,558.00 L670.59,558.00 '/> <g transform="translate(690.88,562.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="start">
<text> 100</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,498.33 L670.59,498.33 '/> <g transform="translate(690.88,502.88)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="start">
<text> 200</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,438.67 L670.59,438.67 '/> <g transform="translate(690.88,443.22)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="start">
<text> 300</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,379.00 L670.59,379.00 '/> <g transform="translate(690.88,383.55)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="start">
<text> 400</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,319.34 L670.59,319.34 '/> <g transform="translate(690.88,323.89)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="start">
<text> 500</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,259.67 L670.59,259.67 '/> <g transform="translate(690.88,264.22)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="start">
<text> 600</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,200.01 L670.59,200.01 '/> <g transform="translate(690.88,204.56)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="start">
<text> 700</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,140.34 L670.59,140.34 '/> <g transform="translate(690.88,144.89)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="start">
<text> 800</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,80.68 L670.59,80.68 '/> <g transform="translate(690.88,85.23)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="start">
<text> 900</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M681.09,21.01 L670.59,21.01 '/> <g transform="translate(690.88,25.56)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="start">
<text> 1000</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M84.63,21.01 L84.63,558.00 L681.09,558.00 L681.09,21.01 L84.63,21.01 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g id="gnuplot_plot_1" ><title>Cumulative sum</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '165.58,558.00 174.11,558.00 174.11,21.00 165.58,21.00 '/>
</g>
<path stroke='black' d='M165.58,558.00 L165.58,21.01 L174.10,21.01 L174.10,558.00 L165.58,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '174.10,558.00 182.63,558.00 182.63,160.62 174.10,160.62 '/>
</g>
<path stroke='black' d='M174.10,558.00 L174.10,160.63 L182.62,160.63 L182.62,558.00 L174.10,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '182.62,558.00 191.15,558.00 191.15,289.49 182.62,289.49 '/>
</g>
<path stroke='black' d='M182.62,558.00 L182.62,289.50 L191.14,289.50 L191.14,558.00 L182.62,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '191.14,558.00 199.67,558.00 199.67,337.82 191.14,337.82 '/>
</g>
<path stroke='black' d='M191.14,558.00 L191.14,337.83 L199.66,337.83 L199.66,558.00 L191.14,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '199.66,558.00 208.19,558.00 208.19,370.04 199.66,370.04 '/>
</g>
<path stroke='black' d='M199.66,558.00 L199.66,370.05 L208.18,370.05 L208.18,558.00 L199.66,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '208.18,558.00 216.71,558.00 216.71,386.15 208.18,386.15 '/>
</g>
<path stroke='black' d='M208.18,558.00 L208.18,386.16 L216.70,386.16 L216.70,558.00 L208.18,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '216.70,558.00 225.23,558.00 225.23,402.26 216.70,402.26 '/>
</g>
<path stroke='black' d='M216.70,558.00 L216.70,402.27 L225.22,402.27 L225.22,558.00 L216.70,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '225.22,558.00 233.76,558.00 233.76,413.00 225.22,413.00 '/>
</g>
<path stroke='black' d='M225.22,558.00 L225.22,413.01 L233.75,413.01 L233.75,558.00 L225.22,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '233.75,558.00 242.28,558.00 242.28,423.74 233.75,423.74 '/>
</g>
<path stroke='black' d='M233.75,558.00 L233.75,423.75 L242.27,423.75 L242.27,558.00 L233.75,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '242.27,558.00 250.80,558.00 250.80,434.48 242.27,434.48 '/>
</g>
<path stroke='black' d='M242.27,558.00 L242.27,434.49 L250.79,434.49 L250.79,558.00 L242.27,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '250.79,558.00 259.32,558.00 259.32,434.48 250.79,434.48 '/>
</g>
<path stroke='black' d='M250.79,558.00 L250.79,434.49 L259.31,434.49 L259.31,558.00 L250.79,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '259.31,558.00 267.84,558.00 267.84,445.22 259.31,445.22 '/>
</g>
<path stroke='black' d='M259.31,558.00 L259.31,445.23 L267.83,445.23 L267.83,558.00 L259.31,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '267.83,558.00 276.36,558.00 276.36,450.59 267.83,450.59 '/>
</g>
<path stroke='black' d='M267.83,558.00 L267.83,450.60 L276.35,450.60 L276.35,558.00 L267.83,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '276.35,558.00 284.88,558.00 284.88,450.59 276.35,450.59 '/>
</g>
<path stroke='black' d='M276.35,558.00 L276.35,450.60 L284.87,450.60 L284.87,558.00 L276.35,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '284.87,558.00 293.40,558.00 293.40,455.96 284.87,455.96 '/>
</g>
<path stroke='black' d='M284.87,558.00 L284.87,455.97 L293.39,455.97 L293.39,558.00 L284.87,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '293.39,558.00 301.92,558.00 301.92,461.33 293.39,461.33 '/>
</g>
<path stroke='black' d='M293.39,558.00 L293.39,461.34 L301.91,461.34 L301.91,558.00 L293.39,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '301.91,558.00 310.44,558.00 310.44,461.33 301.91,461.33 '/>
</g>
<path stroke='black' d='M301.91,558.00 L301.91,461.34 L310.43,461.34 L310.43,558.00 L301.91,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '310.43,558.00 318.96,558.00 318.96,466.70 310.43,466.70 '/>
</g>
<path stroke='black' d='M310.43,558.00 L310.43,466.71 L318.95,466.71 L318.95,558.00 L310.43,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '318.95,558.00 327.48,558.00 327.48,466.70 318.95,466.70 '/>
</g>
<path stroke='black' d='M318.95,558.00 L318.95,466.71 L327.47,466.71 L327.47,558.00 L318.95,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '327.47,558.00 336.01,558.00 336.01,472.07 327.47,472.07 '/>
</g>
<path stroke='black' d='M327.47,558.00 L327.47,472.08 L336.00,472.08 L336.00,558.00 L327.47,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '336.00,558.00 344.53,558.00 344.53,472.07 336.00,472.07 '/>
</g>
<path stroke='black' d='M336.00,558.00 L336.00,472.08 L344.52,472.08 L344.52,558.00 L336.00,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '344.52,558.00 353.05,558.00 353.05,477.44 344.52,477.44 '/>
</g>
<path stroke='black' d='M344.52,558.00 L344.52,477.45 L353.04,477.45 L353.04,558.00 L344.52,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '353.04,558.00 361.57,558.00 361.57,477.44 353.04,477.44 '/>
</g>
<path stroke='black' d='M353.04,558.00 L353.04,477.45 L361.56,477.45 L361.56,558.00 L353.04,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '361.56,558.00 370.09,558.00 370.09,477.44 361.56,477.44 '/>
</g>
<path stroke='black' d='M361.56,558.00 L361.56,477.45 L370.08,477.45 L370.08,558.00 L361.56,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '370.08,558.00 378.61,558.00 378.61,482.81 370.08,482.81 '/>
</g>
<path stroke='black' d='M370.08,558.00 L370.08,482.82 L378.60,482.82 L378.60,558.00 L370.08,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '378.60,558.00 387.13,558.00 387.13,477.44 378.60,477.44 '/>
</g>
<path stroke='black' d='M378.60,558.00 L378.60,477.45 L387.12,477.45 L387.12,558.00 L378.60,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '387.12,558.00 395.65,558.00 395.65,482.81 387.12,482.81 '/>
</g>
<path stroke='black' d='M387.12,558.00 L387.12,482.82 L395.64,482.82 L395.64,558.00 L387.12,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '395.64,558.00 404.17,558.00 404.17,488.18 395.64,488.18 '/>
</g>
<path stroke='black' d='M395.64,558.00 L395.64,488.19 L404.16,488.19 L404.16,558.00 L395.64,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '404.16,558.00 412.69,558.00 412.69,488.18 404.16,488.18 '/>
</g>
<path stroke='black' d='M404.16,558.00 L404.16,488.19 L412.68,488.19 L412.68,558.00 L404.16,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '412.68,558.00 421.21,558.00 421.21,482.81 412.68,482.81 '/>
</g>
<path stroke='black' d='M412.68,558.00 L412.68,482.82 L421.20,482.82 L421.20,558.00 L412.68,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '421.20,558.00 429.73,558.00 429.73,488.18 421.20,488.18 '/>
</g>
<path stroke='black' d='M421.20,558.00 L421.20,488.19 L429.72,488.19 L429.72,558.00 L421.20,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '429.72,558.00 438.26,558.00 438.26,493.55 429.72,493.55 '/>
</g>
<path stroke='black' d='M429.72,558.00 L429.72,493.56 L438.25,493.56 L438.25,558.00 L429.72,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '438.25,558.00 446.78,558.00 446.78,488.18 438.25,488.18 '/>
</g>
<path stroke='black' d='M438.25,558.00 L438.25,488.19 L446.77,488.19 L446.77,558.00 L438.25,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '446.77,558.00 455.30,558.00 455.30,493.55 446.77,493.55 '/>
</g>
<path stroke='black' d='M446.77,558.00 L446.77,493.56 L455.29,493.56 L455.29,558.00 L446.77,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '455.29,558.00 463.82,558.00 463.82,493.55 455.29,493.55 '/>
</g>
<path stroke='black' d='M455.29,558.00 L455.29,493.56 L463.81,493.56 L463.81,558.00 L455.29,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '463.81,558.00 472.34,558.00 472.34,493.55 463.81,493.55 '/>
</g>
<path stroke='black' d='M463.81,558.00 L463.81,493.56 L472.33,493.56 L472.33,558.00 L463.81,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '472.33,558.00 480.86,558.00 480.86,493.55 472.33,493.55 '/>
</g>
<path stroke='black' d='M472.33,558.00 L472.33,493.56 L480.85,493.56 L480.85,558.00 L472.33,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '480.85,558.00 489.38,558.00 489.38,493.55 480.85,493.55 '/>
</g>
<path stroke='black' d='M480.85,558.00 L480.85,493.56 L489.37,493.56 L489.37,558.00 L480.85,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '489.37,558.00 497.90,558.00 497.90,498.92 489.37,498.92 '/>
</g>
<path stroke='black' d='M489.37,558.00 L489.37,498.93 L497.89,498.93 L497.89,558.00 L489.37,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '497.89,558.00 506.42,558.00 506.42,498.92 497.89,498.92 '/>
</g>
<path stroke='black' d='M497.89,558.00 L497.89,498.93 L506.41,498.93 L506.41,558.00 L497.89,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '506.41,558.00 514.94,558.00 514.94,498.92 506.41,498.92 '/>
</g>
<path stroke='black' d='M506.41,558.00 L506.41,498.93 L514.93,498.93 L514.93,558.00 L506.41,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '514.93,558.00 523.46,558.00 523.46,493.55 514.93,493.55 '/>
</g>
<path stroke='black' d='M514.93,558.00 L514.93,493.56 L523.45,493.56 L523.45,558.00 L514.93,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '523.45,558.00 531.99,558.00 531.99,504.29 523.45,504.29 '/>
</g>
<path stroke='black' d='M523.45,558.00 L523.45,504.30 L531.98,504.30 L531.98,558.00 L523.45,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '531.98,558.00 540.51,558.00 540.51,498.92 531.98,498.92 '/>
</g>
<path stroke='black' d='M531.98,558.00 L531.98,498.93 L540.50,498.93 L540.50,558.00 L531.98,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '540.50,558.00 549.03,558.00 549.03,498.92 540.50,498.92 '/>
</g>
<path stroke='black' d='M540.50,558.00 L540.50,498.93 L549.02,498.93 L549.02,558.00 L540.50,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '549.02,558.00 557.55,558.00 557.55,504.29 549.02,504.29 '/>
</g>
<path stroke='black' d='M549.02,558.00 L549.02,504.30 L557.54,504.30 L557.54,558.00 L549.02,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '557.54,558.00 566.07,558.00 566.07,498.92 557.54,498.92 '/>
</g>
<path stroke='black' d='M557.54,558.00 L557.54,498.93 L566.06,498.93 L566.06,558.00 L557.54,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '566.06,558.00 574.59,558.00 574.59,504.29 566.06,504.29 '/>
</g>
<path stroke='black' d='M566.06,558.00 L566.06,504.30 L574.58,504.30 L574.58,558.00 L566.06,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '574.58,558.00 583.11,558.00 583.11,504.29 574.58,504.29 '/>
</g>
<path stroke='black' d='M574.58,558.00 L574.58,504.30 L583.10,504.30 L583.10,558.00 L574.58,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '583.10,558.00 591.63,558.00 591.63,504.29 583.10,504.29 '/>
</g>
<path stroke='black' d='M583.10,558.00 L583.10,504.30 L591.62,504.30 L591.62,558.00 L583.10,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '591.62,558.00 600.15,558.00 600.15,531.14 591.62,531.14 '/>
</g>
<path stroke='black' d='M591.62,558.00 L591.62,531.15 L600.14,531.15 L600.14,558.00 L591.62,558.00 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
</g>
<g id="gnuplot_plot_2" ><title>Cumulative sum</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb( 0, 158, 115)' d='M169.84,558.00 L178.36,513.85 L186.88,484.01 L195.40,459.55 L203.92,438.67 L212.44,419.58 L220.96,402.27 L229.48,386.16
L238.01,371.25 L246.53,357.52 L255.05,343.80 L263.57,331.27 L272.09,319.34 L280.61,307.40 L289.13,296.07 L297.65,285.33
L306.17,274.59 L314.69,264.45 L323.21,254.30 L331.73,244.76 L340.26,235.21 L348.78,226.26 L357.30,217.31 L365.82,208.36
L374.34,200.01 L382.86,191.06 L391.38,182.70 L399.90,174.95 L408.42,167.19 L416.94,158.84 L425.46,151.08 L433.99,143.92
L442.51,136.16 L451.03,129.00 L459.55,121.84 L468.07,114.68 L476.59,107.53 L485.11,100.37 L493.63,93.80 L502.15,87.24
L510.67,80.68 L519.19,73.52 L527.71,67.55 L536.24,60.99 L544.76,54.42 L553.28,48.46 L561.80,41.89 L570.32,35.93
L578.84,29.96 L587.36,23.99 L595.88,21.01 '/></g>
</g>
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'white' points = '504.16,73.51 671.30,73.51 671.30,31.51 504.16,31.51 '/>
</g>
<g id="gnuplot_plot_1" ><title>Cumulative sum</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g transform="translate(602.06,46.56)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="end">
<text>Frequency</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g stroke='none' shape-rendering='crispEdges'>
<polygon fill = 'rgb(148, 0, 211)' points = '611.85,47.26 661.51,47.26 661.51,36.76 611.85,36.76 '/>
</g>
<path stroke='black' d='M611.85,47.26 L661.51,47.26 L661.51,36.76 L611.85,36.76 L611.85,47.26 Z '/></g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
</g>
<g id="gnuplot_plot_2" ><title>Cumulative sum</title>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g transform="translate(602.06,67.56)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="end">
<text>Cumulative</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='rgb( 0, 158, 115)' d='M611.85,63.01 L661.51,63.01 '/></g>
</g>
<g fill="none" color="white" stroke="rgb( 0, 158, 115)" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="black" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<path stroke='black' d='M84.63,21.01 L84.63,558.00 L681.09,558.00 L681.09,21.01 L84.63,21.01 Z '/> <g transform="translate(22.38,289.51) rotate(270.00)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="middle">
<text>Histogram frequency</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
<g transform="translate(764.67,289.51) rotate(270.00)" stroke="none" fill="black" font-family="Arial" font-size="14.00" text-anchor="middle">
<text>Cumulative sum</text>
</g>
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
<g fill="none" color="black" stroke="currentColor" stroke-width="1.00" stroke-linecap="butt" stroke-linejoin="miter">
</g>
</g>
</svg>
gnuplotlib (0.42)
* Regexes use raw strings, so Python 3.12 will not throw warnings to
stdout
* gnuplotlib.wait() can accept gnuplotlib objects to wait for
-- Dima Kogan <dkogan@debian.org> Tue, 03 Sep 2024 12:07:40 -0700
gnuplotlib (0.41)
* I "unset multiplot" after sending multiplot data
......
This diff is collapsed.
......@@ -12,15 +12,19 @@ import gnuplotlib as gp
x = np.arange(101) - 50
gp.plot(x**2)
[ basic parabola plot pops up ]
#+END_SRC
[[file:basic-parabola-plot-pops-up.svg]]
#+BEGIN_SRC python
g1 = gp.gnuplotlib(title = 'Parabola with error bars',
_with = 'xyerrorbars')
g1.plot( x**2 * 10, np.abs(x)/10, np.abs(x)*5,
g1.plot( x**2 * 10, np.abs(x)/10, np.abs(x)*25,
legend = 'Parabola',
tuplesize = 4 )
[ parabola with x,y errobars pops up in a new window ]
#+END_SRC
[[file:parabola-with-x-y-errobars-pops-up-in-a-new-window.svg]]
#+BEGIN_SRC python
x,y = np.ogrid[-10:11,-10:11]
......@@ -28,9 +32,12 @@ gp.plot( x**2 + y**2,
title = 'Heat map',
unset = 'grid',
cmds = 'set view map',
square = True,
_with = 'image',
tuplesize = 3)
[ Heat map pops up where first parabola used to be ]
#+END_SRC
[[file:Heat-map-pops-up-where-first-parabola-used-to-be.svg]]
#+BEGIN_SRC python
theta = np.linspace(0, 6*np.pi, 200)
......@@ -39,22 +46,35 @@ g2 = gp.gnuplotlib(_3d = True)
g2.plot( np.cos(theta),
np.vstack((np.sin(theta), -np.sin(theta))),
z )
[ Two 3D spirals together in a new window ]
#+END_SRC
[[file:Two-3D-spirals-together-in-a-new-window.svg]]
#+BEGIN_SRC python
x = np.arange(1000)
gp.plot( (x*x, dict(histogram=1,
binwidth =10000)),
(x*x, dict(histogram='cumulative', y2=1)))
[ A density and cumulative histogram of x^2 are plotted on the same plot ]
gp.plot( (x*x, dict(histogram=1,
binwidth =10000)),
(x*x, dict(histogram='cumulative')),
gp.plot( (x*x, dict(histogram= True,
binwidth = 20000,
legend = 'Frequency')),
(x*x, dict(histogram='cumulative',
legend = 'Cumulative',
y2 = True )),
ylabel = 'Histogram frequency',
y2label = 'Cumulative sum')
#+END_SRC
[[file:A-density-and-cumulative-histogram-of-x-2-are-plotted-on-the-same-plot.svg]]
#+BEGIN_SRC python
gp.plot( (x*x, dict(histogram=True,
binwidth =20000,
legend = 'Frequency')),
(x*x, dict(histogram='cumulative',
legend = 'Cumulative')),
_xmin=0, _xmax=1e6,
multiplot='title "multiplot histograms" layout 2,1',
_set='lmargin at screen 0.05')
[ Same histograms, but plotted on two separate plots ]
#+END_SRC
[[file:Same-histograms-but-plotted-on-two-separate-plots.svg]]
#+BEGIN_SRC python
#+END_SRC
* DESCRIPTION
......@@ -263,9 +283,27 @@ options".
A few helper global functions are available:
plot3d(...) is equivalent to plot(..., _3d=True)
#+BEGIN_SRC python
plot3d(...)
#+END_SRC
is equivalent to
#+BEGIN_SRC python
plot(..., _3d=True)
#+END_SRC
And
plotimage(...) is equivalent to plot(..., _with='image', tuplesize=3)
#+BEGIN_SRC python
plotimage(...)
#+END_SRC
is equivalent to
#+BEGIN_SRC python
plot(..., _with='image', tuplesize=3)
#+END_SRC
** Data arguments
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
#!/usr/bin/python
#!/usr/bin/python3
r'''Constructs README, README.org files
......@@ -11,15 +11,86 @@ The README files are generated by this script. They are made from:
- README.footer.org, copied verbatim
The main module name must be passed in as the first cmdline argument.
If we want to regenerate the figures linked in the README.org documentation,
pass "DOCUMENTATION-PLOTS" as the first argument
'''
import sys
import os.path
def generate_plots():
r'''Makes plots in the docstring of the gnuplotlib.py module'''
import numpy as np
import gnuplotlib as gp
x = np.arange(101) - 50
gp.plot(x**2,
hardcopy='basic-parabola-plot-pops-up.svg')
g1 = gp.gnuplotlib(title = 'Parabola with error bars',
_with = 'xyerrorbars',
hardcopy = 'parabola-with-x-y-errobars-pops-up-in-a-new-window.svg')
g1.plot( x**2 * 10, np.abs(x)/10, np.abs(x)*25,
legend = 'Parabola',
tuplesize = 4 )
x,y = np.ogrid[-10:11,-10:11]
gp.plot( x**2 + y**2,
title = 'Heat map',
unset = 'grid',
cmds = 'set view map',
square = True,
_with = 'image',
tuplesize = 3,
hardcopy = 'Heat-map-pops-up-where-first-parabola-used-to-be.svg')
theta = np.linspace(0, 6*np.pi, 200)
z = np.linspace(0, 5, 200)
g2 = gp.gnuplotlib(_3d = True,
hardcopy = 'Two-3D-spirals-together-in-a-new-window.svg')
g2.plot( np.cos(theta),
np.vstack((np.sin(theta), -np.sin(theta))),
z )
x = np.arange(1000)
gp.plot( (x*x, dict(histogram= True,
binwidth = 20000,
legend = 'Frequency')),
(x*x, dict(histogram='cumulative',
legend = 'Cumulative',
y2 = True )),
ylabel = 'Histogram frequency',
y2label = 'Cumulative sum',
_set='key opaque',
hardcopy = 'A-density-and-cumulative-histogram-of-x-2-are-plotted-on-the-same-plot.svg' )
gp.plot( (x*x, dict(histogram=True,
binwidth =20000,
legend = 'Frequency')),
(x*x, dict(histogram='cumulative',
legend = 'Cumulative')),
_xmin=0, _xmax=1e6,
multiplot='title "multiplot histograms" layout 2,1',
_set=('lmargin at screen 0.05',
'key opaque'),
hardcopy = 'Same-histograms-but-plotted-on-two-separate-plots.svg')
try:
modname = sys.argv[1]
arg1 = sys.argv[1]
except:
raise Exception("Need main module name as the first cmdline arg")
raise Exception("Need main module name or 'DOCUMENTATION-PLOTS' as the first cmdline arg")
if arg1 == 'DOCUMENTATION-PLOTS':
generate_plots()
sys.exit(0)
modname = arg1
exec( 'import {} as mod'.format(modname) )
import inspect
......@@ -86,8 +157,26 @@ the [[https://github.com/dkogan/talk-numpysane-gnuplotlib/raw/master/numpysane-g
sio = StringIO(s)
for l in sio:
# if we have a figure made with DOCUMENTATION-PLOTS, place it
m = re.match(r'^ \[ (.*) \]$', l)
if m is not None:
tag = m.group(1)
tag = re.sub(r'[^a-zA-Z0-9_]+','-', tag)
plot_filename = f"{tag}.svg"
if os.path.isfile(plot_filename):
if in_quote is not None:
if in_quote == 'example': f.write('#+END_EXAMPLE\n')
else: f.write('#+END_SRC\n')
f.write(f"[[file:{plot_filename}]]\n")
if in_quote is not None:
if in_quote == 'example': f.write('#+BEGIN_EXAMPLE\n')
else: f.write('#+BEGIN_SRC python\n')
continue
# handle links
l = re.sub( "([^ ]+) *\((https?://[^ ]+)\)", "[[\\2][\\1]]", l)
l = re.sub( r"([^ ]+) *\((https?://[^ ]+)\)",
r"[[\2][\1]]",
l)
if in_quote is None:
if len(l) <= 1:
......
......@@ -14,7 +14,7 @@ r'''a gnuplot-based plotting backend for numpy
g1 = gp.gnuplotlib(title = 'Parabola with error bars',
_with = 'xyerrorbars')
g1.plot( x**2 * 10, np.abs(x)/10, np.abs(x)*5,
g1.plot( x**2 * 10, np.abs(x)/10, np.abs(x)*25,
legend = 'Parabola',
tuplesize = 4 )
[ parabola with x,y errobars pops up in a new window ]
......@@ -25,6 +25,7 @@ r'''a gnuplot-based plotting backend for numpy
title = 'Heat map',
unset = 'grid',
cmds = 'set view map',
square = True,
_with = 'image',
tuplesize = 3)
[ Heat map pops up where first parabola used to be ]
......@@ -40,14 +41,21 @@ r'''a gnuplot-based plotting backend for numpy
x = np.arange(1000)
gp.plot( (x*x, dict(histogram=1,
binwidth =10000)),
(x*x, dict(histogram='cumulative', y2=1)))
gp.plot( (x*x, dict(histogram= True,
binwidth = 20000,
legend = 'Frequency')),
(x*x, dict(histogram='cumulative',
legend = 'Cumulative',
y2 = True )),
ylabel = 'Histogram frequency',
y2label = 'Cumulative sum')
[ A density and cumulative histogram of x^2 are plotted on the same plot ]
gp.plot( (x*x, dict(histogram=1,
binwidth =10000)),
(x*x, dict(histogram='cumulative')),
gp.plot( (x*x, dict(histogram=True,
binwidth =20000,
legend = 'Frequency')),
(x*x, dict(histogram='cumulative',
legend = 'Cumulative')),
_xmin=0, _xmax=1e6,
multiplot='title "multiplot histograms" layout 2,1',
_set='lmargin at screen 0.05')
......@@ -245,9 +253,19 @@ options".
A few helper global functions are available:
plot3d(...) is equivalent to plot(..., _3d=True)
plot3d(...)
is equivalent to
plot(..., _3d=True)
And
plotimage(...)
is equivalent to
plotimage(...) is equivalent to plot(..., _with='image', tuplesize=3)
plot(..., _with='image', tuplesize=3)
** Data arguments
......@@ -1100,7 +1118,7 @@ import numpysane as nps
gnuplot_executable='gnuplot'
# setup.py assumes the version is a simple string in '' quotes
__version__ = '0.41'
__version__ = '0.42'
# In a multiplot, the "process" options apply to the larger plot containing all
# the subplots, and the "subplot" options apply to each invididual plot.
......@@ -1172,7 +1190,7 @@ def _getGnuplotFeatures():
out = subprocess.check_output((gnuplot_executable, '-e', "set view equal"),
stderr=subprocess.STDOUT,
env=env).decode()
if re.search("(undefined variable)|(unrecognized option)", out, re.I):
if re.search(r"(undefined variable)|(unrecognized option)", out, re.I):
equal_3d_works = False
except:
equal_3d_works = False
......@@ -1223,7 +1241,7 @@ def _data_dump_only(processOptions):
h = processOptions.get('hardcopy')
return \
type(h) is str and \
re.match(".*\.gp$", h)
re.match(r".*\.gp$", h)
return \
processOptions.get('dump') or \
processOptions.get('terminal') == 'gp' or \
......@@ -1391,7 +1409,7 @@ def _massageSubplotOptionsAndGetCmds(subplotOptions):
# This axis was set up with the 'set' plot option, so I don't touch
# it
if any ( re.match(" *set +{}range[\s=]".format(axis), s) for s in cmds ):
if any ( re.match(r" *set +{}range[\s=]".format(axis), s) for s in cmds ):
continue
# images generally have the origin at the top-left instead of the
......@@ -1543,7 +1561,7 @@ class gnuplotlib:
# What is the default terminal?
self._printGnuplotPipe( "show terminal\n" )
errorMessage, warnings = self._checkpoint('printwarnings')
m = re.match("terminal type is +(.+?) +", errorMessage, re.I)
m = re.match(r"terminal type is +(.+?) +", errorMessage, re.I)
if m:
self.terminal_default = m.group(1)
else:
......@@ -1663,6 +1681,51 @@ class gnuplotlib:
format(len(string), string))
def _receive_until_checkpoint_or_timeout(self, checkpoint, waitforever):
fromerr = ''
while not fromerr.endswith(checkpoint):
# if no data received in 5 seconds, the gnuplot process is stuck. This
# usually happens if the gnuplot process is not in a command mode, but in
# a data-receiving mode. I'm careful to avoid this situation, but bugs in
# this module and/or in gnuplot itself can make this happen
self._logEvent("Trying to read byte from gnuplot")
rlist,wlist,xlist = select.select([self.gnuplotProcess.stderr],[], [],
None if waitforever else 15)
if not rlist:
self._logEvent("Gnuplot read timed out")
self.checkpoint_stuck = True
raise GnuplotlibError(
r'''Gnuplot process no longer responding. This shouldn't happen... Is your X connection working?''')
# read a byte. I'd like to read "as many bytes as are
# available", but I don't know how to this in a very portable
# way (I just know there will be windows users complaining if I
# simply do a non-blocking read). Very little data will be
# coming in anyway, so doing this a byte at a time is an
# irrelevant inefficiency
byte = self.gnuplotProcess.stderr.read(1)
if len(byte) == 0:
# Did the child process die?
returncode = self.gnuplotProcess.poll()
if returncode is not None:
# Yep. It died.
raise Exception(f"gnuplot child died. returncode = {returncode}")
self._logEvent("read() returned no data")
continue
byte = byte.decode()
fromerr += byte
self._logEvent("Read byte '{}' ({}) from gnuplot child process".format(byte,
hex(ord(byte))))
self._logEvent(f"Read string from gnuplot: '{fromerr}'")
return fromerr
# syncronizes the child and parent processes. After _checkpoint() returns, I
# know that I've read all the data from the child. Extra data that represents
# errors is returned. Warnings are explicitly stripped out
......@@ -1677,10 +1740,10 @@ class gnuplotlib:
# yet arrived. I thus print out a checkpoint message and keep reading the
# child's STDERR pipe until I get that message back. Any errors would have
# been printed before this
waitforever = re.search('waitforever', flags)
final = re.search('final', flags)
printwarnings = re.search('printwarnings', flags)
ignore_known_test_failures = re.search('ignore_known_test_failures', flags)
waitforever = re.search(r'waitforever', flags)
final = re.search(r'final', flags)
printwarnings = re.search(r'printwarnings', flags)
ignore_known_test_failures = re.search(r'ignore_known_test_failures', flags)
# I always checkpoint() before exiting. Even if notest==1. Without this
# 'set terminal dumb' plots don't end up rendering anything: we kill the
......@@ -1698,47 +1761,7 @@ class gnuplotlib:
if not self.gnuplotProcess or not self.gnuplotProcess.stderr:
return '',[]
fromerr = ''
while not fromerr.endswith(checkpoint):
# if no data received in 5 seconds, the gnuplot process is stuck. This
# usually happens if the gnuplot process is not in a command mode, but in
# a data-receiving mode. I'm careful to avoid this situation, but bugs in
# this module and/or in gnuplot itself can make this happen
self._logEvent("Trying to read byte from gnuplot")
rlist,wlist,xlist = select.select([self.gnuplotProcess.stderr],[], [],
None if waitforever else 15)
if rlist:
# read a byte. I'd like to read "as many bytes as are
# available", but I don't know how to this in a very portable
# way (I just know there will be windows users complaining if I
# simply do a non-blocking read). Very little data will be
# coming in anyway, so doing this a byte at a time is an
# irrelevant inefficiency
byte = self.gnuplotProcess.stderr.read(1)
if len(byte) == 0:
# Did the child process die?
returncode = self.gnuplotProcess.poll()
if returncode is not None:
# Yep. It died.
raise Exception(f"gnuplot child died. returncode = {returncode}")
byte = byte.decode()
fromerr += byte
if byte is not None and len(byte):
self._logEvent("Read byte '{}' ({}) from gnuplot child process".format(byte,
hex(ord(byte))))
else:
self._logEvent("read() returned no data")
else:
self._logEvent("Gnuplot read timed out")
self.checkpoint_stuck = True
raise GnuplotlibError(
r'''Gnuplot process no longer responding. This shouldn't happen... Is your X connection working?''')
self._logEvent(f"Read string from gnuplot: '{fromerr}'")
fromerr = self._receive_until_checkpoint_or_timeout(checkpoint, waitforever)
m = re.search(rf'\s*(.*?)\s*{checkpoint}$', fromerr, re.M + re.S)
if m is None:
......@@ -1945,8 +1968,8 @@ labels with spaces in them
# to test the plot I plot a single record
fmtTest = fmt
fmtTest = re.sub('record=\d+', 'record=1', fmtTest)
fmtTest = re.sub('array=\(\d+,\d+\)', 'array=(2, 2)', fmtTest)
fmtTest = re.sub(r'record=\d+', 'record=1', fmtTest)
fmtTest = re.sub(r'array=\(\d+,\d+\)', 'array=(2, 2)', fmtTest)
return fmt,fmtTest
......@@ -2174,7 +2197,7 @@ labels with spaces in them
curve['using'] = '(histbin($1)):(1.0) smooth ' + histogram_type
if 'with' not in curve:
if re.match('freq|fnorm', histogram_type) and 'with' not in curve:
if re.match(r'freq|fnorm', histogram_type) and 'with' not in curve:
curve['with'] = 'boxes fill solid border lt -1'
else:
curve['with'] = 'lines'
......@@ -2736,35 +2759,77 @@ def plotimage(*curves, **jointOptions):
plot(*curves, **jointOptions)
def wait():
r'''Waits until the open interactive plot window is closed
def wait(*args):
r'''Waits until the given interactive plot window(s) are closed
SYNOPSIS
import numpy as np
import gnuplotlib as gp
gp.plot(np.arange(5))
### Waiting for the global plot window
gp.plot(...)
# interactive plot pops up
gp.wait()
# We get here when the user closes the plot window
### Waiting on some arbitrary plots
plot0 = gp.gnuplotlib(...)
plot1 = gp.gnuplotlib(...)
plot0.plot(...)
plot1.plot(...)
gp.wait(plot0,plot1)
# We get here when the user closes the plot windows
DESCRIPTION
This applies to the global gnuplotlib object.
Wait for the interactive plot window(s) to be closed by the user. Without
any argument this applies to the global gnuplotlib object. Or the specific
plots to wait for can be given in arguments (in-line or as a single
iterable):
- wait() waits on the global gnuplot object
It's not at all trivial to detect if a current plot window exists. If not,
this function will end up waiting forever, and the user will need to Ctrl-C
- wait(plot0,plot1)
- wait((plot0,plot1),) both wait on the given gnuplotlib objects
It's not at all trivial to detect if a plot object has an open plot window.
If it does not, this function will end up waiting forever, and the user will
need to Ctrl-C
'''
global globalplot
if not globalplot:
raise GnuplotlibError("There isn't a plot to wait on")
globalplot.wait()
if len(args) == 0:
if not globalplot:
raise GnuplotlibError("There isn't a plot to wait on")
plots = (globalplot,)
elif all(isinstance(p,gnuplotlib) for p in args):
plots = args
elif len(args) == 1:
plots = args[0]
else:
raise Exception("gnuplotlib.wait() takes an inline list of plots or a single list-of-plots argumnent. Got neither")
if len(plots) == 1:
# Special-case if we have exactly one plot to wait on. Can avoid forking
# in this case, so I do that
plots[0].wait()
return
# N plots
pids = [0] * len(plots)
for i,plot in enumerate(plots):
pid = os.fork()
if pid == 0:
# child
plot.wait()
os._exit(0)
pids[i] = pid
for pid in pids:
os.waitpid(pid,0)
def add_plot_option(d,
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment