demo + utils venv

This commit is contained in:
d3m1g0d
2019-02-03 13:40:10 +01:00
parent 5fa112490b
commit cfa9c8ea23
5994 changed files with 1353819 additions and 0 deletions
@@ -0,0 +1,11 @@
import os
# Check that the test directories exist
if not os.path.exists(os.path.join(
os.path.dirname(__file__), 'baseline_images')):
raise IOError(
'The baseline image directory does not exist. '
'This is most likely because the test data is not installed. '
'You may need to install matplotlib from source to get the '
'test data.')
File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

@@ -0,0 +1,580 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="345.6pt" version="1.1" viewBox="0 0 460.8 345.6" width="460.8pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 345.6
L 460.8 345.6
L 460.8 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="patch_2">
<path d="M 57.6 307.584
L 414.72 307.584
L 414.72 41.472
L 57.6 41.472
z
" style="fill:#ffffff;"/>
</g>
<g id="pane3d_1">
<g id="patch_3">
<path d="M 103.645013 249.524693
L 204.185554 184.643006
L 204.185554 54.879632
L 103.645013 119.761319
" style="fill:#f2f2f2;opacity:0.5;stroke:#f2f2f2;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_2">
<g id="patch_4">
<path d="M 204.185554 184.643006
L 378.326878 222.102465
L 378.326878 92.339091
L 204.185554 54.879632
" style="fill:#e6e6e6;opacity:0.5;stroke:#e6e6e6;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_3">
<g id="patch_5">
<path d="M 103.645013 249.524693
L 277.786338 286.984152
L 378.326878 222.102465
L 204.185554 184.643006
" style="fill:#ececec;opacity:0.5;stroke:#ececec;stroke-linejoin:miter;"/>
</g>
</g>
<g id="axis3d_1">
<g id="line2d_1">
<path d="M 103.645013 249.524693
L 277.786338 286.984152
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="Line3DCollection_1">
<path d="M 107.12784 250.273882
L 207.66838 185.392195
L 207.66838 55.628821
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 140.562974 257.466098
L 241.103515 192.584411
L 241.103515 62.821037
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 173.998109 264.658314
L 274.538649 199.776627
L 274.538649 70.013253
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 207.433243 271.850531
L 307.973783 206.968844
L 307.973783 77.205469
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 240.868377 279.042747
L 341.408918 214.16106
L 341.408918 84.397686
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 274.303511 286.234963
L 374.844052 221.353276
L 374.844052 91.589902
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
</g>
<g id="xtick_1">
<g id="line2d_2">
<path d="M 107.932164 249.754828
L 105.519191 251.311989
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_1">
<!-- 0.0 -->
<defs>
<path d="M 31.78125 66.40625
Q 24.171875 66.40625 20.328125 58.90625
Q 16.5 51.421875 16.5 36.375
Q 16.5 21.390625 20.328125 13.890625
Q 24.171875 6.390625 31.78125 6.390625
Q 39.453125 6.390625 43.28125 13.890625
Q 47.125 21.390625 47.125 36.375
Q 47.125 51.421875 43.28125 58.90625
Q 39.453125 66.40625 31.78125 66.40625
M 31.78125 74.21875
Q 44.046875 74.21875 50.515625 64.515625
Q 56.984375 54.828125 56.984375 36.375
Q 56.984375 17.96875 50.515625 8.265625
Q 44.046875 -1.421875 31.78125 -1.421875
Q 19.53125 -1.421875 13.0625 8.265625
Q 6.59375 17.96875 6.59375 36.375
Q 6.59375 54.828125 13.0625 64.515625
Q 19.53125 74.21875 31.78125 74.21875
" id="DejaVuSans-30"/>
<path d="M 10.6875 12.40625
L 21 12.40625
L 21 0
L 10.6875 0
z
" id="DejaVuSans-2e"/>
</defs>
<g transform="translate(92.052333 271.664175)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
<path d="M 141.367299 256.947045
L 138.954326 258.504205
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_2">
<!-- 0.2 -->
<defs>
<path d="M 19.1875 8.296875
L 53.609375 8.296875
L 53.609375 0
L 7.328125 0
L 7.328125 8.296875
Q 12.9375 14.109375 22.625 23.890625
Q 32.328125 33.6875 34.8125 36.53125
Q 39.546875 41.84375 41.421875 45.53125
Q 43.3125 49.21875 43.3125 52.78125
Q 43.3125 58.59375 39.234375 62.25
Q 35.15625 65.921875 28.609375 65.921875
Q 23.96875 65.921875 18.8125 64.3125
Q 13.671875 62.703125 7.8125 59.421875
L 7.8125 69.390625
Q 13.765625 71.78125 18.9375 73
Q 24.125 74.21875 28.421875 74.21875
Q 39.75 74.21875 46.484375 68.546875
Q 53.21875 62.890625 53.21875 53.421875
Q 53.21875 48.921875 51.53125 44.890625
Q 49.859375 40.875 45.40625 35.40625
Q 44.1875 33.984375 37.640625 27.21875
Q 31.109375 20.453125 19.1875 8.296875
" id="DejaVuSans-32"/>
</defs>
<g transform="translate(125.487467 278.856391)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="xtick_3">
<g id="line2d_4">
<path d="M 174.802433 264.139261
L 172.38946 265.696421
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_3">
<!-- 0.4 -->
<defs>
<path d="M 37.796875 64.3125
L 12.890625 25.390625
L 37.796875 25.390625
z
M 35.203125 72.90625
L 47.609375 72.90625
L 47.609375 25.390625
L 58.015625 25.390625
L 58.015625 17.1875
L 47.609375 17.1875
L 47.609375 0
L 37.796875 0
L 37.796875 17.1875
L 4.890625 17.1875
L 4.890625 26.703125
z
" id="DejaVuSans-34"/>
</defs>
<g transform="translate(158.922601 286.048608)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="xtick_4">
<g id="line2d_5">
<path d="M 208.237567 271.331477
L 205.824594 272.888638
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_4">
<!-- 0.6 -->
<defs>
<path d="M 33.015625 40.375
Q 26.375 40.375 22.484375 35.828125
Q 18.609375 31.296875 18.609375 23.390625
Q 18.609375 15.53125 22.484375 10.953125
Q 26.375 6.390625 33.015625 6.390625
Q 39.65625 6.390625 43.53125 10.953125
Q 47.40625 15.53125 47.40625 23.390625
Q 47.40625 31.296875 43.53125 35.828125
Q 39.65625 40.375 33.015625 40.375
M 52.59375 71.296875
L 52.59375 62.3125
Q 48.875 64.0625 45.09375 64.984375
Q 41.3125 65.921875 37.59375 65.921875
Q 27.828125 65.921875 22.671875 59.328125
Q 17.53125 52.734375 16.796875 39.40625
Q 19.671875 43.65625 24.015625 45.921875
Q 28.375 48.1875 33.59375 48.1875
Q 44.578125 48.1875 50.953125 41.515625
Q 57.328125 34.859375 57.328125 23.390625
Q 57.328125 12.15625 50.6875 5.359375
Q 44.046875 -1.421875 33.015625 -1.421875
Q 20.359375 -1.421875 13.671875 8.265625
Q 6.984375 17.96875 6.984375 36.375
Q 6.984375 53.65625 15.1875 63.9375
Q 23.390625 74.21875 37.203125 74.21875
Q 40.921875 74.21875 44.703125 73.484375
Q 48.484375 72.75 52.59375 71.296875
" id="DejaVuSans-36"/>
</defs>
<g transform="translate(192.357736 293.240824)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-36"/>
</g>
</g>
</g>
<g id="xtick_5">
<g id="line2d_6">
<path d="M 241.672701 278.523693
L 239.259728 280.080854
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_5">
<!-- 0.8 -->
<defs>
<path d="M 31.78125 34.625
Q 24.75 34.625 20.71875 30.859375
Q 16.703125 27.09375 16.703125 20.515625
Q 16.703125 13.921875 20.71875 10.15625
Q 24.75 6.390625 31.78125 6.390625
Q 38.8125 6.390625 42.859375 10.171875
Q 46.921875 13.96875 46.921875 20.515625
Q 46.921875 27.09375 42.890625 30.859375
Q 38.875 34.625 31.78125 34.625
M 21.921875 38.8125
Q 15.578125 40.375 12.03125 44.71875
Q 8.5 49.078125 8.5 55.328125
Q 8.5 64.0625 14.71875 69.140625
Q 20.953125 74.21875 31.78125 74.21875
Q 42.671875 74.21875 48.875 69.140625
Q 55.078125 64.0625 55.078125 55.328125
Q 55.078125 49.078125 51.53125 44.71875
Q 48 40.375 41.703125 38.8125
Q 48.828125 37.15625 52.796875 32.3125
Q 56.78125 27.484375 56.78125 20.515625
Q 56.78125 9.90625 50.3125 4.234375
Q 43.84375 -1.421875 31.78125 -1.421875
Q 19.734375 -1.421875 13.25 4.234375
Q 6.78125 9.90625 6.78125 20.515625
Q 6.78125 27.484375 10.78125 32.3125
Q 14.796875 37.15625 21.921875 38.8125
M 18.3125 54.390625
Q 18.3125 48.734375 21.84375 45.5625
Q 25.390625 42.390625 31.78125 42.390625
Q 38.140625 42.390625 41.71875 45.5625
Q 45.3125 48.734375 45.3125 54.390625
Q 45.3125 60.0625 41.71875 63.234375
Q 38.140625 66.40625 31.78125 66.40625
Q 25.390625 66.40625 21.84375 63.234375
Q 18.3125 60.0625 18.3125 54.390625
" id="DejaVuSans-38"/>
</defs>
<g transform="translate(225.79287 300.43304)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-38"/>
</g>
</g>
</g>
<g id="xtick_6">
<g id="line2d_7">
<path d="M 275.107836 285.715909
L 272.694863 287.27307
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_6">
<!-- 1.0 -->
<defs>
<path d="M 12.40625 8.296875
L 28.515625 8.296875
L 28.515625 63.921875
L 10.984375 60.40625
L 10.984375 69.390625
L 28.421875 72.90625
L 38.28125 72.90625
L 38.28125 8.296875
L 54.390625 8.296875
L 54.390625 0
L 12.40625 0
z
" id="DejaVuSans-31"/>
</defs>
<g transform="translate(259.228004 307.625256)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
</g>
<g id="axis3d_2">
<g id="line2d_8">
<path d="M 378.326878 222.102465
L 277.786338 286.984152
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="Line3DCollection_2">
<path d="M 105.655824 118.463685
L 105.655824 248.227059
L 279.797149 285.686518
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 124.959608 106.006401
L 124.959608 235.769775
L 299.100932 273.229234
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 144.263392 93.549117
L 144.263392 223.312491
L 318.404716 260.771951
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 163.567176 81.091833
L 163.567176 210.855207
L 337.7085 248.314667
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 182.870959 68.634549
L 182.870959 198.397923
L 357.012284 235.857383
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 202.174743 56.177265
L 202.174743 185.940639
L 376.316068 223.400099
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
</g>
<g id="xtick_7">
<g id="line2d_9">
<path d="M 278.404018 285.386843
L 282.58341 286.28587
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_7">
<!-- 0.0 -->
<g transform="translate(284.18462 305.13377)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_8">
<g id="line2d_10">
<path d="M 297.707802 272.929559
L 301.887194 273.828586
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_8">
<!-- 0.2 -->
<g transform="translate(303.488404 292.676486)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="xtick_9">
<g id="line2d_11">
<path d="M 317.011586 260.472275
L 321.190977 261.371302
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_9">
<!-- 0.4 -->
<g transform="translate(322.792188 280.219203)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="xtick_10">
<g id="line2d_12">
<path d="M 336.315369 248.014991
L 340.494761 248.914018
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_10">
<!-- 0.6 -->
<g transform="translate(342.095972 267.761919)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-36"/>
</g>
</g>
</g>
<g id="xtick_11">
<g id="line2d_13">
<path d="M 355.619153 235.557707
L 359.798545 236.456734
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_11">
<!-- 0.8 -->
<g transform="translate(361.399755 255.304635)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-38"/>
</g>
</g>
</g>
<g id="xtick_12">
<g id="line2d_14">
<path d="M 374.922937 223.100423
L 379.102329 223.99945
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_12">
<!-- 1.0 -->
<g transform="translate(380.703539 242.847351)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
</g>
<g id="axis3d_3">
<g id="line2d_15">
<path d="M 378.326878 222.102465
L 378.326878 92.339091
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="Line3DCollection_3">
<path d="M 378.326878 219.507198
L 204.185554 182.047738
L 103.645013 246.929425
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 378.326878 194.59263
L 204.185554 157.13317
L 103.645013 222.014857
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 378.326878 169.678062
L 204.185554 132.218603
L 103.645013 197.10029
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 378.326878 144.763494
L 204.185554 107.304035
L 103.645013 172.185722
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 378.326878 119.848926
L 204.185554 82.389467
L 103.645013 147.271154
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
<path d="M 378.326878 94.934359
L 204.185554 57.474899
L 103.645013 122.356586
" style="fill:none;stroke:#b0b0b0;stroke-width:0.8;"/>
</g>
<g id="xtick_13">
<g id="line2d_16">
<path d="M 376.933748 219.207522
L 381.11314 220.106549
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_13">
<!-- 0.0 -->
<g transform="translate(389.838295 225.162594)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
<g id="xtick_14">
<g id="line2d_17">
<path d="M 376.933748 194.292954
L 381.11314 195.191981
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_14">
<!-- 0.2 -->
<g transform="translate(389.838295 200.248026)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-32"/>
</g>
</g>
</g>
<g id="xtick_15">
<g id="line2d_18">
<path d="M 376.933748 169.378386
L 381.11314 170.277413
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_15">
<!-- 0.4 -->
<g transform="translate(389.838295 175.333458)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-34"/>
</g>
</g>
</g>
<g id="xtick_16">
<g id="line2d_19">
<path d="M 376.933748 144.463819
L 381.11314 145.362846
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_16">
<!-- 0.6 -->
<g transform="translate(389.838295 150.41889)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-36"/>
</g>
</g>
</g>
<g id="xtick_17">
<g id="line2d_20">
<path d="M 376.933748 119.549251
L 381.11314 120.448278
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_17">
<!-- 0.8 -->
<g transform="translate(389.838295 125.504323)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-30"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-38"/>
</g>
</g>
</g>
<g id="xtick_18">
<g id="line2d_21">
<path d="M 376.933748 94.634683
L 381.11314 95.53371
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.8;"/>
</g>
<g id="text_18">
<!-- 1.0 -->
<g transform="translate(389.838295 100.589755)scale(0.1 -0.1)">
<use xlink:href="#DejaVuSans-31"/>
<use x="63.623047" xlink:href="#DejaVuSans-2e"/>
<use x="95.410156" xlink:href="#DejaVuSans-30"/>
</g>
</g>
</g>
</g>
<g id="axes_1"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

@@ -0,0 +1,997 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="432pt" version="1.1" viewBox="0 0 576 432" width="576pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 432
L 576 432
L 576 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="patch_2">
<path d="M 72 388.8
L 518.4 388.8
L 518.4 43.2
L 72 43.2
z
" style="fill:#ffffff;"/>
</g>
<g id="pane3d_1">
<g id="patch_3">
<path d="M 131.177218 312.43458
L 258.939234 227.701291
L 256.812132 65.789882
L 121.926546 141.921
" style="fill:#f2f2f2;opacity:0.5;stroke:#f2f2f2;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_2">
<g id="patch_4">
<path d="M 258.939234 227.701291
L 465.901687 275.072667
L 474.560748 108.278886
L 256.812132 65.789882
" style="fill:#e6e6e6;opacity:0.5;stroke:#e6e6e6;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_3">
<g id="patch_5">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
L 465.901687 275.072667
L 258.939234 227.701291
" style="fill:#ececec;opacity:0.5;stroke:#ececec;stroke-linejoin:miter;"/>
</g>
</g>
<g id="axis3d_1">
<g id="line2d_1">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_1">
<path d="M 135.341407 313.489655
L 262.91012 228.610182
L 260.98105 66.603357
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 185.898981 326.299368
L 311.080141 239.635758
L 311.581097 76.476879
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 237.565599 339.390079
L 360.229327 250.885453
L 363.262586 86.56142
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 290.378159 352.771135
L 410.387838 262.366172
L 416.060561 96.86382
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 344.375213 366.452305
L 461.587089 274.085104
L 470.011596 107.391216
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_1">
<g id="line2d_2">
<path d="M 136.440324 312.758477
L 133.139482 314.954734
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
<path d="M 186.978165 325.552244
L 183.736553 327.79643
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_3">
<g id="line2d_4">
<path d="M 238.623915 338.62648
L 235.444941 340.920181
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_4">
<g id="line2d_5">
<path d="M 291.414412 351.990512
L 288.301669 354.335385
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_5">
<g id="line2d_6">
<path d="M 345.388141 365.654082
L 342.345417 368.051858
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_2">
<g id="line2d_7">
<path d="M 465.901687 275.072667
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_2">
<path d="M 124.83963 140.276819
L 133.925947 310.61159
L 351.454544 365.608914
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 147.806962 127.313768
L 155.613677 296.228029
L 371.363131 349.859733
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 170.190782 114.680059
L 176.778102 282.191531
L 390.769477 334.507862
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 192.013047 102.363299
L 197.437937 268.489682
L 409.692352 319.538453
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 213.294627 90.351708
L 217.611014 255.110658
L 428.1496 304.937391
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 234.055372 78.634083
L 237.314336 242.04318
L 446.158198 290.691243
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 254.31417 67.199763
L 256.564121 229.276494
L 463.734308 276.787226
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_6">
<g id="line2d_8">
<path d="M 349.633738 365.148563
L 355.10024 366.530648
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_7">
<g id="line2d_9">
<path d="M 369.558238 349.411067
L 374.976914 350.758059
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_8">
<g id="line2d_10">
<path d="M 388.980278 334.070441
L 394.351787 335.38366
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_9">
<g id="line2d_11">
<path d="M 407.91863 319.11186
L 413.243626 320.392561
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_10">
<g id="line2d_12">
<path d="M 426.39114 304.521228
L 431.67027 305.770604
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_11">
<g id="line2d_13">
<path d="M 444.414786 290.285133
L 449.648694 291.504319
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_12">
<g id="line2d_14">
<path d="M 462.005733 276.390809
L 467.195055 277.580886
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_3">
<g id="line2d_15">
<path d="M 465.901687 275.072667
L 474.560748 108.278886
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_3">
<path d="M 466.066381 271.900274
L 258.89869 224.615172
L 131.001569 309.196909
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 468.068718 233.330576
L 258.406032 187.114858
L 128.865116 269.816616
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 470.120301 193.812297
L 257.901772 148.731448
L 126.674356 229.435289
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 472.222968 153.310006
L 257.385496 109.433377
L 124.42719 188.014268
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 474.378652 111.786488
L 256.856768 69.187556
L 122.121412 145.512876
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_13">
<g id="line2d_16">
<path d="M 464.337863 271.505747
L 469.527014 272.690148
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_14">
<g id="line2d_17">
<path d="M 466.318508 232.944779
L 471.572824 234.102983
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_15">
<g id="line2d_18">
<path d="M 468.347848 193.435781
L 473.668985 194.566132
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_16">
<g id="line2d_19">
<path d="M 470.4277 152.943356
L 475.817377 154.044099
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_17">
<g id="line2d_20">
<path d="M 472.559975 111.430323
L 478.01998 112.499596
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axes_1">
<g id="patch_6">
<path clip-path="url(#p21179d0b58)" d="M 260.499651 227.097258
L 268.156793 228.848353
L 268.156793 228.848353
L 260.499651 227.097258
L 260.499651 227.097258
L 260.499651 227.097258
" style="fill:#00bfbf;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_7">
<path clip-path="url(#p21179d0b58)" d="M 270.074909 229.287003
L 277.76275 231.045119
L 277.708309 223.58529
L 270.002751 221.835072
L 270.074909 229.287003
L 270.074909 229.287003
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_8">
<path clip-path="url(#p21179d0b58)" d="M 279.688564 231.485529
L 287.407289 233.250708
L 287.342871 218.276467
L 279.588343 216.527207
L 279.688564 231.485529
L 279.688564 231.485529
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_9">
<path clip-path="url(#p21179d0b58)" d="M 289.340847 233.69289
L 297.090643 235.465174
L 297.061569 212.921283
L 289.257507 211.173065
L 289.340847 233.69289
L 289.340847 233.69289
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_10">
<path clip-path="url(#p21179d0b58)" d="M 299.031992 235.909137
L 306.813047 237.68857
L 306.865508 207.51913
L 299.01134 205.77204
L 299.031992 235.909137
L 299.031992 235.909137
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_11">
<path clip-path="url(#p21179d0b58)" d="M 308.762234 238.134326
L 316.574737 239.92095
L 316.755816 202.069386
L 308.85096 200.323511
L 308.762234 238.134326
L 308.762234 238.134326
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_12">
<path clip-path="url(#p21179d0b58)" d="M 221.567951 252.927395
L 229.342356 254.7622
L 229.342356 254.7622
L 221.567951 252.927395
L 221.567951 252.927395
L 221.567951 252.927395
" style="fill:#00bfbf;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_13">
<path clip-path="url(#p21179d0b58)" d="M 318.531811 240.368509
L 326.375953 242.162369
L 326.733638 196.57142
L 318.777503 194.82685
L 318.531811 240.368509
L 318.531811 240.368509
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_14">
<path clip-path="url(#p21179d0b58)" d="M 231.289938 255.221841
L 239.096252 257.064177
L 238.948695 249.488986
L 231.124117 247.654725
L 231.289938 255.221841
L 231.289938 255.221841
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_15">
<path clip-path="url(#p21179d0b58)" d="M 328.34096 242.611743
L 336.216934 244.412883
L 336.800141 191.024589
L 328.792127 189.281416
L 328.34096 242.611743
L 328.34096 242.611743
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_16">
<path clip-path="url(#p21179d0b58)" d="M 241.051836 257.525707
L 248.890254 259.37562
L 248.640551 244.168829
L 240.765212 242.335195
L 241.051836 257.525707
L 241.051836 257.525707
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_17">
<path clip-path="url(#p21179d0b58)" d="M 338.189924 244.864081
L 346.097924 246.672545
L 346.956513 185.428239
L 338.896008 183.686557
L 338.189924 244.864081
L 338.189924 244.864081
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_18">
<path clip-path="url(#p21179d0b58)" d="M 250.853889 259.839049
L 258.72461 261.696586
L 258.419069 238.801101
L 250.492374 236.968177
L 250.853889 259.839049
L 250.853889 259.839049
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_19">
<path clip-path="url(#p21179d0b58)" d="M 348.078945 247.125581
L 356.019167 248.941413
L 357.203963 179.781703
L 349.090345 178.041609
L 348.078945 247.125581
L 348.078945 247.125581
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_20">
<path clip-path="url(#p21179d0b58)" d="M 260.696346 262.161927
L 268.599571 264.027135
L 268.285419 233.385159
L 260.30676 231.553033
L 260.696346 262.161927
L 260.696346 262.161927
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_21">
<path clip-path="url(#p21179d0b58)" d="M 358.008267 249.396296
L 365.980908 251.219543
L 367.543722 174.084303
L 359.376359 172.345897
L 358.008267 249.396296
L 358.008267 249.396296
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_22">
<path clip-path="url(#p21179d0b58)" d="M 270.579458 264.494399
L 278.515388 266.367326
L 278.240787 227.920352
L 270.209548 226.089112
L 270.579458 264.494399
L 270.579458 264.494399
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_23">
<path clip-path="url(#p21179d0b58)" d="M 180.753946 280.00639
L 188.648137 281.931054
L 188.648137 281.931054
L 180.753946 280.00639
L 180.753946 280.00639
L 180.753946 280.00639
" style="fill:#00bfbf;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_24">
<path clip-path="url(#p21179d0b58)" d="M 367.978138 251.676285
L 375.983398 253.506991
L 377.977041 168.33535
L 369.755292 166.598732
L 367.978138 251.676285
L 367.978138 251.676285
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_25">
<path clip-path="url(#p21179d0b58)" d="M 280.503477 266.836526
L 288.472315 268.717219
L 288.286385 222.406015
L 280.201938 220.575753
L 280.503477 266.836526
L 280.503477 266.836526
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_26">
<path clip-path="url(#p21179d0b58)" d="M 190.625825 282.41323
L 198.553201 284.345986
L 198.303435 276.652891
L 190.357228 274.728385
L 190.625825 282.41323
L 190.625825 282.41323
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_27">
<path clip-path="url(#p21179d0b58)" d="M 377.988807 253.965604
L 386.026885 255.803815
L 388.505197 162.534139
L 380.228409 160.799415
L 377.988807 253.965604
L 377.988807 253.965604
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_28">
<path clip-path="url(#p21179d0b58)" d="M 290.468657 269.188367
L 298.470609 271.076875
L 298.423445 216.841472
L 290.285152 215.012282
L 290.468657 269.188367
L 290.468657 269.188367
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_29">
<path clip-path="url(#p21179d0b58)" d="M 200.539212 284.83019
L 208.499984 286.771088
L 208.046785 271.326594
L 200.047939 269.402329
L 200.539212 284.83019
L 200.539212 284.83019
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_30">
<path clip-path="url(#p21179d0b58)" d="M 388.040524 256.26431
L 396.111623 258.110072
L 399.12949 156.679956
L 390.796997 154.947232
L 388.040524 256.26431
L 388.040524 256.26431
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_31">
<path clip-path="url(#p21179d0b58)" d="M 300.475254 271.549984
L 308.510528 273.446355
L 308.653222 211.226033
L 300.460434 209.398011
L 300.475254 271.549984
L 300.475254 271.549984
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_32">
<path clip-path="url(#p21179d0b58)" d="M 210.49437 287.257335
L 218.488749 289.206427
L 217.879397 265.9515
L 209.82728 264.027562
L 210.49437 287.257335
L 210.49437 287.257335
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_33">
<path clip-path="url(#p21179d0b58)" d="M 398.133543 258.572461
L 406.237867 260.425821
L 409.851241 150.772072
L 401.462368 149.041457
L 398.133543 258.572461
L 398.133543 258.572461
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_34">
<path clip-path="url(#p21179d0b58)" d="M 310.523529 273.921436
L 318.592331 275.82572
L 318.976993 205.558999
L 310.729051 203.732242
L 310.523529 273.921436
L 310.523529 273.921436
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_35">
<path clip-path="url(#p21179d0b58)" d="M 220.491563 289.694728
L 228.519763 291.652065
L 227.802504 260.526937
L 219.696471 258.603413
L 220.491563 289.694728
L 220.491563 289.694728
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_36">
<path clip-path="url(#p21179d0b58)" d="M 408.268119 260.890115
L 416.405873 262.751121
L 420.671798 144.809743
L 412.225858 143.081351
L 408.268119 260.890115
L 408.268119 260.890115
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_37">
<path clip-path="url(#p21179d0b58)" d="M 320.613741 276.302785
L 328.716283 278.215033
L 329.39606 199.839653
L 321.092292 198.014264
L 320.613741 276.302785
L 320.613741 276.302785
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_38">
<path clip-path="url(#p21179d0b58)" d="M 230.531059 292.142435
L 238.593294 294.10807
L 237.817361 255.052218
L 229.656756 253.129197
L 230.531059 292.142435
L 230.531059 292.142435
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_39">
<path clip-path="url(#p21179d0b58)" d="M 418.444508 263.217332
L 426.6159 265.08603
L 431.592533 138.792215
L 423.088826 137.066159
L 418.444508 263.217332
L 418.444508 263.217332
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_40">
<path clip-path="url(#p21179d0b58)" d="M 137.917747 308.427057
L 145.93419 310.448348
L 145.93419 310.448348
L 137.917747 308.427057
L 137.917747 308.427057
L 137.917747 308.427057
" style="fill:#00bfbf;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_41">
<path clip-path="url(#p21179d0b58)" d="M 330.746155 278.694094
L 338.882648 280.614355
L 339.911748 194.067269
L 331.551472 192.243351
L 330.746155 278.694094
L 330.746155 278.694094
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_42">
<path clip-path="url(#p21179d0b58)" d="M 240.613126 294.600521
L 248.709614 296.574507
L 247.925245 249.526644
L 239.709404 247.60422
L 240.613126 294.600521
L 240.613126 294.600521
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_43">
<path clip-path="url(#p21179d0b58)" d="M 428.662971 265.554171
L 436.868209 267.430609
L 442.614843 132.718716
L 434.052658 130.995116
L 428.662971 265.554171
L 428.662971 265.554171
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_44">
<path clip-path="url(#p21179d0b58)" d="M 147.94261 310.954757
L 155.993592 312.984756
L 155.631492 305.171263
L 147.561097 303.149684
L 147.94261 310.954757
L 147.94261 310.954757
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_45">
<path clip-path="url(#p21179d0b58)" d="M 340.921034 281.095426
L 349.091692 283.023749
L 350.525409 188.241106
L 342.107929 186.418765
L 340.921034 281.095426
L 340.921034 281.095426
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_46">
<path clip-path="url(#p21179d0b58)" d="M 250.738037 297.069052
L 258.868995 299.051443
L 258.12746 243.949504
L 249.855704 242.02777
L 250.738037 297.069052
L 250.738037 297.069052
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_47">
<path clip-path="url(#p21179d0b58)" d="M 438.923768 267.900691
L 447.163064 269.784918
L 453.740153 126.588463
L 445.118766 124.86744
L 438.923768 267.900691
L 438.923768 267.900691
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_48">
<path clip-path="url(#p21179d0b58)" d="M 158.010674 313.493349
L 166.096418 315.532113
L 165.419444 299.844847
L 157.294437 297.823064
L 158.010674 313.493349
L 158.010674 313.493349
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_49">
<path clip-path="url(#p21179d0b58)" d="M 351.138646 283.506842
L 359.343686 285.44328
L 361.238416 182.360407
L 352.763027 180.539753
L 351.138646 283.506842
L 351.138646 283.506842
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_50">
<path clip-path="url(#p21179d0b58)" d="M 260.906063 299.548096
L 269.071714 301.538945
L 268.425331 238.320072
L 260.096971 236.399126
L 260.906063 299.548096
L 260.906063 299.548096
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_51">
<path clip-path="url(#p21179d0b58)" d="M 449.227163 270.256952
L 457.500729 272.149016
L 464.969913 120.400656
L 456.288587 118.682334
L 449.227163 270.256952
L 449.227163 270.256952
" style="fill:#ff0000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_52">
<path clip-path="url(#p21179d0b58)" d="M 168.122219 316.042905
L 176.24295 318.090491
L 175.299323 294.468407
L 167.119032 292.446503
L 168.122219 316.042905
L 168.122219 316.042905
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_53">
<path clip-path="url(#p21179d0b58)" d="M 361.399262 285.928408
L 369.6389 287.873011
L 372.052173 176.424404
L 363.518154 174.605549
L 361.399262 285.928408
L 361.399262 285.928408
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_54">
<path clip-path="url(#p21179d0b58)" d="M 271.117483 302.037719
L 279.318047 304.03708
L 278.820211 232.637609
L 270.434545 230.717551
L 271.117483 302.037719
L 271.117483 302.037719
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_55">
<path clip-path="url(#p21179d0b58)" d="M 178.277526 318.603495
L 186.433472 320.65996
L 185.272431 289.041233
L 177.036172 287.019297
L 178.277526 318.603495
L 178.277526 318.603495
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_56">
<path clip-path="url(#p21179d0b58)" d="M 371.703154 288.360187
L 379.977609 290.313008
L 382.968106 170.432314
L 374.374726 168.615373
L 371.703154 288.360187
L 371.703154 288.360187
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_57">
<path clip-path="url(#p21179d0b58)" d="M 281.372573 304.537989
L 289.608276 306.545918
L 289.313477 226.901363
L 280.869791 224.982296
L 281.372573 304.537989
L 281.372573 304.537989
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_58">
<path clip-path="url(#p21179d0b58)" d="M 188.476881 321.175191
L 196.668272 323.240594
L 195.340093 283.562605
L 187.047171 281.540727
L 188.476881 321.175191
L 188.476881 321.175191
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_59">
<path clip-path="url(#p21179d0b58)" d="M 382.050595 290.802244
L 390.36009 292.763334
L 393.987672 164.383336
L 385.334186 162.568428
L 382.050595 290.802244
L 382.050595 290.802244
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_60">
<path clip-path="url(#p21179d0b58)" d="M 291.671614 307.048975
L 299.942683 309.065526
L 299.906532 221.110566
L 291.4041 219.192595
L 291.671614 307.048975
L 291.671614 307.048975
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_61">
<path clip-path="url(#p21179d0b58)" d="M 198.720571 323.758066
L 206.947638 325.832464
L 205.503661 278.031787
L 197.153367 276.010059
L 198.720571 323.758066
L 198.720571 323.758066
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_62">
<path clip-path="url(#p21179d0b58)" d="M 392.441863 293.254645
L 400.786619 295.224057
L 405.112352 158.276658
L 396.398001 156.463904
L 392.441863 293.254645
L 392.441863 293.254645
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_63">
<path clip-path="url(#p21179d0b58)" d="M 302.014891 309.570746
L 310.321553 311.595975
L 310.600806 215.264437
L 302.038888 213.34767
L 302.014891 309.570746
L 302.014891 309.570746
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_64">
<path clip-path="url(#p21179d0b58)" d="M 209.008885 326.352193
L 217.271862 328.435645
L 215.764511 272.44803
L 207.356125 270.426547
L 209.008885 326.352193
L 209.008885 326.352193
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_65">
<path clip-path="url(#p21179d0b58)" d="M 402.877236 295.717454
L 411.257479 297.695241
L 416.343657 152.11145
L 407.567671 150.300974
L 402.877236 295.717454
L 402.877236 295.717454
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_66">
<path clip-path="url(#p21179d0b58)" d="M 312.402687 312.103372
L 320.745173 314.137334
L 321.397758 209.362177
L 312.775601 207.446727
L 312.402687 312.103372
L 312.402687 312.103372
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_67">
<path clip-path="url(#p21179d0b58)" d="M 219.342116 328.957645
L 227.641238 331.050212
L 226.124048 266.810569
L 217.656835 264.78943
L 219.342116 328.957645
L 219.342116 328.957645
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_68">
<path clip-path="url(#p21179d0b58)" d="M 413.356996 298.190739
L 421.772953 300.176955
L 427.683129 145.886866
L 418.844721 144.078796
L 413.356996 298.190739
L 413.356996 298.190739
" style="fill:#008000;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_69">
<path clip-path="url(#p21179d0b58)" d="M 322.835293 314.646921
L 331.213834 316.689675
L 332.298873 203.402977
L 323.615711 201.488957
L 322.835293 314.646921
L 322.835293 314.646921
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_70">
<path clip-path="url(#p21179d0b58)" d="M 229.720558 331.574498
L 238.056064 333.676237
L 236.5837 261.118627
L 228.056915 259.097933
L 229.720558 331.574498
L 229.720558 331.574498
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_71">
<path clip-path="url(#p21179d0b58)" d="M 333.312997 317.201467
L 341.727828 319.253068
L 343.305665 197.386006
L 334.560718 195.473534
L 333.312997 317.201467
L 333.312997 317.201467
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_72">
<path clip-path="url(#p21179d0b58)" d="M 240.144509 334.202824
L 248.516638 336.313798
L 247.144928 255.37141
L 238.55781 253.351264
L 240.144509 334.202824
L 240.144509 334.202824
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_73">
<path clip-path="url(#p21179d0b58)" d="M 343.836093 319.767079
L 352.287451 321.827586
L 354.41968 191.310421
L 345.612153 189.399619
L 343.836093 319.767079
L 343.836093 319.767079
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_74">
<path clip-path="url(#p21179d0b58)" d="M 250.614269 336.842701
L 259.023263 338.962971
L 257.809217 249.568109
L 249.160992 247.548618
L 250.614269 336.842701
L 250.614269 336.842701
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_75">
<path clip-path="url(#p21179d0b58)" d="M 354.404877 322.34383
L 362.893 324.4133
L 365.64249 185.175362
L 356.771575 183.266353
L 354.404877 322.34383
L 354.404877 322.34383
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_76">
<path clip-path="url(#p21179d0b58)" d="M 261.13014 339.494205
L 269.576243 341.623831
L 268.578084 243.707899
L 259.867964 241.689173
L 261.13014 339.494205
L 261.13014 339.494205
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_77">
<path clip-path="url(#p21179d0b58)" d="M 365.019647 324.931793
L 373.544775 327.010285
L 376.975703 178.979951
L 368.040576 177.072862
L 365.019647 324.931793
L 365.019647 324.931793
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_78">
<path clip-path="url(#p21179d0b58)" d="M 271.692429 342.157413
L 280.175886 344.296458
L 279.453075 237.789938
L 270.680256 235.77209
L 271.692429 342.157413
L 271.692429 342.157413
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_79">
<path clip-path="url(#p21179d0b58)" d="M 375.680703 327.531041
L 384.243079 329.618615
L 388.420955 172.723292
L 379.420776 170.818256
L 375.680703 327.531041
L 375.680703 327.531041
" style="fill:#0000ff;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_80">
<path clip-path="url(#p21179d0b58)" d="M 282.301441 344.832402
L 290.822502 346.980928
L 290.435766 231.813369
L 281.599432 229.796515
L 282.301441 344.832402
L 282.301441 344.832402
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_81">
<path clip-path="url(#p21179d0b58)" d="M 292.95749 347.51925
L 301.516405 349.677321
L 301.527764 225.777317
L 292.627082 223.761576
L 292.95749 347.51925
L 292.95749 347.51925
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_82">
<path clip-path="url(#p21179d0b58)" d="M 303.660887 350.218037
L 312.257909 352.385717
L 312.730711 219.680888
L 303.764833 217.666385
L 303.660887 350.218037
L 303.660887 350.218037
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_83">
<path clip-path="url(#p21179d0b58)" d="M 314.41195 352.928843
L 323.047333 355.106195
L 324.046278 213.523174
L 315.01434 211.510034
L 314.41195 352.928843
L 314.41195 352.928843
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_84">
<path clip-path="url(#p21179d0b58)" d="M 325.210997 355.651748
L 333.884999 357.838837
L 335.476173 207.303245
L 326.377295 205.291599
L 325.210997 355.651748
L 325.210997 355.651748
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
<g id="patch_85">
<path clip-path="url(#p21179d0b58)" d="M 336.05835 358.386832
L 344.771232 360.583725
L 347.022138 201.020153
L 337.855423 199.010134
L 336.05835 358.386832
L 336.05835 358.386832
" style="fill:#bfbf00;opacity:0.8;stroke:#000000;stroke-linejoin:miter;"/>
</g>
</g>
</g>
<defs>
<clipPath id="p21179d0b58">
<rect height="345.6" width="446.4" x="72.0" y="43.2"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

@@ -0,0 +1,424 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="432pt" version="1.1" viewBox="0 0 576 432" width="576pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 432
L 576 432
L 576 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="patch_2">
<path d="M 72 388.8
L 518.4 388.8
L 518.4 43.2
L 72 43.2
z
" style="fill:#ffffff;"/>
</g>
<g id="pane3d_1">
<g id="patch_3">
<path d="M 131.177218 312.43458
L 258.939234 227.701291
L 256.812132 65.789882
L 121.926546 141.921
" style="fill:#f2f2f2;opacity:0.5;stroke:#f2f2f2;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_2">
<g id="patch_4">
<path d="M 258.939234 227.701291
L 465.901687 275.072667
L 474.560748 108.278886
L 256.812132 65.789882
" style="fill:#e6e6e6;opacity:0.5;stroke:#e6e6e6;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_3">
<g id="patch_5">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
L 465.901687 275.072667
L 258.939234 227.701291
" style="fill:#ececec;opacity:0.5;stroke:#ececec;stroke-linejoin:miter;"/>
</g>
</g>
<g id="axis3d_1">
<g id="line2d_1">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_1">
<path d="M 135.341407 313.489655
L 262.91012 228.610182
L 260.98105 66.603357
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 160.483807 319.859956
L 286.874573 234.095375
L 286.148026 71.514157
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 185.898981 326.299368
L 311.080141 239.635758
L 311.581097 76.476879
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 211.591391 332.809024
L 335.530482 245.232165
L 337.284506 81.492351
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 237.565599 339.390079
L 360.229327 250.885453
L 363.262586 86.56142
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 263.826267 346.043713
L 385.180483 256.596492
L 389.519764 91.684949
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 290.378159 352.771135
L 410.387838 262.366172
L 416.060561 96.86382
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 317.226148 359.573579
L 435.855357 268.1954
L 442.889598 102.098935
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 344.375213 366.452305
L 461.587089 274.085104
L 470.011596 107.391216
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_1">
<g id="line2d_2">
<path d="M 136.440324 312.758477
L 133.139482 314.954734
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
<path d="M 161.572996 319.120869
L 158.301354 321.340896
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_3">
<g id="line2d_4">
<path d="M 186.978165 325.552244
L 183.736553 327.79643
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_4">
<g id="line2d_5">
<path d="M 212.660287 332.05373
L 209.449556 334.322471
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_5">
<g id="line2d_6">
<path d="M 238.623915 338.62648
L 235.444941 340.920181
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_6">
<g id="line2d_7">
<path d="M 264.873705 345.271673
L 261.727385 347.590748
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_7">
<g id="line2d_8">
<path d="M 291.414412 351.990512
L 288.301669 354.335385
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_8">
<g id="line2d_9">
<path d="M 318.2509 358.784229
L 315.17268 361.155332
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_9">
<g id="line2d_10">
<path d="M 345.388141 365.654082
L 342.345417 368.051858
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_2">
<g id="line2d_11">
<path d="M 465.901687 275.072667
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_2">
<path d="M 124.83963 140.276819
L 133.925947 310.61159
L 351.454544 365.608914
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 142.120716 130.523157
L 150.241556 299.790884
L 366.433824 353.759184
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 159.070412 120.956535
L 166.260112 289.167187
L 381.127889 342.135079
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 175.698161 111.571626
L 181.989655 278.735167
L 395.544809 330.730218
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 192.013047 102.363299
L 197.437937 268.489682
L 409.692352 319.538453
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 208.023819 93.326618
L 212.612435 258.425775
L 423.577998 308.55387
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 223.738902 84.456828
L 227.520363 248.53866
L 437.208951 297.770766
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 239.166411 75.749348
L 242.168684 238.823719
L 450.592157 287.18365
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 254.31417 67.199763
L 256.564121 229.276494
L 463.734308 276.787226
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_10">
<g id="line2d_12">
<path d="M 349.633738 365.148563
L 355.10024 366.530648
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_11">
<g id="line2d_13">
<path d="M 364.624972 353.307638
L 370.055544 354.663277
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_12">
<g id="line2d_14">
<path d="M 379.33087 341.692089
L 384.725881 343.022034
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_13">
<g id="line2d_15">
<path d="M 393.7595 330.295542
L 399.119319 331.600517
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_14">
<g id="line2d_16">
<path d="M 407.91863 319.11186
L 413.243626 320.392561
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_15">
<g id="line2d_17">
<path d="M 421.815742 308.135135
L 427.106278 309.392234
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_16">
<g id="line2d_18">
<path d="M 435.458042 297.359676
L 440.714481 298.593818
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_17">
<g id="line2d_19">
<path d="M 448.852474 286.779996
L 454.075176 287.991806
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_18">
<g id="line2d_20">
<path d="M 462.005733 276.390809
L 467.195055 277.580886
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_3">
<g id="line2d_21">
<path d="M 465.901687 275.072667
L 474.560748 108.278886
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_3">
<path d="M 466.066381 271.900274
L 258.89869 224.615172
L 131.001569 309.196909
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 468.068718 233.330576
L 258.406032 187.114858
L 128.865116 269.816616
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 470.120301 193.812297
L 257.901772 148.731448
L 126.674356 229.435289
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 472.222968 153.310006
L 257.385496 109.433377
L 124.42719 188.014268
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 474.378652 111.786488
L 256.856768 69.187556
L 122.121412 145.512876
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_19">
<g id="line2d_22">
<path d="M 464.337863 271.505747
L 469.527014 272.690148
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_20">
<g id="line2d_23">
<path d="M 466.318508 232.944779
L 471.572824 234.102983
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_21">
<g id="line2d_24">
<path d="M 468.347848 193.435781
L 473.668985 194.566132
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_22">
<g id="line2d_25">
<path d="M 470.4277 152.943356
L 475.817377 154.044099
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_23">
<g id="line2d_26">
<path d="M 472.559975 111.430323
L 478.01998 112.499596
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axes_1">
<g id="Poly3DCollection_1">
<path clip-path="url(#pcca6d018d3)" d="M 146.614877 231.721406
L 159.531667 234.760121
L 172.520089 237.815687
L 185.580739 240.888245
L 206.9384 238.637304
L 211.921148 247.084907
L 225.202136 250.209301
L 238.55781 253.351264
L 251.988802 256.510946
L 273.510159 254.196155
L 279.079303 262.88407
L 292.740111 266.097818
L 306.478837 269.329895
L 320.29615 272.580461
L 341.981907 270.199062
L 349.694458 264.604042
L 357.331505 259.063798
L 364.89415 253.577527
L 358.716192 245.031573
L 379.800541 242.763785
L 387.146389 237.434788
L 394.42204 232.156715
L 401.628495 226.92884
L 395.32285 218.782963
L 415.83773 216.620845
L 422.842419 211.539339
L 429.781733 206.50526
L 436.656583 201.517946
L 430.241548 193.744696
L 417.085468 190.927682
L 403.999065 188.125588
L 390.981787 185.338295
L 371.012017 187.377288
L 365.152429 179.807647
L 352.339273 177.064061
L 339.593091 174.334816
L 326.91336 171.619799
L 307.081871 173.605938
L 301.751182 166.232009
L 289.267714 163.559017
L 276.848656 160.899816
L 264.49351 158.254301
L 244.799849 160.189615
L 237.331514 164.797835
L 229.795882 169.44758
L 222.19204 174.139414
L 226.991762 181.627026
L 206.775985 183.651651
L 198.961861 188.473236
L 191.075701 193.339269
L 183.116505 198.250368
L 187.74066 206.090024
L 166.974908 208.21029
L 158.79041 213.260408
L 150.528683 218.358178
L 142.188629 223.50428
L 146.614877 231.721406
z
M 226.125278 214.832541
L 246.901313 212.686108
L 252.064316 220.740441
L 231.143354 222.919043
z
M 291.508349 229.724251
L 312.438258 227.518392
L 318.168271 235.79634
L 297.091411 238.035719
z
M 264.806923 189.974015
L 285.031614 187.924978
L 290.353193 195.612876
L 269.991265 197.69191
z
M 329.187688 204.184864
L 349.557251 202.080425
L 355.427242 209.976754
L 334.918599 212.112419
z
" style="fill:#dddcdc;"/>
</g>
</g>
</g>
<defs>
<clipPath id="pcca6d018d3">
<rect height="345.6" width="446.4" x="72.0" y="43.2"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

@@ -0,0 +1,479 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="432pt" version="1.1" viewBox="0 0 576 432" width="576pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 432
L 576 432
L 576 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="patch_2">
<path d="M 72 388.8
L 518.4 388.8
L 518.4 43.2
L 72 43.2
z
" style="fill:#ffffff;"/>
</g>
<g id="pane3d_1">
<g id="patch_3">
<path d="M 131.177218 312.43458
L 258.939234 227.701291
L 256.812132 65.789882
L 121.926546 141.921
" style="fill:#f2f2f2;opacity:0.5;stroke:#f2f2f2;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_2">
<g id="patch_4">
<path d="M 258.939234 227.701291
L 465.901687 275.072667
L 474.560748 108.278886
L 256.812132 65.789882
" style="fill:#e6e6e6;opacity:0.5;stroke:#e6e6e6;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_3">
<g id="patch_5">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
L 465.901687 275.072667
L 258.939234 227.701291
" style="fill:#ececec;opacity:0.5;stroke:#ececec;stroke-linejoin:miter;"/>
</g>
</g>
<g id="axis3d_1">
<g id="line2d_1">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_1">
<path d="M 135.341407 313.489655
L 262.91012 228.610182
L 260.98105 66.603357
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 168.925005 321.998692
L 294.916126 235.935996
L 294.595943 73.162588
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 202.996171 330.631263
L 327.352943 243.360419
L 328.6864 79.814614
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 237.565599 339.390079
L 360.229327 250.885453
L 363.262586 86.56142
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 272.644301 348.277928
L 393.554274 258.513158
L 398.334956 93.405046
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 308.243613 357.297684
L 427.337028 266.245651
L 433.914269 100.347591
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 344.375213 366.452305
L 461.587089 274.085104
L 470.011596 107.391216
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_1">
<g id="line2d_2">
<path d="M 136.440324 312.758477
L 133.139482 314.954734
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
<path d="M 170.01089 321.25694
L 166.749164 323.484977
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_3">
<g id="line2d_4">
<path d="M 204.068528 329.878707
L 200.847407 332.139218
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_4">
<g id="line2d_5">
<path d="M 238.623915 338.62648
L 235.444941 340.920181
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_5">
<g id="line2d_6">
<path d="M 273.688045 347.503043
L 270.552814 349.830669
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_6">
<g id="line2d_7">
<path d="M 309.272234 356.51126
L 306.1824 358.87357
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_7">
<g id="line2d_8">
<path d="M 345.388141 365.654082
L 342.345417 368.051858
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_2">
<g id="line2d_9">
<path d="M 465.901687 275.072667
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_2">
<path d="M 124.83963 140.276819
L 133.925947 310.61159
L 351.454544 365.608914
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 140.217137 131.597561
L 148.44353 300.983356
L 364.783694 355.064559
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 155.331963 123.066563
L 162.725688 291.511259
L 377.886771 344.699046
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 170.190782 114.680059
L 176.778102 282.191531
L 390.769477 334.507862
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 184.800044 106.434408
L 190.606273 273.020523
L 403.437326 324.486646
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 199.165982 98.326092
L 204.215524 263.994706
L 415.895649 314.631182
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 213.294627 90.351708
L 217.611014 255.110658
L 428.1496 304.937391
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 227.191809 82.507964
L 230.79774 246.365064
L 440.204168 295.401326
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 240.86317 74.791676
L 243.780544 237.754714
L 452.06418 286.01917
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 254.31417 67.199763
L 256.564121 229.276494
L 463.734308 276.787226
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_8">
<g id="line2d_10">
<path d="M 349.633738 365.148563
L 355.10024 366.530648
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_9">
<g id="line2d_11">
<path d="M 362.973521 354.612048
L 368.408066 355.970588
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_10">
<g id="line2d_12">
<path d="M 376.087133 344.254176
L 381.490015 345.589767
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_11">
<g id="line2d_13">
<path d="M 388.980278 334.070441
L 394.351787 335.38366
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_12">
<g id="line2d_14">
<path d="M 401.658469 324.056489
L 406.998897 325.347894
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_13">
<g id="line2d_15">
<path d="M 414.127038 314.208109
L 419.436673 315.478239
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_14">
<g id="line2d_16">
<path d="M 426.39114 304.521228
L 431.67027 305.770604
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_15">
<g id="line2d_17">
<path d="M 438.455763 294.991906
L 443.704674 296.221032
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_16">
<g id="line2d_18">
<path d="M 450.325737 285.61633
L 455.544713 286.825695
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_17">
<g id="line2d_19">
<path d="M 462.005733 276.390809
L 467.195055 277.580886
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_3">
<g id="line2d_20">
<path d="M 465.901687 275.072667
L 474.560748 108.278886
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_3">
<path d="M 466.066381 271.900274
L 258.89869 224.615172
L 131.001569 309.196909
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 467.061506 252.73185
L 258.653786 205.973486
L 129.940004 289.629551
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 468.068718 233.330576
L 258.406032 187.114858
L 128.865116 269.816616
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 469.088241 213.692183
L 258.155377 168.035478
L 127.776653 249.753452
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 470.120301 193.812297
L 257.901772 148.731448
L 126.674356 229.435289
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 471.16513 173.686436
L 257.645162 129.198777
L 125.557959 208.857234
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 472.222968 153.310006
L 257.385496 109.433377
L 124.42719 188.014268
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 473.294058 132.6783
L 257.122716 89.431065
L 123.28177 166.901243
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 474.378652 111.786488
L 256.856768 69.187556
L 122.121412 145.512876
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_18">
<g id="line2d_21">
<path d="M 464.337863 271.505747
L 469.527014 272.690148
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_19">
<g id="line2d_22">
<path d="M 465.322209 252.341622
L 470.543739 253.513124
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_20">
<g id="line2d_23">
<path d="M 466.318508 232.944779
L 471.572824 234.102983
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_21">
<g id="line2d_24">
<path d="M 467.326979 213.310956
L 472.614495 214.455446
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_22">
<g id="line2d_25">
<path d="M 468.347848 193.435781
L 473.668985 194.566132
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_23">
<g id="line2d_26">
<path d="M 469.381343 173.314777
L 474.736531 174.43055
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_24">
<g id="line2d_27">
<path d="M 470.4277 152.943356
L 475.817377 154.044099
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_25">
<g id="line2d_28">
<path d="M 471.487162 132.316812
L 476.911775 133.40206
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_26">
<g id="line2d_29">
<path d="M 472.559975 111.430323
L 478.01998 112.499596
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axes_1">
<g id="line2d_30">
<path clip-path="url(#p47a4741ada)" d="M 358.008267 249.396296
L 374.473482 255.287414
L 385.204896 263.156503
L 389.782754 272.354677
L 388.149984 282.164018
L 380.635403 291.835913
L 367.952315 300.639085
L 351.162935 307.913929
L 331.604056 313.126742
L 310.777359 315.915538
L 290.216467 316.119289
L 271.349408 313.785027
L 255.377108 309.151518
L 243.185022 302.612954
L 235.297325 294.669669
L 231.874059 285.87435
L 232.744053 276.781437
L 237.462184 267.905144
L 245.378817 259.688714
L 255.711222 252.485092
L 267.609997 246.547546
L 280.21683 242.02806
L 292.712505 238.98131
L 304.355657 237.372442
L 314.513396 237.087461
L 322.684826 237.945574
L 328.517978 239.713191
L 331.820005 242.119466
L 332.559995 244.873134
L 330.86354 247.680215
L 326.998445 250.261762
L 321.351661 252.370542
L 314.398514 253.805334
L 306.666423 254.421586
L 298.696206 254.137441
L 291.004529 252.934683
L 284.050953 250.854738
L 278.212304 247.990498
L 273.765992 244.475162
L 270.882655 240.469504
L 269.627317 236.148951
L 269.967465 231.691628
L 271.785972 227.268149
L 274.896793 223.033595
L 279.061595 219.121721
L 284.005919 215.641221
L 289.434011 212.673688
L 295.04189 210.272862
L 300.528651 208.464745
L 305.606267 207.248273
L 310.00833 206.596294
L 313.498211 206.456746
L 315.877054 206.75407
L 316.991867 207.390967
L 316.743741 208.250741
L 315.095894 209.200492
L 312.080947 210.09544
L 307.806483 210.784607
L 302.457728 211.117916
L 296.296078 210.954602
L 289.652351 210.172554
L 282.913958 208.677941
L 276.50589 206.414262
L 270.866153 203.36982
L 266.417182 199.582649
L 263.535474 195.142094
L 262.522141 190.186602
L 263.577078 184.897701
L 266.779084 179.490563
L 272.07352 174.201914
L 279.268237 169.276248
L 288.037662 164.951286
L 297.934345 161.443552
L 308.407016 158.934667
L 318.824249 157.558766
L 328.50315 157.391278
L 336.742897 158.439288
L 342.863229 160.633841
L 346.247962 163.824811
L 346.393075 167.779398
L 342.957725 172.185649
L 335.814731 176.662658
L 325.094903 180.778928
L 311.217535 184.079656
L 294.898362 186.122333
L 277.12716 186.51807
L 259.110658 184.974053
L 242.182317 181.330945
L 227.687687 175.588811
L 216.860247 167.916547
L 210.705713 158.642704
L 209.911289 148.229241
L 214.790749 137.232893
L 225.268303 126.260641
L 240.896674 115.925708
L 260.899743 106.808926
L 284.228494 99.427952
L 309.62045 94.214443
L 335.656335 91.497472
L 360.812012 91.490539
" style="fill:none;stroke:#0000ff;stroke-linecap:square;"/>
</g>
</g>
</g>
<defs>
<clipPath id="p47a4741ada">
<rect height="345.6" width="446.4" x="72" y="43.2"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

@@ -0,0 +1,311 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="432pt" version="1.1" viewBox="0 0 576 432" width="576pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 432
L 576 432
L 576 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="patch_2">
<path d="M 72 388.8
L 518.4 388.8
L 518.4 43.2
L 72 43.2
z
" style="fill:#ffffff;"/>
</g>
<g id="pane3d_1">
<g id="patch_3">
<path d="M 131.177218 312.43458
L 258.939234 227.701291
L 256.812132 65.789882
L 121.926546 141.921
" style="fill:#f2f2f2;opacity:0.5;stroke:#f2f2f2;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_2">
<g id="patch_4">
<path d="M 258.939234 227.701291
L 465.901687 275.072667
L 474.560748 108.278886
L 256.812132 65.789882
" style="fill:#e6e6e6;opacity:0.5;stroke:#e6e6e6;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_3">
<g id="patch_5">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
L 465.901687 275.072667
L 258.939234 227.701291
" style="fill:#ececec;opacity:0.5;stroke:#ececec;stroke-linejoin:miter;"/>
</g>
</g>
<g id="axis3d_1">
<g id="line2d_1">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_1">
<path d="M 135.341407 313.489655
L 262.91012 228.610182
L 260.98105 66.603357
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 175.699895 323.715238
L 301.368748 237.412929
L 301.375668 74.485507
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 216.763541 334.119486
L 340.45025 246.358245
L 342.458008 82.50185
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 258.55099 344.707123
L 380.169882 255.449622
L 384.245785 90.655845
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 301.081547 355.48304
L 420.543401 264.690666
L 426.757325 98.951066
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 344.375213 366.452305
L 461.587089 274.085104
L 470.011596 107.391216
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_1">
<g id="line2d_2">
<path d="M 136.440324 312.758477
L 133.139482 314.954734
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
<path d="M 176.783114 322.971344
L 173.529389 325.205819
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_3">
<g id="line2d_4">
<path d="M 217.830344 333.362542
L 214.625895 335.636242
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_4">
<g id="line2d_5">
<path d="M 259.600627 343.936782
L 256.447704 346.250748
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_5">
<g id="line2d_6">
<path d="M 302.113237 354.698943
L 299.014189 357.054256
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_6">
<g id="line2d_7">
<path d="M 345.388141 365.654082
L 342.345417 368.051858
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_2">
<g id="line2d_8">
<path d="M 465.901687 275.072667
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_2">
<path d="M 124.83963 140.276819
L 133.925947 310.61159
L 351.454544 365.608914
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 152.329688 124.761085
L 159.887815 293.39337
L 375.283965 346.75806
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 178.985882 109.715994
L 185.101569 276.671308
L 398.395625 328.47501
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 204.845585 95.120453
L 209.599088 260.424262
L 420.82147 310.734489
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 229.94397 80.95461
L 233.410462 244.632276
L 442.591583 293.512702
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 254.31417 67.199763
L 256.564121 229.276494
L 463.734308 276.787226
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_7">
<g id="line2d_9">
<path d="M 349.633738 365.148563
L 355.10024 366.530648
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_8">
<g id="line2d_10">
<path d="M 373.482228 346.311677
L 378.891419 347.651812
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_9">
<g id="line2d_11">
<path d="M 396.612642 328.041968
L 401.965468 329.342034
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_10">
<g id="line2d_12">
<path d="M 419.056931 310.3142
L 424.35433 311.575967
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_11">
<g id="line2d_13">
<path d="M 440.845178 293.104611
L 446.08808 294.329747
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_12">
<g id="line2d_14">
<path d="M 462.005733 276.390809
L 467.195055 277.580886
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_3">
<g id="line2d_15">
<path d="M 465.901687 275.072667
L 474.560748 108.278886
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_3">
<path d="M 466.066381 271.900274
L 258.89869 224.615172
L 131.001569 309.196909
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 467.664368 241.119299
L 258.505479 194.684584
L 129.296686 277.771554
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 469.293643 209.735667
L 258.104894 164.192771
L 127.557309 245.710375
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 470.955131 177.731505
L 257.696727 133.123797
L 125.782379 212.993876
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 472.6498 145.088225
L 257.28076 101.46112
L 123.970796 179.601758
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 474.378652 111.786488
L 256.856768 69.187556
L 122.121412 145.512876
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_13">
<g id="line2d_16">
<path d="M 464.337863 271.505747
L 469.527014 272.690148
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_14">
<g id="line2d_17">
<path d="M 465.91854 240.731713
L 471.159693 241.895285
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_15">
<g id="line2d_18">
<path d="M 467.530154 209.35537
L 472.82436 210.497067
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_16">
<g id="line2d_19">
<path d="M 469.173622 177.358863
L 474.521965 178.477587
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_17">
<g id="line2d_20">
<path d="M 470.849899 144.72362
L 476.253496 145.818222
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_18">
<g id="line2d_21">
<path d="M 472.559975 111.430323
L 478.01998 112.499596
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axes_1">
<g id="Poly3DCollection_1">
<defs>
<path d="M 258.530268 -360.58077
L 467.563587 -319.561013
L 459.573423 -159.376984
" id="m1394a5d166" style="stroke:#000000;stroke-width:3;"/>
</defs>
<g clip-path="url(#p826a730be7)">
<use style="fill:#ff8080;fill-opacity:0.5;stroke:#000000;stroke-width:3;" x="0" xlink:href="#m1394a5d166" y="432"/>
</g>
</g>
<g id="Poly3DCollection_2">
<defs>
<path d="M 129.404241 -287.184409
L 258.530268 -360.58077
L 137.917747 -123.572943
z
" id="m4d49e4906d" style="stroke:#000000;stroke-width:3;"/>
</defs>
<g clip-path="url(#p826a730be7)">
<use style="fill:#8080ff;fill-opacity:0.5;stroke:#000000;stroke-width:3;" x="0" xlink:href="#m4d49e4906d" y="432"/>
</g>
</g>
</g>
</g>
<defs>
<clipPath id="p826a730be7">
<rect height="345.6" width="446.4" x="72" y="43.2"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

@@ -0,0 +1,284 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="432pt" version="1.1" viewBox="0 0 576 432" width="576pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 432
L 576 432
L 576 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="patch_2">
<path d="M 72 388.8
L 518.4 388.8
L 518.4 43.2
L 72 43.2
z
" style="fill:#ffffff;"/>
</g>
<g id="pane3d_1">
<g id="patch_3">
<path d="M 131.177218 312.43458
L 258.939234 227.701291
L 256.812132 65.789882
L 121.926546 141.921
" style="fill:#f2f2f2;opacity:0.5;stroke:#f2f2f2;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_2">
<g id="patch_4">
<path d="M 258.939234 227.701291
L 465.901687 275.072667
L 474.560748 108.278886
L 256.812132 65.789882
" style="fill:#e6e6e6;opacity:0.5;stroke:#e6e6e6;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_3">
<g id="patch_5">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
L 465.901687 275.072667
L 258.939234 227.701291
" style="fill:#ececec;opacity:0.5;stroke:#ececec;stroke-linejoin:miter;"/>
</g>
</g>
<g id="axis3d_1">
<g id="line2d_1">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_1">
<path d="M 135.341407 313.489655
L 262.91012 228.610182
L 260.98105 66.603357
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 175.699895 323.715238
L 301.368748 237.412929
L 301.375668 74.485507
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 216.763541 334.119486
L 340.45025 246.358245
L 342.458008 82.50185
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 258.55099 344.707123
L 380.169882 255.449622
L 384.245785 90.655845
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 301.081547 355.48304
L 420.543401 264.690666
L 426.757325 98.951066
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 344.375213 366.452305
L 461.587089 274.085104
L 470.011596 107.391216
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_1">
<g id="line2d_2">
<path d="M 136.440324 312.758477
L 133.139482 314.954734
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
<path d="M 176.783114 322.971344
L 173.529389 325.205819
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_3">
<g id="line2d_4">
<path d="M 217.830344 333.362542
L 214.625895 335.636242
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_4">
<g id="line2d_5">
<path d="M 259.600627 343.936782
L 256.447704 346.250748
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_5">
<g id="line2d_6">
<path d="M 302.113237 354.698943
L 299.014189 357.054256
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_6">
<g id="line2d_7">
<path d="M 345.388141 365.654082
L 342.345417 368.051858
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_2">
<g id="line2d_8">
<path d="M 465.901687 275.072667
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_2">
<path d="M 124.83963 140.276819
L 133.925947 310.61159
L 351.454544 365.608914
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 152.329688 124.761085
L 159.887815 293.39337
L 375.283965 346.75806
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 178.985882 109.715994
L 185.101569 276.671308
L 398.395625 328.47501
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 204.845585 95.120453
L 209.599088 260.424262
L 420.82147 310.734489
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 229.94397 80.95461
L 233.410462 244.632276
L 442.591583 293.512702
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 254.31417 67.199763
L 256.564121 229.276494
L 463.734308 276.787226
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_7">
<g id="line2d_9">
<path d="M 349.633738 365.148563
L 355.10024 366.530648
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_8">
<g id="line2d_10">
<path d="M 373.482228 346.311677
L 378.891419 347.651812
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_9">
<g id="line2d_11">
<path d="M 396.612642 328.041968
L 401.965468 329.342034
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_10">
<g id="line2d_12">
<path d="M 419.056931 310.3142
L 424.35433 311.575967
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_11">
<g id="line2d_13">
<path d="M 440.845178 293.104611
L 446.08808 294.329747
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_12">
<g id="line2d_14">
<path d="M 462.005733 276.390809
L 467.195055 277.580886
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_3">
<g id="line2d_15">
<path d="M 465.901687 275.072667
L 474.560748 108.278886
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_3">
<path d="M 466.066381 271.900274
L 258.89869 224.615172
L 131.001569 309.196909
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 467.664368 241.119299
L 258.505479 194.684584
L 129.296686 277.771554
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 469.293643 209.735667
L 258.104894 164.192771
L 127.557309 245.710375
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 470.955131 177.731505
L 257.696727 133.123797
L 125.782379 212.993876
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 472.6498 145.088225
L 257.28076 101.46112
L 123.970796 179.601758
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 474.378652 111.786488
L 256.856768 69.187556
L 122.121412 145.512876
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_13">
<g id="line2d_16">
<path d="M 464.337863 271.505747
L 469.527014 272.690148
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_14">
<g id="line2d_17">
<path d="M 465.91854 240.731713
L 471.159693 241.895285
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_15">
<g id="line2d_18">
<path d="M 467.530154 209.35537
L 472.82436 210.497067
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_16">
<g id="line2d_19">
<path d="M 469.173622 177.358863
L 474.521965 178.477587
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_17">
<g id="line2d_20">
<path d="M 470.849899 144.72362
L 476.253496 145.818222
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_18">
<g id="line2d_21">
<path d="M 472.559975 111.430323
L 478.01998 112.499596
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axes_1">
<g id="Line3DCollection_4"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

@@ -0,0 +1,385 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Created with matplotlib (http://matplotlib.org/) -->
<svg height="432pt" version="1.1" viewBox="0 0 576 432" width="576pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<style type="text/css">
*{stroke-linecap:butt;stroke-linejoin:round;}
</style>
</defs>
<g id="figure_1">
<g id="patch_1">
<path d="M 0 432
L 576 432
L 576 0
L 0 0
z
" style="fill:#ffffff;"/>
</g>
<g id="patch_2">
<path d="M 72 388.8
L 518.4 388.8
L 518.4 43.2
L 72 43.2
z
" style="fill:#ffffff;"/>
</g>
<g id="pane3d_1">
<g id="patch_3">
<path d="M 131.177218 312.43458
L 258.939234 227.701291
L 256.812132 65.789882
L 121.926546 141.921
" style="fill:#f2f2f2;opacity:0.5;stroke:#f2f2f2;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_2">
<g id="patch_4">
<path d="M 258.939234 227.701291
L 465.901687 275.072667
L 474.560748 108.278886
L 256.812132 65.789882
" style="fill:#e6e6e6;opacity:0.5;stroke:#e6e6e6;stroke-linejoin:miter;"/>
</g>
</g>
<g id="pane3d_3">
<g id="patch_5">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
L 465.901687 275.072667
L 258.939234 227.701291
" style="fill:#ececec;opacity:0.5;stroke:#ececec;stroke-linejoin:miter;"/>
</g>
</g>
<g id="axis3d_1">
<g id="line2d_1">
<path d="M 131.177218 312.43458
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_1">
<path d="M 135.341407 313.489655
L 262.91012 228.610182
L 260.98105 66.603357
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 175.699895 323.715238
L 301.368748 237.412929
L 301.375668 74.485507
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 216.763541 334.119486
L 340.45025 246.358245
L 342.458008 82.50185
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 258.55099 344.707123
L 380.169882 255.449622
L 384.245785 90.655845
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 301.081547 355.48304
L 420.543401 264.690666
L 426.757325 98.951066
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 344.375213 366.452305
L 461.587089 274.085104
L 470.011596 107.391216
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_1">
<g id="line2d_2">
<path d="M 136.440324 312.758477
L 133.139482 314.954734
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_2">
<g id="line2d_3">
<path d="M 176.783114 322.971344
L 173.529389 325.205819
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_3">
<g id="line2d_4">
<path d="M 217.830344 333.362542
L 214.625895 335.636242
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_4">
<g id="line2d_5">
<path d="M 259.600627 343.936782
L 256.447704 346.250748
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_5">
<g id="line2d_6">
<path d="M 302.113237 354.698943
L 299.014189 357.054256
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_6">
<g id="line2d_7">
<path d="M 345.388141 365.654082
L 342.345417 368.051858
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_2">
<g id="line2d_8">
<path d="M 465.901687 275.072667
L 348.929684 367.606266
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_2">
<path d="M 124.83963 140.276819
L 133.925947 310.61159
L 351.454544 365.608914
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 152.329688 124.761085
L 159.887815 293.39337
L 375.283965 346.75806
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 178.985882 109.715994
L 185.101569 276.671308
L 398.395625 328.47501
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 204.845585 95.120453
L 209.599088 260.424262
L 420.82147 310.734489
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 229.94397 80.95461
L 233.410462 244.632276
L 442.591583 293.512702
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 254.31417 67.199763
L 256.564121 229.276494
L 463.734308 276.787226
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_7">
<g id="line2d_9">
<path d="M 349.633738 365.148563
L 355.10024 366.530648
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_8">
<g id="line2d_10">
<path d="M 373.482228 346.311677
L 378.891419 347.651812
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_9">
<g id="line2d_11">
<path d="M 396.612642 328.041968
L 401.965468 329.342034
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_10">
<g id="line2d_12">
<path d="M 419.056931 310.3142
L 424.35433 311.575967
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_11">
<g id="line2d_13">
<path d="M 440.845178 293.104611
L 446.08808 294.329747
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_12">
<g id="line2d_14">
<path d="M 462.005733 276.390809
L 467.195055 277.580886
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axis3d_3">
<g id="line2d_15">
<path d="M 465.901687 275.072667
L 474.560748 108.278886
" style="fill:none;stroke:#000000;stroke-linecap:square;stroke-width:0.75;"/>
</g>
<g id="Line3DCollection_3">
<path d="M 466.066381 271.900274
L 258.89869 224.615172
L 131.001569 309.196909
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 467.664368 241.119299
L 258.505479 194.684584
L 129.296686 277.771554
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 469.293643 209.735667
L 258.104894 164.192771
L 127.557309 245.710375
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 470.955131 177.731505
L 257.696727 133.123797
L 125.782379 212.993876
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 472.6498 145.088225
L 257.28076 101.46112
L 123.970796 179.601758
" style="fill:none;stroke:#e6e6e6;"/>
<path d="M 474.378652 111.786488
L 256.856768 69.187556
L 122.121412 145.512876
" style="fill:none;stroke:#e6e6e6;"/>
</g>
<g id="xtick_13">
<g id="line2d_16">
<path d="M 464.337863 271.505747
L 469.527014 272.690148
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_14">
<g id="line2d_17">
<path d="M 465.91854 240.731713
L 471.159693 241.895285
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_15">
<g id="line2d_18">
<path d="M 467.530154 209.35537
L 472.82436 210.497067
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_16">
<g id="line2d_19">
<path d="M 469.173622 177.358863
L 474.521965 178.477587
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_17">
<g id="line2d_20">
<path d="M 470.849899 144.72362
L 476.253496 145.818222
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
<g id="xtick_18">
<g id="line2d_21">
<path d="M 472.559975 111.430323
L 478.01998 112.499596
" style="fill:none;stroke:#000000;stroke-linecap:square;"/>
</g>
</g>
</g>
<g id="axes_1">
<g id="Path3DCollection_1">
<defs>
<path d="M 0 2.236068
C 0.593012 2.236068 1.161816 2.000462 1.581139 1.581139
C 2.000462 1.161816 2.236068 0.593012 2.236068 0
C 2.236068 -0.593012 2.000462 -1.161816 1.581139 -1.581139
C 1.161816 -2.000462 0.593012 -2.236068 0 -2.236068
C -0.593012 -2.236068 -1.161816 -2.000462 -1.581139 -1.581139
C -2.000462 -1.161816 -2.236068 -0.593012 -2.236068 0
C -2.236068 0.593012 -2.000462 1.161816 -1.581139 1.581139
C -1.161816 2.000462 -0.593012 2.236068 0 2.236068
z
" id="C0_0_83d296332c"/>
</defs>
<g clip-path="url(#p9fde8b4859)">
<use style="fill:#ff0000;fill-opacity:0.3;stroke:#000000;stroke-opacity:0.3;" x="202.886915404" xlink:href="#C0_0_83d296332c" y="269.800202283"/>
</g>
<g clip-path="url(#p9fde8b4859)">
<use style="fill:#ff0000;fill-opacity:0.377324436644;stroke:#000000;stroke-opacity:0.377324436644;" x="215.93755177" xlink:href="#C0_0_83d296332c" y="262.041059838"/>
</g>
<g clip-path="url(#p9fde8b4859)">
<use style="fill:#ff0000;fill-opacity:0.454761630131;stroke:#000000;stroke-opacity:0.454761630131;" x="229.007218971" xlink:href="#C0_0_83d296332c" y="254.270602776"/>
</g>
<g clip-path="url(#p9fde8b4859)">
<use style="fill:#ff0000;fill-opacity:0.532311827277;stroke:#000000;stroke-opacity:0.532311827277;" x="242.095958663" xlink:href="#C0_0_83d296332c" y="246.48880633"/>
</g>
<g clip-path="url(#p9fde8b4859)">
<use style="fill:#ff0000;fill-opacity:0.609975275623;stroke:#000000;stroke-opacity:0.609975275623;" x="255.203812625" xlink:href="#C0_0_83d296332c" y="238.69564566"/>
</g>
<g clip-path="url(#p9fde8b4859)">
<use style="fill:#ff0000;fill-opacity:0.68775222343;stroke:#000000;stroke-opacity:0.68775222343;" x="268.33082276" xlink:href="#C0_0_83d296332c" y="230.891095854"/>
</g>
<g clip-path="url(#p9fde8b4859)">
<use style="fill:#ff0000;fill-opacity:0.765642919688;stroke:#000000;stroke-opacity:0.765642919688;" x="281.47703109" xlink:href="#C0_0_83d296332c" y="223.075131929"/>
</g>
<g clip-path="url(#p9fde8b4859)">
<use style="fill:#ff0000;fill-opacity:0.843647614114;stroke:#000000;stroke-opacity:0.843647614114;" x="294.642479763" xlink:href="#C0_0_83d296332c" y="215.247728824"/>
</g>
<g clip-path="url(#p9fde8b4859)">
<use style="fill:#ff0000;fill-opacity:0.921766557157;stroke:#000000;stroke-opacity:0.921766557157;" x="307.827211048" xlink:href="#C0_0_83d296332c" y="207.40886141"/>
</g>
<g clip-path="url(#p9fde8b4859)">
<use style="fill:#ff0000;stroke:#000000;" x="321.03126734" xlink:href="#C0_0_83d296332c" y="199.558504482"/>
</g>
</g>
<g id="Path3DCollection_2">
<path clip-path="url(#p9fde8b4859)" d="M 334.254691 189.460565
L 332.018623 193.932701
L 336.490759 193.932701
z
" style="fill:#0000ff;fill-opacity:0.3;stroke:#000000;stroke-opacity:0.3;"/>
<path clip-path="url(#p9fde8b4859)" d="M 347.497525 181.587153
L 345.261457 186.059289
L 349.733593 186.059289
z
" style="fill:#0000ff;fill-opacity:0.377321109432;stroke:#000000;stroke-opacity:0.377321109432;"/>
<path clip-path="url(#p9fde8b4859)" d="M 360.759812 173.702175
L 358.523744 178.174311
L 362.99588 178.174311
z
" style="fill:#0000ff;fill-opacity:0.454755798984;stroke:#000000;stroke-opacity:0.454755798984;"/>
<path clip-path="url(#p9fde8b4859)" d="M 374.041595 165.805607
L 371.805527 170.277743
L 376.277663 170.277743
z
" style="fill:#0000ff;fill-opacity:0.532304319104;stroke:#000000;stroke-opacity:0.532304319104;"/>
<path clip-path="url(#p9fde8b4859)" d="M 387.342916 157.897422
L 385.106848 162.369558
L 389.578984 162.369558
z
" style="fill:#0000ff;fill-opacity:0.609966920976;stroke:#000000;stroke-opacity:0.609966920976;"/>
<path clip-path="url(#p9fde8b4859)" d="M 400.66382 149.977594
L 398.427752 154.44973
L 402.899888 154.44973
z
" style="fill:#0000ff;fill-opacity:0.687743856524;stroke:#000000;stroke-opacity:0.687743856524;"/>
<path clip-path="url(#p9fde8b4859)" d="M 414.004349 142.046099
L 411.768281 146.518235
L 416.240417 146.518235
z
" style="fill:#0000ff;fill-opacity:0.765635378415;stroke:#000000;stroke-opacity:0.765635378415;"/>
<path clip-path="url(#p9fde8b4859)" d="M 427.364546 134.102909
L 425.128478 138.575045
L 429.600614 138.575045
z
" style="fill:#0000ff;fill-opacity:0.84364174006;stroke:#000000;stroke-opacity:0.84364174006;"/>
<path clip-path="url(#p9fde8b4859)" d="M 440.744456 126.148
L 438.508388 130.620136
L 442.980524 130.620136
z
" style="fill:#0000ff;fill-opacity:0.921763195619;stroke:#000000;stroke-opacity:0.921763195619;"/>
<path clip-path="url(#p9fde8b4859)" d="M 454.144122 118.181346
L 451.908054 122.653482
L 456.38019 122.653482
z
" style="fill:#0000ff;stroke:#000000;"/>
</g>
</g>
</g>
<defs>
<clipPath id="p9fde8b4859">
<rect height="345.6" width="446.4" x="72.0" y="43.2"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 84 KiB

@@ -0,0 +1,3 @@
from matplotlib.testing.conftest import (mpl_test_settings,
mpl_image_comparison_parameters,
pytest_configure, pytest_unconfigure)
@@ -0,0 +1,43 @@
from matplotlib.testing.decorators import image_comparison
from mpl_toolkits.axes_grid1 import ImageGrid
import numpy as np
import matplotlib.pyplot as plt
@image_comparison(baseline_images=['imagegrid_cbar_mode'],
extensions=['png'],
remove_text=True,
style='mpl20')
def test_imagegrid_cbar_mode_edge():
X, Y = np.meshgrid(np.linspace(0, 6, 30), np.linspace(0, 6, 30))
arr = np.sin(X) * np.cos(Y) + 1j*(np.sin(3*Y) * np.cos(Y/2.))
fig = plt.figure(figsize=(18, 9))
positions = (241, 242, 243, 244, 245, 246, 247, 248)
directions = ['row']*4 + ['column']*4
cbar_locations = ['left', 'right', 'top', 'bottom']*2
for position, direction, location in zip(positions,
directions,
cbar_locations):
grid = ImageGrid(fig, position,
nrows_ncols=(2, 2),
direction=direction,
cbar_location=location,
cbar_size='20%',
cbar_mode='edge')
ax1, ax2, ax3, ax4, = grid
im1 = ax1.imshow(arr.real, cmap='nipy_spectral')
im2 = ax2.imshow(arr.imag, cmap='hot')
im3 = ax3.imshow(np.abs(arr), cmap='jet')
im4 = ax4.imshow(np.arctan2(arr.imag, arr.real), cmap='hsv')
# Some of these colorbars will be overridden by later ones,
# depending on the direction and cbar_location
ax1.cax.colorbar(im1)
ax2.cax.colorbar(im2)
ax3.cax.colorbar(im3)
ax4.cax.colorbar(im4)
@@ -0,0 +1,424 @@
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.testing.decorators import image_comparison
from mpl_toolkits.axes_grid1 import host_subplot
from mpl_toolkits.axes_grid1 import make_axes_locatable
from mpl_toolkits.axes_grid1 import AxesGrid
from mpl_toolkits.axes_grid1 import ImageGrid
from mpl_toolkits.axes_grid1.inset_locator import (
zoomed_inset_axes,
mark_inset,
inset_axes,
BboxConnectorPatch
)
from mpl_toolkits.axes_grid1.anchored_artists import (
AnchoredSizeBar,
AnchoredDirectionArrows)
from matplotlib.colors import LogNorm
from matplotlib.transforms import Bbox, TransformedBbox, \
blended_transform_factory
from itertools import product
import pytest
import platform
import numpy as np
from numpy.testing import assert_array_equal, assert_array_almost_equal
@image_comparison(baseline_images=['divider_append_axes'])
def test_divider_append_axes():
# the random data
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
fig, axScatter = plt.subplots()
# the scatter plot:
axScatter.scatter(x, y)
# create new axes on the right and on the top of the current axes
# The first argument of the new_vertical(new_horizontal) method is
# the height (width) of the axes to be created in inches.
divider = make_axes_locatable(axScatter)
axHistbot = divider.append_axes("bottom", 1.2, pad=0.1, sharex=axScatter)
axHistright = divider.append_axes("right", 1.2, pad=0.1, sharey=axScatter)
axHistleft = divider.append_axes("left", 1.2, pad=0.1, sharey=axScatter)
axHisttop = divider.append_axes("top", 1.2, pad=0.1, sharex=axScatter)
# now determine nice limits by hand:
binwidth = 0.25
xymax = max(np.max(np.abs(x)), np.max(np.abs(y)))
lim = (int(xymax/binwidth) + 1) * binwidth
bins = np.arange(-lim, lim + binwidth, binwidth)
axHisttop.hist(x, bins=bins)
axHistbot.hist(x, bins=bins)
axHistleft.hist(y, bins=bins, orientation='horizontal')
axHistright.hist(y, bins=bins, orientation='horizontal')
axHistbot.invert_yaxis()
axHistleft.invert_xaxis()
axHisttop.xaxis.set_ticklabels(())
axHistbot.xaxis.set_ticklabels(())
axHistleft.yaxis.set_ticklabels(())
axHistright.yaxis.set_ticklabels(())
@image_comparison(baseline_images=['twin_axes_empty_and_removed'],
extensions=["png"], tol=1)
def test_twin_axes_empty_and_removed():
# Purely cosmetic font changes (avoid overlap)
matplotlib.rcParams.update({"font.size": 8})
matplotlib.rcParams.update({"xtick.labelsize": 8})
matplotlib.rcParams.update({"ytick.labelsize": 8})
generators = [ "twinx", "twiny", "twin" ]
modifiers = [ "", "host invisible", "twin removed", "twin invisible",
"twin removed\nhost invisible" ]
# Unmodified host subplot at the beginning for reference
h = host_subplot(len(modifiers)+1, len(generators), 2)
h.text(0.5, 0.5, "host_subplot", horizontalalignment="center",
verticalalignment="center")
# Host subplots with various modifications (twin*, visibility) applied
for i, (mod, gen) in enumerate(product(modifiers, generators),
len(generators)+1):
h = host_subplot(len(modifiers)+1, len(generators), i)
t = getattr(h, gen)()
if "twin invisible" in mod:
t.axis[:].set_visible(False)
if "twin removed" in mod:
t.remove()
if "host invisible" in mod:
h.axis[:].set_visible(False)
h.text(0.5, 0.5, gen + ("\n" + mod if mod else ""),
horizontalalignment="center", verticalalignment="center")
plt.subplots_adjust(wspace=0.5, hspace=1)
def test_axesgrid_colorbar_log_smoketest():
fig = plt.figure()
grid = AxesGrid(fig, 111, # modified to be only subplot
nrows_ncols=(1, 1),
label_mode="L",
cbar_location="top",
cbar_mode="single",
)
Z = 10000 * np.random.rand(10, 10)
im = grid[0].imshow(Z, interpolation="nearest", norm=LogNorm())
grid.cbar_axes[0].colorbar(im)
@image_comparison(
baseline_images=['inset_locator'], style='default', extensions=['png'],
remove_text=True)
def test_inset_locator():
def get_demo_image():
from matplotlib.cbook import get_sample_data
import numpy as np
f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False)
z = np.load(f)
# z is a numpy array of 15x15
return z, (-3, 4, -4, 3)
fig, ax = plt.subplots(figsize=[5, 4])
# prepare the demo image
Z, extent = get_demo_image()
Z2 = np.zeros([150, 150], dtype="d")
ny, nx = Z.shape
Z2[30:30 + ny, 30:30 + nx] = Z
# extent = [-3, 4, -4, 3]
ax.imshow(Z2, extent=extent, interpolation="nearest",
origin="lower")
axins = zoomed_inset_axes(ax, zoom=6, loc='upper right')
axins.imshow(Z2, extent=extent, interpolation="nearest",
origin="lower")
axins.yaxis.get_major_locator().set_params(nbins=7)
axins.xaxis.get_major_locator().set_params(nbins=7)
# sub region of the original image
x1, x2, y1, y2 = -1.5, -0.9, -2.5, -1.9
axins.set_xlim(x1, x2)
axins.set_ylim(y1, y2)
plt.xticks(visible=False)
plt.yticks(visible=False)
# draw a bbox of the region of the inset axes in the parent axes and
# connecting lines between the bbox and the inset axes area
mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5")
asb = AnchoredSizeBar(ax.transData,
0.5,
'0.5',
loc='lower center',
pad=0.1, borderpad=0.5, sep=5,
frameon=False)
ax.add_artist(asb)
@image_comparison(
baseline_images=['inset_axes'], style='default', extensions=['png'],
remove_text=True)
def test_inset_axes():
def get_demo_image():
from matplotlib.cbook import get_sample_data
import numpy as np
f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False)
z = np.load(f)
# z is a numpy array of 15x15
return z, (-3, 4, -4, 3)
fig, ax = plt.subplots(figsize=[5, 4])
# prepare the demo image
Z, extent = get_demo_image()
Z2 = np.zeros([150, 150], dtype="d")
ny, nx = Z.shape
Z2[30:30 + ny, 30:30 + nx] = Z
# extent = [-3, 4, -4, 3]
ax.imshow(Z2, extent=extent, interpolation="nearest",
origin="lower")
# creating our inset axes with a bbox_transform parameter
axins = inset_axes(ax, width=1., height=1., bbox_to_anchor=(1, 1),
bbox_transform=ax.transAxes)
axins.imshow(Z2, extent=extent, interpolation="nearest",
origin="lower")
axins.yaxis.get_major_locator().set_params(nbins=7)
axins.xaxis.get_major_locator().set_params(nbins=7)
# sub region of the original image
x1, x2, y1, y2 = -1.5, -0.9, -2.5, -1.9
axins.set_xlim(x1, x2)
axins.set_ylim(y1, y2)
plt.xticks(visible=False)
plt.yticks(visible=False)
# draw a bbox of the region of the inset axes in the parent axes and
# connecting lines between the bbox and the inset axes area
mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5")
asb = AnchoredSizeBar(ax.transData,
0.5,
'0.5',
loc='lower center',
pad=0.1, borderpad=0.5, sep=5,
frameon=False)
ax.add_artist(asb)
def test_inset_axes_complete():
dpi = 100
figsize = (6, 5)
fig, ax = plt.subplots(figsize=figsize, dpi=dpi)
fig.subplots_adjust(.1, .1, .9, .9)
ins = inset_axes(ax, width=2., height=2., borderpad=0)
fig.canvas.draw()
assert_array_almost_equal(
ins.get_position().extents,
np.array(((0.9*figsize[0]-2.)/figsize[0],
(0.9*figsize[1]-2.)/figsize[1], 0.9, 0.9)))
ins = inset_axes(ax, width="40%", height="30%", borderpad=0)
fig.canvas.draw()
assert_array_almost_equal(
ins.get_position().extents,
np.array((.9-.8*.4, .9-.8*.3, 0.9, 0.9)))
ins = inset_axes(ax, width=1., height=1.2, bbox_to_anchor=(200, 100),
loc=3, borderpad=0)
fig.canvas.draw()
assert_array_almost_equal(
ins.get_position().extents,
np.array((200./dpi/figsize[0], 100./dpi/figsize[1],
(200./dpi+1)/figsize[0], (100./dpi+1.2)/figsize[1])))
ins1 = inset_axes(ax, width="35%", height="60%", loc=3, borderpad=1)
ins2 = inset_axes(ax, width="100%", height="100%",
bbox_to_anchor=(0, 0, .35, .60),
bbox_transform=ax.transAxes, loc=3, borderpad=1)
fig.canvas.draw()
assert_array_equal(ins1.get_position().extents,
ins2.get_position().extents)
with pytest.raises(ValueError):
ins = inset_axes(ax, width="40%", height="30%",
bbox_to_anchor=(0.4, 0.5))
with pytest.warns(UserWarning):
ins = inset_axes(ax, width="40%", height="30%",
bbox_transform=ax.transAxes)
@image_comparison(
baseline_images=['fill_facecolor'], extensions=['png'],
remove_text=True, style='mpl20')
def test_fill_facecolor():
fig, ax = plt.subplots(1, 5)
fig.set_size_inches(5, 5)
for i in range(1, 4):
ax[i].yaxis.set_visible(False)
ax[4].yaxis.tick_right()
bbox = Bbox.from_extents(0, 0.4, 1, 0.6)
# fill with blue by setting 'fc' field
bbox1 = TransformedBbox(bbox, ax[0].transData)
bbox2 = TransformedBbox(bbox, ax[1].transData)
# set color to BboxConnectorPatch
p = BboxConnectorPatch(
bbox1, bbox2, loc1a=1, loc2a=2, loc1b=4, loc2b=3,
ec="r", fc="b")
p.set_clip_on(False)
ax[0].add_patch(p)
# set color to marked area
axins = zoomed_inset_axes(ax[0], 1, loc='upper right')
axins.set_xlim(0, 0.2)
axins.set_ylim(0, 0.2)
plt.gca().axes.get_xaxis().set_ticks([])
plt.gca().axes.get_yaxis().set_ticks([])
mark_inset(ax[0], axins, loc1=2, loc2=4, fc="b", ec="0.5")
# fill with yellow by setting 'facecolor' field
bbox3 = TransformedBbox(bbox, ax[1].transData)
bbox4 = TransformedBbox(bbox, ax[2].transData)
# set color to BboxConnectorPatch
p = BboxConnectorPatch(
bbox3, bbox4, loc1a=1, loc2a=2, loc1b=4, loc2b=3,
ec="r", facecolor="y")
p.set_clip_on(False)
ax[1].add_patch(p)
# set color to marked area
axins = zoomed_inset_axes(ax[1], 1, loc='upper right')
axins.set_xlim(0, 0.2)
axins.set_ylim(0, 0.2)
plt.gca().axes.get_xaxis().set_ticks([])
plt.gca().axes.get_yaxis().set_ticks([])
mark_inset(ax[1], axins, loc1=2, loc2=4, facecolor="y", ec="0.5")
# fill with green by setting 'color' field
bbox5 = TransformedBbox(bbox, ax[2].transData)
bbox6 = TransformedBbox(bbox, ax[3].transData)
# set color to BboxConnectorPatch
p = BboxConnectorPatch(
bbox5, bbox6, loc1a=1, loc2a=2, loc1b=4, loc2b=3,
ec="r", color="g")
p.set_clip_on(False)
ax[2].add_patch(p)
# set color to marked area
axins = zoomed_inset_axes(ax[2], 1, loc='upper right')
axins.set_xlim(0, 0.2)
axins.set_ylim(0, 0.2)
plt.gca().axes.get_xaxis().set_ticks([])
plt.gca().axes.get_yaxis().set_ticks([])
mark_inset(ax[2], axins, loc1=2, loc2=4, color="g", ec="0.5")
# fill with green but color won't show if set fill to False
bbox7 = TransformedBbox(bbox, ax[3].transData)
bbox8 = TransformedBbox(bbox, ax[4].transData)
# BboxConnectorPatch won't show green
p = BboxConnectorPatch(
bbox7, bbox8, loc1a=1, loc2a=2, loc1b=4, loc2b=3,
ec="r", fc="g", fill=False)
p.set_clip_on(False)
ax[3].add_patch(p)
# marked area won't show green
axins = zoomed_inset_axes(ax[3], 1, loc='upper right')
axins.set_xlim(0, 0.2)
axins.set_ylim(0, 0.2)
axins.get_xaxis().set_ticks([])
axins.get_yaxis().set_ticks([])
mark_inset(ax[3], axins, loc1=2, loc2=4, fc="g", ec="0.5", fill=False)
@image_comparison(baseline_images=['zoomed_axes',
'inverted_zoomed_axes'],
extensions=['png'])
def test_zooming_with_inverted_axes():
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 2, 3])
ax.axis([1, 3, 1, 3])
inset_ax = zoomed_inset_axes(ax, zoom=2.5, loc='lower right')
inset_ax.axis([1.1, 1.4, 1.1, 1.4])
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 2, 3])
ax.axis([3, 1, 3, 1])
inset_ax = zoomed_inset_axes(ax, zoom=2.5, loc='lower right')
inset_ax.axis([1.4, 1.1, 1.4, 1.1])
@image_comparison(baseline_images=['anchored_direction_arrows'],
tol={'aarch64': 0.02}.get(platform.machine(), 0.0),
extensions=['png'])
def test_anchored_direction_arrows():
fig, ax = plt.subplots()
ax.imshow(np.zeros((10, 10)))
simple_arrow = AnchoredDirectionArrows(ax.transAxes, 'X', 'Y')
ax.add_artist(simple_arrow)
@image_comparison(baseline_images=['anchored_direction_arrows_many_args'],
extensions=['png'])
def test_anchored_direction_arrows_many_args():
fig, ax = plt.subplots()
ax.imshow(np.ones((10, 10)))
direction_arrows = AnchoredDirectionArrows(
ax.transAxes, 'A', 'B', loc='upper right', color='red',
aspect_ratio=-0.5, pad=0.6, borderpad=2, frameon=True, alpha=0.7,
sep_x=-0.06, sep_y=-0.08, back_length=0.1, head_width=9,
head_length=10, tail_width=5)
ax.add_artist(direction_arrows)
def test_axes_locatable_position():
fig, ax = plt.subplots()
divider = make_axes_locatable(ax)
cax = divider.append_axes('right', size='5%', pad='2%')
fig.canvas.draw()
assert np.isclose(cax.get_position(original=False).width,
0.03621495327102808)
@image_comparison(baseline_images=['image_grid'], extensions=['png'],
remove_text=True, style='mpl20',
savefig_kwarg={'bbox_inches': 'tight'})
def test_image_grid():
# test that image grid works with bbox_inches=tight.
im = np.arange(100)
im.shape = 10, 10
fig = plt.figure(1, (4., 4.))
grid = ImageGrid(fig, 111, nrows_ncols=(2, 2), axes_pad=0.1)
for i in range(4):
grid[i].imshow(im)
grid[i].set_title('test {0}{0}'.format(i))
def test_gettightbbox():
fig, ax = plt.subplots(figsize=(8, 6))
l, = ax.plot([1, 2, 3], [0, 1, 0])
ax_zoom = zoomed_inset_axes(ax, 4)
ax_zoom.plot([1, 2, 3], [0, 1, 0])
mark_inset(ax, ax_zoom, loc1=1, loc2=3, fc="none", ec='0.3')
bbox = fig.get_tightbbox(fig.canvas.get_renderer())
np.testing.assert_array_almost_equal(bbox.extents,
[-18.022743, -14.118056, 7.332813, 5.4625])
@@ -0,0 +1,142 @@
import re
import numpy as np
import pytest
from mpl_toolkits.axisartist.angle_helper import (
FormatterDMS, FormatterHMS, select_step, select_step24, select_step360)
_MS_RE = (
r'''\$ # Mathtext
(
# The sign sometimes appears on a 0 when a fraction is shown.
# Check later that there's only one.
(?P<degree_sign>-)?
(?P<degree>[0-9.]+) # Degrees value
{degree} # Degree symbol (to be replaced by format.)
)?
(
(?(degree)\\,) # Separator if degrees are also visible.
(?P<minute_sign>-)?
(?P<minute>[0-9.]+) # Minutes value
{minute} # Minute symbol (to be replaced by format.)
)?
(
(?(minute)\\,) # Separator if minutes are also visible.
(?P<second_sign>-)?
(?P<second>[0-9.]+) # Seconds value
{second} # Second symbol (to be replaced by format.)
)?
\$ # Mathtext
'''
)
DMS_RE = re.compile(_MS_RE.format(degree=re.escape(FormatterDMS.deg_mark),
minute=re.escape(FormatterDMS.min_mark),
second=re.escape(FormatterDMS.sec_mark)),
re.VERBOSE)
HMS_RE = re.compile(_MS_RE.format(degree=re.escape(FormatterHMS.deg_mark),
minute=re.escape(FormatterHMS.min_mark),
second=re.escape(FormatterHMS.sec_mark)),
re.VERBOSE)
def dms2float(degrees, minutes=0, seconds=0):
return degrees + minutes / 60.0 + seconds / 3600.0
@pytest.mark.parametrize('args, kwargs, expected_levels, expected_factor', [
((-180, 180, 10), {'hour': False}, np.arange(-180, 181, 30), 1.0),
((-12, 12, 10), {'hour': True}, np.arange(-12, 13, 2), 1.0)
])
def test_select_step(args, kwargs, expected_levels, expected_factor):
levels, n, factor = select_step(*args, **kwargs)
assert n == len(levels)
np.testing.assert_array_equal(levels, expected_levels)
assert factor == expected_factor
@pytest.mark.parametrize('args, kwargs, expected_levels, expected_factor', [
((-180, 180, 10), {}, np.arange(-180, 181, 30), 1.0),
((-12, 12, 10), {}, np.arange(-750, 751, 150), 60.0)
])
def test_select_step24(args, kwargs, expected_levels, expected_factor):
levels, n, factor = select_step24(*args, **kwargs)
assert n == len(levels)
np.testing.assert_array_equal(levels, expected_levels)
assert factor == expected_factor
@pytest.mark.parametrize('args, kwargs, expected_levels, expected_factor', [
((dms2float(20, 21.2), dms2float(21, 33.3), 5), {},
np.arange(1215, 1306, 15), 60.0),
((dms2float(20.5, seconds=21.2), dms2float(20.5, seconds=33.3), 5), {},
np.arange(73820, 73835, 2), 3600.0),
((dms2float(20, 21.2), dms2float(20, 53.3), 5), {},
np.arange(1220, 1256, 5), 60.0),
((21.2, 33.3, 5), {},
np.arange(20, 35, 2), 1.0),
((dms2float(20, 21.2), dms2float(21, 33.3), 5), {},
np.arange(1215, 1306, 15), 60.0),
((dms2float(20.5, seconds=21.2), dms2float(20.5, seconds=33.3), 5), {},
np.arange(73820, 73835, 2), 3600.0),
((dms2float(20.5, seconds=21.2), dms2float(20.5, seconds=21.4), 5), {},
np.arange(7382120, 7382141, 5), 360000.0),
# test threshold factor
((dms2float(20.5, seconds=11.2), dms2float(20.5, seconds=53.3), 5),
{'threshold_factor': 60}, np.arange(12301, 12310), 600.0),
((dms2float(20.5, seconds=11.2), dms2float(20.5, seconds=53.3), 5),
{'threshold_factor': 1}, np.arange(20502, 20517, 2), 1000.0),
])
def test_select_step360(args, kwargs, expected_levels, expected_factor):
levels, n, factor = select_step360(*args, **kwargs)
assert n == len(levels)
np.testing.assert_array_equal(levels, expected_levels)
assert factor == expected_factor
@pytest.mark.parametrize('Formatter, regex',
[(FormatterDMS, DMS_RE),
(FormatterHMS, HMS_RE)],
ids=['Degree/Minute/Second', 'Hour/Minute/Second'])
@pytest.mark.parametrize('direction, factor, values', [
("left", 60, [0, -30, -60]),
("left", 600, [12301, 12302, 12303]),
("left", 3600, [0, -30, -60]),
("left", 36000, [738210, 738215, 738220]),
("left", 360000, [7382120, 7382125, 7382130]),
("left", 1., [45, 46, 47]),
("left", 10., [452, 453, 454]),
])
def test_formatters(Formatter, regex, direction, factor, values):
fmt = Formatter()
result = fmt(direction, factor, values)
prev_degree = prev_minute = prev_second = None
for tick, value in zip(result, values):
m = regex.match(tick)
assert m is not None, '"%s" is not an expected tick format.' % (tick, )
sign = sum(m.group(sign + '_sign') is not None
for sign in ('degree', 'minute', 'second'))
assert sign <= 1, \
'Only one element of tick "%s" may have a sign.' % (tick, )
sign = 1 if sign == 0 else -1
degree = float(m.group('degree') or prev_degree or 0)
minute = float(m.group('minute') or prev_minute or 0)
second = float(m.group('second') or prev_second or 0)
if Formatter == FormatterHMS:
# 360 degrees as plot range -> 24 hours as labelled range
expected_value = pytest.approx((value // 15) / factor)
else:
expected_value = pytest.approx(value / factor)
assert sign * dms2float(degree, minute, second) == expected_value, \
'"%s" does not match expected tick value.' % (tick, )
prev_degree = degree
prev_minute = minute
prev_second = second
@@ -0,0 +1,94 @@
import matplotlib.pyplot as plt
from matplotlib.testing.decorators import image_comparison
from mpl_toolkits.axisartist import AxisArtistHelperRectlinear
from mpl_toolkits.axisartist.axis_artist import (AxisArtist, AxisLabel,
LabelBase, Ticks, TickLabels)
@image_comparison(baseline_images=['axis_artist_ticks'],
extensions=['png'], style='default')
def test_ticks():
fig, ax = plt.subplots()
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
locs_angles = [((i / 10, 0.0), i * 30) for i in range(-1, 12)]
ticks_in = Ticks(ticksize=10, axis=ax.xaxis)
ticks_in.set_locs_angles(locs_angles)
ax.add_artist(ticks_in)
ticks_out = Ticks(ticksize=10, tick_out=True, color='C3', axis=ax.xaxis)
ticks_out.set_locs_angles(locs_angles)
ax.add_artist(ticks_out)
@image_comparison(baseline_images=['axis_artist_labelbase'],
extensions=['png'], style='default')
def test_labelbase():
fig, ax = plt.subplots()
ax.plot([0.5], [0.5], "o")
label = LabelBase(0.5, 0.5, "Test")
label._set_ref_angle(-90)
label._set_offset_radius(offset_radius=50)
label.set_rotation(-90)
label.set(ha="center", va="top")
ax.add_artist(label)
@image_comparison(baseline_images=['axis_artist_ticklabels'],
extensions=['png'], style='default')
def test_ticklabels():
fig, ax = plt.subplots()
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
ax.plot([0.2, 0.4], [0.5, 0.5], "o")
ticks = Ticks(ticksize=10, axis=ax.xaxis)
ax.add_artist(ticks)
locs_angles_labels = [((0.2, 0.5), -90, "0.2"),
((0.4, 0.5), -120, "0.4")]
tick_locs_angles = [(xy, a + 180) for xy, a, l in locs_angles_labels]
ticks.set_locs_angles(tick_locs_angles)
ticklabels = TickLabels(axis_direction="left")
ticklabels._locs_angles_labels = locs_angles_labels
ticklabels.set_pad(10)
ax.add_artist(ticklabels)
ax.plot([0.5], [0.5], "s")
axislabel = AxisLabel(0.5, 0.5, "Test")
axislabel._set_offset_radius(20)
axislabel._set_ref_angle(0)
axislabel.set_axis_direction("bottom")
ax.add_artist(axislabel)
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
@image_comparison(baseline_images=['axis_artist'],
extensions=['png'], style='default')
def test_axis_artist():
fig, ax = plt.subplots()
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
for loc in ('left', 'right', 'bottom'):
_helper = AxisArtistHelperRectlinear.Fixed(ax, loc=loc)
axisline = AxisArtist(ax, _helper, offset=None, axis_direction=loc)
ax.add_artist(axisline)
# Settings for bottom AxisArtist.
axisline.set_label("TTT")
axisline.major_ticks.set_tick_out(False)
axisline.label.set_pad(5)
ax.set_ylabel("Test")
@@ -0,0 +1,89 @@
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.testing.decorators import image_comparison
from matplotlib.transforms import IdentityTransform
from mpl_toolkits.axisartist.axislines import SubplotZero, Subplot
from mpl_toolkits.axisartist import SubplotHost, ParasiteAxesAuxTrans
from mpl_toolkits.axisartist import Axes
@image_comparison(baseline_images=['SubplotZero'],
extensions=['png'], style='default')
def test_SubplotZero():
fig = plt.figure()
ax = SubplotZero(fig, 1, 1, 1)
fig.add_subplot(ax)
ax.axis["xzero"].set_visible(True)
ax.axis["xzero"].label.set_text("Axis Zero")
for n in ["top", "right"]:
ax.axis[n].set_visible(False)
xx = np.arange(0, 2 * np.pi, 0.01)
ax.plot(xx, np.sin(xx))
ax.set_ylabel("Test")
@image_comparison(baseline_images=['Subplot'],
extensions=['png'], style='default')
def test_Subplot():
fig = plt.figure()
ax = Subplot(fig, 1, 1, 1)
fig.add_subplot(ax)
xx = np.arange(0, 2 * np.pi, 0.01)
ax.plot(xx, np.sin(xx))
ax.set_ylabel("Test")
ax.axis["top"].major_ticks.set_tick_out(True)
ax.axis["bottom"].major_ticks.set_tick_out(True)
ax.axis["bottom"].set_label("Tk0")
def test_Axes():
fig = plt.figure()
ax = Axes(fig, [0.15, 0.1, 0.65, 0.8])
fig.add_axes(ax)
ax.plot([1, 2, 3], [0, 1, 2])
ax.set_xscale('log')
plt.show()
@image_comparison(baseline_images=['ParasiteAxesAuxTrans_meshplot'],
extensions=['png'], remove_text=True, style='default',
tol=0.075)
def test_ParasiteAxesAuxTrans():
data = np.ones((6, 6))
data[2, 2] = 2
data[0, :] = 0
data[-2, :] = 0
data[:, 0] = 0
data[:, -2] = 0
x = np.arange(6)
y = np.arange(6)
xx, yy = np.meshgrid(x, y)
funcnames = ['pcolor', 'pcolormesh', 'contourf']
fig = plt.figure()
for i, name in enumerate(funcnames):
ax1 = SubplotHost(fig, 1, 3, i+1)
fig.add_subplot(ax1)
ax2 = ParasiteAxesAuxTrans(ax1, IdentityTransform())
ax1.parasites.append(ax2)
getattr(ax2, name)(xx, yy, data)
ax1.set_xlim((0, 5))
ax1.set_ylim((0, 5))
ax2.contour(xx, yy, data, colors='k')
@@ -0,0 +1,33 @@
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.testing.decorators import image_comparison
from matplotlib.transforms import Bbox
from mpl_toolkits.axisartist.clip_path import clip_line_to_rect
@image_comparison(baseline_images=['clip_path'],
extensions=['png'], style='default')
def test_clip_path():
x = np.array([-3, -2, -1, 0., 1, 2, 3, 2, 1, 0, -1, -2, -3, 5])
y = np.arange(len(x))
fig, ax = plt.subplots()
ax.plot(x, y, lw=1)
bbox = Bbox.from_extents(-2, 3, 2, 12.5)
rect = plt.Rectangle(bbox.p0, bbox.width, bbox.height,
facecolor='none', edgecolor='k', ls='--')
ax.add_patch(rect)
clipped_lines, ticks = clip_line_to_rect(x, y, bbox)
for lx, ly in clipped_lines:
ax.plot(lx, ly, lw=1, color='C1')
for px, py in zip(lx, ly):
assert bbox.contains(px, py)
ccc = iter(['C3o', 'C2x', 'C3o', 'C2x'])
for ttt in ticks:
cc = next(ccc)
for (xx, yy), aa in ttt:
ax.plot([xx], [yy], cc)
@@ -0,0 +1,123 @@
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.projections as mprojections
import matplotlib.transforms as mtransforms
from matplotlib.testing.decorators import image_comparison
from mpl_toolkits.axisartist.axislines import Subplot
from mpl_toolkits.axisartist.floating_axes import (
FloatingSubplot,
GridHelperCurveLinear)
from mpl_toolkits.axisartist.grid_finder import FixedLocator
from mpl_toolkits.axisartist import angle_helper
def test_subplot():
fig = plt.figure(figsize=(5, 5))
fig.clf()
ax = Subplot(fig, 111)
fig.add_subplot(ax)
@image_comparison(baseline_images=['curvelinear3'],
extensions=['png'], style='default', tol=0.01)
def test_curvelinear3():
fig = plt.figure(figsize=(5, 5))
fig.clf()
tr = (mtransforms.Affine2D().scale(np.pi / 180, 1) +
mprojections.PolarAxes.PolarTransform())
grid_locator1 = angle_helper.LocatorDMS(15)
tick_formatter1 = angle_helper.FormatterDMS()
grid_locator2 = FixedLocator([2, 4, 6, 8, 10])
grid_helper = GridHelperCurveLinear(tr,
extremes=(0, 360, 10, 3),
grid_locator1=grid_locator1,
grid_locator2=grid_locator2,
tick_formatter1=tick_formatter1,
tick_formatter2=None)
ax1 = FloatingSubplot(fig, 111, grid_helper=grid_helper)
fig.add_subplot(ax1)
r_scale = 10
tr2 = mtransforms.Affine2D().scale(1, 1 / r_scale) + tr
grid_locator2 = FixedLocator([30, 60, 90])
grid_helper2 = GridHelperCurveLinear(tr2,
extremes=(0, 360,
10 * r_scale, 3 * r_scale),
grid_locator2=grid_locator2)
ax1.axis["right"] = axis = grid_helper2.new_fixed_axis("right", axes=ax1)
ax1.axis["left"].label.set_text("Test 1")
ax1.axis["right"].label.set_text("Test 2")
for an in ["left", "right"]:
ax1.axis[an].set_visible(False)
axis = grid_helper.new_floating_axis(1, 7, axes=ax1,
axis_direction="bottom")
ax1.axis["z"] = axis
axis.toggle(all=True, label=True)
axis.label.set_text("z = ?")
axis.label.set_visible(True)
axis.line.set_color("0.5")
ax2 = ax1.get_aux_axes(tr)
xx, yy = [67, 90, 75, 30], [2, 5, 8, 4]
ax2.scatter(xx, yy)
l, = ax2.plot(xx, yy, "k-")
l.set_clip_path(ax1.patch)
@image_comparison(baseline_images=['curvelinear4'],
extensions=['png'], style='default', tol=0.015)
def test_curvelinear4():
fig = plt.figure(figsize=(5, 5))
fig.clf()
tr = (mtransforms.Affine2D().scale(np.pi / 180, 1) +
mprojections.PolarAxes.PolarTransform())
grid_locator1 = angle_helper.LocatorDMS(5)
tick_formatter1 = angle_helper.FormatterDMS()
grid_locator2 = FixedLocator([2, 4, 6, 8, 10])
grid_helper = GridHelperCurveLinear(tr,
extremes=(120, 30, 10, 0),
grid_locator1=grid_locator1,
grid_locator2=grid_locator2,
tick_formatter1=tick_formatter1,
tick_formatter2=None)
ax1 = FloatingSubplot(fig, 111, grid_helper=grid_helper)
fig.add_subplot(ax1)
ax1.axis["left"].label.set_text("Test 1")
ax1.axis["right"].label.set_text("Test 2")
for an in ["top"]:
ax1.axis[an].set_visible(False)
axis = grid_helper.new_floating_axis(1, 70, axes=ax1,
axis_direction="bottom")
ax1.axis["z"] = axis
axis.toggle(all=True, label=True)
axis.label.set_axis_direction("top")
axis.label.set_text("z = ?")
axis.label.set_visible(True)
axis.line.set_color("0.5")
ax2 = ax1.get_aux_axes(tr)
xx, yy = [67, 90, 75, 30], [2, 5, 8, 4]
ax2.scatter(xx, yy)
l, = ax2.plot(xx, yy, "k-")
l.set_clip_path(ax1.patch)
@@ -0,0 +1,13 @@
from mpl_toolkits.axisartist.grid_finder import (
FormatterPrettyPrint,
MaxNLocator)
def test_pretty_print_format():
locator = MaxNLocator()
locs, nloc, factor = locator(0, 100)
fmt = FormatterPrettyPrint()
assert fmt("left", None, locs) == \
[r'$\mathdefault{%d}$' % (l, ) for l in locs]
@@ -0,0 +1,214 @@
import numpy as np
import platform
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.projections import PolarAxes
from matplotlib.transforms import Affine2D, Transform
from matplotlib.testing.decorators import image_comparison
from mpl_toolkits.axes_grid1.parasite_axes import ParasiteAxesAuxTrans
from mpl_toolkits.axisartist import SubplotHost
from mpl_toolkits.axes_grid1.parasite_axes import host_subplot_class_factory
from mpl_toolkits.axisartist import angle_helper
from mpl_toolkits.axisartist.axislines import Axes
from mpl_toolkits.axisartist.grid_helper_curvelinear import \
GridHelperCurveLinear
@image_comparison(baseline_images=['custom_transform'],
extensions=['png'], style='default', tol=0.03)
def test_custom_transform():
class MyTransform(Transform):
input_dims = 2
output_dims = 2
is_separable = False
def __init__(self, resolution):
"""
Resolution is the number of steps to interpolate between each input
line segment to approximate its path in transformed space.
"""
Transform.__init__(self)
self._resolution = resolution
def transform(self, ll):
x, y = ll.T
return np.column_stack([x, y - x])
transform_non_affine = transform
def transform_path(self, path):
vertices = path.vertices
ipath = path.interpolated(self._resolution)
return Path(self.transform(ipath.vertices), ipath.codes)
transform_path_non_affine = transform_path
def inverted(self):
return MyTransformInv(self._resolution)
class MyTransformInv(Transform):
input_dims = 2
output_dims = 2
is_separable = False
def __init__(self, resolution):
Transform.__init__(self)
self._resolution = resolution
def transform(self, ll):
x, y = ll.T
return np.column_stack([x, y + x])
def inverted(self):
return MyTransform(self._resolution)
fig = plt.figure()
SubplotHost = host_subplot_class_factory(Axes)
tr = MyTransform(1)
grid_helper = GridHelperCurveLinear(tr)
ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper)
fig.add_subplot(ax1)
ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal")
ax1.parasites.append(ax2)
ax2.plot([3, 6], [5.0, 10.])
ax1.set_aspect(1.)
ax1.set_xlim(0, 10)
ax1.set_ylim(0, 10)
ax1.grid(True)
@image_comparison(baseline_images=['polar_box'],
tol={'aarch64': 0.04}.get(platform.machine(), 0.03),
extensions=['png'], style='default')
def test_polar_box():
fig = plt.figure(figsize=(5, 5))
# PolarAxes.PolarTransform takes radian. However, we want our coordinate
# system in degree
tr = Affine2D().scale(np.pi / 180., 1.) + PolarAxes.PolarTransform()
# polar projection, which involves cycle, and also has limits in
# its coordinates, needs a special method to find the extremes
# (min, max of the coordinate within the view).
extreme_finder = angle_helper.ExtremeFinderCycle(20, 20,
lon_cycle=360,
lat_cycle=None,
lon_minmax=None,
lat_minmax=(0, np.inf))
grid_locator1 = angle_helper.LocatorDMS(12)
tick_formatter1 = angle_helper.FormatterDMS()
grid_helper = GridHelperCurveLinear(tr,
extreme_finder=extreme_finder,
grid_locator1=grid_locator1,
tick_formatter1=tick_formatter1)
ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper)
ax1.axis["right"].major_ticklabels.set_visible(True)
ax1.axis["top"].major_ticklabels.set_visible(True)
# let right axis shows ticklabels for 1st coordinate (angle)
ax1.axis["right"].get_helper().nth_coord_ticks = 0
# let bottom axis shows ticklabels for 2nd coordinate (radius)
ax1.axis["bottom"].get_helper().nth_coord_ticks = 1
fig.add_subplot(ax1)
ax1.axis["lat"] = axis = grid_helper.new_floating_axis(0, 45, axes=ax1)
axis.label.set_text("Test")
axis.label.set_visible(True)
axis.get_helper()._extremes = 2, 12
ax1.axis["lon"] = axis = grid_helper.new_floating_axis(1, 6, axes=ax1)
axis.label.set_text("Test 2")
axis.get_helper()._extremes = -180, 90
# A parasite axes with given transform
ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal")
assert ax2.transData == tr + ax1.transData
# Anything you draw in ax2 will match the ticks and grids of ax1.
ax1.parasites.append(ax2)
ax2.plot(np.linspace(0, 30, 50), np.linspace(10, 10, 50))
ax1.set_aspect(1.)
ax1.set_xlim(-5, 12)
ax1.set_ylim(-5, 10)
ax1.grid(True)
@image_comparison(baseline_images=['axis_direction'],
extensions=['png'], style='default', tol=0.03)
def test_axis_direction():
fig = plt.figure(figsize=(5, 5))
# PolarAxes.PolarTransform takes radian. However, we want our coordinate
# system in degree
tr = Affine2D().scale(np.pi / 180., 1.) + PolarAxes.PolarTransform()
# polar projection, which involves cycle, and also has limits in
# its coordinates, needs a special method to find the extremes
# (min, max of the coordinate within the view).
# 20, 20 : number of sampling points along x, y direction
extreme_finder = angle_helper.ExtremeFinderCycle(20, 20,
lon_cycle=360,
lat_cycle=None,
lon_minmax=None,
lat_minmax=(0, np.inf),
)
grid_locator1 = angle_helper.LocatorDMS(12)
tick_formatter1 = angle_helper.FormatterDMS()
grid_helper = GridHelperCurveLinear(tr,
extreme_finder=extreme_finder,
grid_locator1=grid_locator1,
tick_formatter1=tick_formatter1)
ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper)
for axis in ax1.axis.values():
axis.set_visible(False)
fig.add_subplot(ax1)
ax1.axis["lat1"] = axis = grid_helper.new_floating_axis(
0, 130,
axes=ax1, axis_direction="left")
axis.label.set_text("Test")
axis.label.set_visible(True)
axis.get_helper()._extremes = 0.001, 10
ax1.axis["lat2"] = axis = grid_helper.new_floating_axis(
0, 50,
axes=ax1, axis_direction="right")
axis.label.set_text("Test")
axis.label.set_visible(True)
axis.get_helper()._extremes = 0.001, 10
ax1.axis["lon"] = axis = grid_helper.new_floating_axis(
1, 10,
axes=ax1, axis_direction="bottom")
axis.label.set_text("Test 2")
axis.get_helper()._extremes = 50, 130
axis.major_ticklabels.set_axis_direction("top")
axis.label.set_axis_direction("top")
grid_helper.grid_finder.grid_locator1.den = 5
grid_helper.grid_finder.grid_locator2._nbins = 5
ax1.set_aspect(1.)
ax1.set_xlim(-8, 8)
ax1.set_ylim(-4, 12)
ax1.grid(True)
@@ -0,0 +1,814 @@
import pytest
from mpl_toolkits.mplot3d import Axes3D, axes3d, proj3d, art3d
from matplotlib import cm
from matplotlib.testing.decorators import image_comparison, check_figures_equal
from matplotlib.collections import LineCollection
from matplotlib.patches import Circle
import matplotlib.pyplot as plt
import numpy as np
@image_comparison(baseline_images=['bar3d'], remove_text=True)
def test_bar3d():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]):
xs = np.arange(20)
ys = np.arange(20)
cs = [c] * len(xs)
cs[0] = 'c'
ax.bar(xs, ys, zs=z, zdir='y', align='edge', color=cs, alpha=0.8)
@image_comparison(
baseline_images=['bar3d_shaded'],
remove_text=True,
extensions=['png']
)
def test_bar3d_shaded():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.arange(4)
y = np.arange(5)
x2d, y2d = np.meshgrid(x, y)
x2d, y2d = x2d.ravel(), y2d.ravel()
z = x2d + y2d
ax.bar3d(x2d, y2d, x2d * 0, 1, 1, z, shade=True)
fig.canvas.draw()
@image_comparison(
baseline_images=['bar3d_notshaded'],
remove_text=True,
extensions=['png']
)
def test_bar3d_notshaded():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.arange(4)
y = np.arange(5)
x2d, y2d = np.meshgrid(x, y)
x2d, y2d = x2d.ravel(), y2d.ravel()
z = x2d + y2d
ax.bar3d(x2d, y2d, x2d * 0, 1, 1, z, shade=False)
fig.canvas.draw()
@image_comparison(baseline_images=['contour3d'],
remove_text=True, style='mpl20')
def test_contour3d():
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
cset = ax.contour(X, Y, Z, zdir='z', offset=-100, cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='x', offset=-40, cmap=cm.coolwarm)
cset = ax.contour(X, Y, Z, zdir='y', offset=40, cmap=cm.coolwarm)
ax.set_xlim(-40, 40)
ax.set_ylim(-40, 40)
ax.set_zlim(-100, 100)
@image_comparison(baseline_images=['contourf3d'], remove_text=True)
def test_contourf3d():
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
cset = ax.contourf(X, Y, Z, zdir='z', offset=-100, cmap=cm.coolwarm)
cset = ax.contourf(X, Y, Z, zdir='x', offset=-40, cmap=cm.coolwarm)
cset = ax.contourf(X, Y, Z, zdir='y', offset=40, cmap=cm.coolwarm)
ax.set_xlim(-40, 40)
ax.set_ylim(-40, 40)
ax.set_zlim(-100, 100)
@image_comparison(baseline_images=['contourf3d_fill'], remove_text=True)
def test_contourf3d_fill():
fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y = np.meshgrid(np.arange(-2, 2, 0.25), np.arange(-2, 2, 0.25))
Z = X.clip(0, 0)
# This produces holes in the z=0 surface that causes rendering errors if
# the Poly3DCollection is not aware of path code information (issue #4784)
Z[::5, ::5] = 0.1
cset = ax.contourf(X, Y, Z, offset=0, levels=[-0.1, 0], cmap=cm.coolwarm)
ax.set_xlim(-2, 2)
ax.set_ylim(-2, 2)
ax.set_zlim(-1, 1)
@image_comparison(baseline_images=['tricontour'], remove_text=True,
style='mpl20', extensions=['png'])
def test_tricontour():
fig = plt.figure()
np.random.seed(19680801)
x = np.random.rand(1000) - 0.5
y = np.random.rand(1000) - 0.5
z = -(x**2 + y**2)
ax = fig.add_subplot(1, 2, 1, projection='3d')
ax.tricontour(x, y, z)
ax = fig.add_subplot(1, 2, 2, projection='3d')
ax.tricontourf(x, y, z)
@image_comparison(baseline_images=['lines3d'], remove_text=True)
def test_lines3d():
fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z ** 2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z)
# Reason for flakiness of SVG test is still unknown.
@image_comparison(baseline_images=['mixedsubplot'], remove_text=True,
extensions=['png', 'pdf',
pytest.mark.xfail('svg', strict=False)])
def test_mixedsubplots():
def f(t):
s1 = np.cos(2*np.pi*t)
e1 = np.exp(-t)
return np.multiply(s1, e1)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
fig = plt.figure(figsize=plt.figaspect(2.))
ax = fig.add_subplot(2, 1, 1)
l = ax.plot(t1, f(t1), 'bo',
t2, f(t2), 'k--', markerfacecolor='green')
ax.grid(True)
ax = fig.add_subplot(2, 1, 2, projection='3d')
X, Y = np.meshgrid(np.arange(-5, 5, 0.25), np.arange(-5, 5, 0.25))
R = np.sqrt(X ** 2 + Y ** 2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rcount=40, ccount=40,
linewidth=0, antialiased=False)
ax.set_zlim3d(-1, 1)
@check_figures_equal(extensions=['png'])
def test_tight_layout_text(fig_test, fig_ref):
# text is currently ignored in tight layout. So the order of text() and
# tight_layout() calls should not influence the result.
ax1 = fig_test.gca(projection='3d')
ax1.text(.5, .5, .5, s='some string')
fig_test.tight_layout()
ax2 = fig_ref.gca(projection='3d')
fig_ref.tight_layout()
ax2.text(.5, .5, .5, s='some string')
@image_comparison(baseline_images=['scatter3d'], remove_text=True)
def test_scatter3d():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(np.arange(10), np.arange(10), np.arange(10),
c='r', marker='o')
ax.scatter(np.arange(10, 20), np.arange(10, 20), np.arange(10, 20),
c='b', marker='^')
@image_comparison(baseline_images=['scatter3d_color'], remove_text=True,
extensions=['png'])
def test_scatter3d_color():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(np.arange(10), np.arange(10), np.arange(10),
color='r', marker='o')
ax.scatter(np.arange(10, 20), np.arange(10, 20), np.arange(10, 20),
color='b', marker='s')
@image_comparison(baseline_images=['plot_3d_from_2d'], remove_text=True,
extensions=['png'])
def test_plot_3d_from_2d():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
xs = np.arange(0, 5)
ys = np.arange(5, 10)
ax.plot(xs, ys, zs=0, zdir='x')
ax.plot(xs, ys, zs=0, zdir='y')
@image_comparison(baseline_images=['surface3d'], remove_text=True)
def test_surface3d():
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X ** 2 + Y ** 2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rcount=40, ccount=40, cmap=cm.coolwarm,
lw=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)
fig.colorbar(surf, shrink=0.5, aspect=5)
@image_comparison(baseline_images=['surface3d_shaded'], remove_text=True,
extensions=['png'])
def test_surface3d_shaded():
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X ** 2 + Y ** 2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rstride=5, cstride=5,
color=[0.25, 1, 0.25], lw=1, antialiased=False)
ax.set_zlim(-1.01, 1.01)
@image_comparison(baseline_images=['text3d'])
def test_text3d():
fig = plt.figure()
ax = fig.gca(projection='3d')
zdirs = (None, 'x', 'y', 'z', (1, 1, 0), (1, 1, 1))
xs = (2, 6, 4, 9, 7, 2)
ys = (6, 4, 8, 7, 2, 2)
zs = (4, 2, 5, 6, 1, 7)
for zdir, x, y, z in zip(zdirs, xs, ys, zs):
label = '(%d, %d, %d), dir=%s' % (x, y, z, zdir)
ax.text(x, y, z, label, zdir)
ax.text(1, 1, 1, "red", color='red')
ax.text2D(0.05, 0.95, "2D Text", transform=ax.transAxes)
ax.set_xlim3d(0, 10)
ax.set_ylim3d(0, 10)
ax.set_zlim3d(0, 10)
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
@image_comparison(baseline_images=['trisurf3d'], remove_text=True, tol=0.03)
def test_trisurf3d():
n_angles = 36
n_radii = 8
radii = np.linspace(0.125, 1.0, n_radii)
angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
angles[:, 1::2] += np.pi/n_angles
x = np.append(0, (radii*np.cos(angles)).flatten())
y = np.append(0, (radii*np.sin(angles)).flatten())
z = np.sin(-x*y)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)
@image_comparison(baseline_images=['trisurf3d_shaded'], remove_text=True,
tol=0.03, extensions=['png'])
def test_trisurf3d_shaded():
n_angles = 36
n_radii = 8
radii = np.linspace(0.125, 1.0, n_radii)
angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
angles[:, 1::2] += np.pi/n_angles
x = np.append(0, (radii*np.cos(angles)).flatten())
y = np.append(0, (radii*np.sin(angles)).flatten())
z = np.sin(-x*y)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(x, y, z, color=[1, 0.5, 0], linewidth=0.2)
@image_comparison(baseline_images=['wireframe3d'], remove_text=True)
def test_wireframe3d():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_wireframe(X, Y, Z, rcount=13, ccount=13)
@image_comparison(baseline_images=['wireframe3dzerocstride'], remove_text=True,
extensions=['png'])
def test_wireframe3dzerocstride():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_wireframe(X, Y, Z, rcount=13, ccount=0)
@image_comparison(baseline_images=['wireframe3dzerorstride'], remove_text=True,
extensions=['png'])
def test_wireframe3dzerorstride():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
ax.plot_wireframe(X, Y, Z, rstride=0, cstride=10)
def test_wireframe3dzerostrideraises():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
with pytest.raises(ValueError):
ax.plot_wireframe(X, Y, Z, rstride=0, cstride=0)
def test_mixedsamplesraises():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
with pytest.raises(ValueError):
ax.plot_wireframe(X, Y, Z, rstride=10, ccount=50)
with pytest.raises(ValueError):
ax.plot_surface(X, Y, Z, cstride=50, rcount=10)
@image_comparison(baseline_images=['quiver3d'], remove_text=True)
def test_quiver3d():
fig = plt.figure()
ax = fig.gca(projection='3d')
x, y, z = np.ogrid[-1:0.8:10j, -1:0.8:10j, -1:0.6:3j]
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) *
np.sin(np.pi * z))
ax.quiver(x, y, z, u, v, w, length=0.1, pivot='tip', normalize=True)
@image_comparison(baseline_images=['quiver3d_empty'], remove_text=True)
def test_quiver3d_empty():
fig = plt.figure()
ax = fig.gca(projection='3d')
x, y, z = np.ogrid[-1:0.8:0j, -1:0.8:0j, -1:0.6:0j]
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) *
np.sin(np.pi * z))
ax.quiver(x, y, z, u, v, w, length=0.1, pivot='tip', normalize=True)
@image_comparison(baseline_images=['quiver3d_masked'], remove_text=True)
def test_quiver3d_masked():
fig = plt.figure()
ax = fig.gca(projection='3d')
# Using mgrid here instead of ogrid because masked_where doesn't
# seem to like broadcasting very much...
x, y, z = np.mgrid[-1:0.8:10j, -1:0.8:10j, -1:0.6:3j]
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) *
np.sin(np.pi * z))
u = np.ma.masked_where((-0.4 < x) & (x < 0.1), u, copy=False)
v = np.ma.masked_where((0.1 < y) & (y < 0.7), v, copy=False)
ax.quiver(x, y, z, u, v, w, length=0.1, pivot='tip', normalize=True)
@image_comparison(baseline_images=['quiver3d_pivot_middle'], remove_text=True,
extensions=['png'])
def test_quiver3d_pivot_middle():
fig = plt.figure()
ax = fig.gca(projection='3d')
x, y, z = np.ogrid[-1:0.8:10j, -1:0.8:10j, -1:0.6:3j]
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) *
np.sin(np.pi * z))
ax.quiver(x, y, z, u, v, w, length=0.1, pivot='middle', normalize=True)
@image_comparison(baseline_images=['quiver3d_pivot_tail'], remove_text=True,
extensions=['png'])
def test_quiver3d_pivot_tail():
fig = plt.figure()
ax = fig.gca(projection='3d')
x, y, z = np.ogrid[-1:0.8:10j, -1:0.8:10j, -1:0.6:3j]
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) *
np.sin(np.pi * z))
ax.quiver(x, y, z, u, v, w, length=0.1, pivot='tail', normalize=True)
@image_comparison(baseline_images=['poly3dcollection_closed'],
remove_text=True)
def test_poly3dcollection_closed():
fig = plt.figure()
ax = fig.gca(projection='3d')
poly1 = np.array([[0, 0, 1], [0, 1, 1], [0, 0, 0]], float)
poly2 = np.array([[0, 1, 1], [1, 1, 1], [1, 1, 0]], float)
c1 = art3d.Poly3DCollection([poly1], linewidths=3, edgecolor='k',
facecolor=(0.5, 0.5, 1, 0.5), closed=True)
c2 = art3d.Poly3DCollection([poly2], linewidths=3, edgecolor='k',
facecolor=(1, 0.5, 0.5, 0.5), closed=False)
ax.add_collection3d(c1)
ax.add_collection3d(c2)
@image_comparison(baseline_images=['axes3d_labelpad'], extensions=['png'])
def test_axes3d_labelpad():
from matplotlib import rcParams
fig = plt.figure()
ax = Axes3D(fig)
# labelpad respects rcParams
assert ax.xaxis.labelpad == rcParams['axes.labelpad']
# labelpad can be set in set_label
ax.set_xlabel('X LABEL', labelpad=10)
assert ax.xaxis.labelpad == 10
ax.set_ylabel('Y LABEL')
ax.set_zlabel('Z LABEL')
# or manually
ax.yaxis.labelpad = 20
ax.zaxis.labelpad = -40
# Tick labels also respect tick.pad (also from rcParams)
for i, tick in enumerate(ax.yaxis.get_major_ticks()):
tick.set_pad(tick.get_pad() - i * 5)
@image_comparison(baseline_images=['axes3d_cla'], extensions=['png'])
def test_axes3d_cla():
# fixed in pull request 4553
fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection='3d')
ax.set_axis_off()
ax.cla() # make sure the axis displayed is 3D (not 2D)
def test_plotsurface_1d_raises():
x = np.linspace(0.5, 10, num=100)
y = np.linspace(0.5, 10, num=100)
X, Y = np.meshgrid(x, y)
z = np.random.randn(100)
fig = plt.figure(figsize=(14,6))
ax = fig.add_subplot(1, 2, 1, projection='3d')
with pytest.raises(ValueError):
ax.plot_surface(X, Y, z)
def _test_proj_make_M():
# eye point
E = np.array([1000, -1000, 2000])
R = np.array([100, 100, 100])
V = np.array([0, 0, 1])
viewM = proj3d.view_transformation(E, R, V)
perspM = proj3d.persp_transformation(100, -100)
M = np.dot(perspM, viewM)
return M
def test_proj_transform():
M = _test_proj_make_M()
xs = np.array([0, 1, 1, 0, 0, 0, 1, 1, 0, 0]) * 300.0
ys = np.array([0, 0, 1, 1, 0, 0, 0, 1, 1, 0]) * 300.0
zs = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) * 300.0
txs, tys, tzs = proj3d.proj_transform(xs, ys, zs, M)
ixs, iys, izs = proj3d.inv_transform(txs, tys, tzs, M)
np.testing.assert_almost_equal(ixs, xs)
np.testing.assert_almost_equal(iys, ys)
np.testing.assert_almost_equal(izs, zs)
def _test_proj_draw_axes(M, s=1, *args, **kwargs):
xs = [0, s, 0, 0]
ys = [0, 0, s, 0]
zs = [0, 0, 0, s]
txs, tys, tzs = proj3d.proj_transform(xs, ys, zs, M)
o, ax, ay, az = zip(txs, tys)
lines = [(o, ax), (o, ay), (o, az)]
fig, ax = plt.subplots(*args, **kwargs)
linec = LineCollection(lines)
ax.add_collection(linec)
for x, y, t in zip(txs, tys, ['o', 'x', 'y', 'z']):
ax.text(x, y, t)
return fig, ax
@image_comparison(baseline_images=['proj3d_axes_cube'], extensions=['png'],
remove_text=True, style='default')
def test_proj_axes_cube():
M = _test_proj_make_M()
ts = '0 1 2 3 0 4 5 6 7 4'.split()
xs = np.array([0, 1, 1, 0, 0, 0, 1, 1, 0, 0]) * 300.0
ys = np.array([0, 0, 1, 1, 0, 0, 0, 1, 1, 0]) * 300.0
zs = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) * 300.0
txs, tys, tzs = proj3d.proj_transform(xs, ys, zs, M)
fig, ax = _test_proj_draw_axes(M, s=400)
ax.scatter(txs, tys, c=tzs)
ax.plot(txs, tys, c='r')
for x, y, t in zip(txs, tys, ts):
ax.text(x, y, t)
ax.set_xlim(-0.2, 0.2)
ax.set_ylim(-0.2, 0.2)
@image_comparison(baseline_images=['proj3d_axes_cube_ortho'],
extensions=['png'], remove_text=True, style='default')
def test_proj_axes_cube_ortho():
E = np.array([200, 100, 100])
R = np.array([0, 0, 0])
V = np.array([0, 0, 1])
viewM = proj3d.view_transformation(E, R, V)
orthoM = proj3d.ortho_transformation(-1, 1)
M = np.dot(orthoM, viewM)
ts = '0 1 2 3 0 4 5 6 7 4'.split()
xs = np.array([0, 1, 1, 0, 0, 0, 1, 1, 0, 0]) * 100
ys = np.array([0, 0, 1, 1, 0, 0, 0, 1, 1, 0]) * 100
zs = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) * 100
txs, tys, tzs = proj3d.proj_transform(xs, ys, zs, M)
fig, ax = _test_proj_draw_axes(M, s=150)
ax.scatter(txs, tys, s=300-tzs)
ax.plot(txs, tys, c='r')
for x, y, t in zip(txs, tys, ts):
ax.text(x, y, t)
ax.set_xlim(-200, 200)
ax.set_ylim(-200, 200)
def test_rot():
V = [1, 0, 0, 1]
rotated_V = proj3d.rot_x(V, np.pi / 6)
np.testing.assert_allclose(rotated_V, [1, 0, 0, 1])
V = [0, 1, 0, 1]
rotated_V = proj3d.rot_x(V, np.pi / 6)
np.testing.assert_allclose(rotated_V, [0, np.sqrt(3) / 2, 0.5, 1])
def test_world():
xmin, xmax = 100, 120
ymin, ymax = -100, 100
zmin, zmax = 0.1, 0.2
M = proj3d.world_transformation(xmin, xmax, ymin, ymax, zmin, zmax)
np.testing.assert_allclose(M,
[[5e-2, 0, 0, -5],
[0, 5e-3, 0, 5e-1],
[0, 0, 1e1, -1],
[0, 0, 0, 1]])
@image_comparison(baseline_images=['proj3d_lines_dists'], extensions=['png'],
remove_text=True, style='default')
def test_lines_dists():
fig, ax = plt.subplots(figsize=(4, 6), subplot_kw=dict(aspect='equal'))
xs = (0, 30)
ys = (20, 150)
ax.plot(xs, ys)
p0, p1 = zip(xs, ys)
xs = (0, 0, 20, 30)
ys = (100, 150, 30, 200)
ax.scatter(xs, ys)
dist = proj3d.line2d_seg_dist(p0, p1, (xs[0], ys[0]))
dist = proj3d.line2d_seg_dist(p0, p1, np.array((xs, ys)))
for x, y, d in zip(xs, ys, dist):
c = Circle((x, y), d, fill=0)
ax.add_patch(c)
ax.set_xlim(-50, 150)
ax.set_ylim(0, 300)
def test_autoscale():
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.margins(x=0, y=.1, z=.2)
ax.plot([0, 1], [0, 1], [0, 1])
assert ax.get_w_lims() == (0, 1, -.1, 1.1, -.2, 1.2)
ax.autoscale(False)
ax.set_autoscalez_on(True)
ax.plot([0, 2], [0, 2], [0, 2])
assert ax.get_w_lims() == (0, 1, -.1, 1.1, -.4, 2.4)
@image_comparison(baseline_images=['axes3d_ortho'], style='default')
def test_axes3d_ortho():
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_proj_type('ortho')
@pytest.mark.parametrize('value', [np.inf, np.nan])
@pytest.mark.parametrize(('setter', 'side'), [
('set_xlim3d', 'left'),
('set_xlim3d', 'right'),
('set_ylim3d', 'bottom'),
('set_ylim3d', 'top'),
('set_zlim3d', 'bottom'),
('set_zlim3d', 'top'),
])
def test_invalid_axes_limits(setter, side, value):
limit = {side: value}
fig = plt.figure()
obj = fig.add_subplot(111, projection='3d')
with pytest.raises(ValueError):
getattr(obj, setter)(**limit)
class TestVoxels(object):
@image_comparison(
baseline_images=['voxels-simple'],
extensions=['png'],
remove_text=True
)
def test_simple(self):
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
x, y, z = np.indices((5, 4, 3))
voxels = (x == y) | (y == z)
ax.voxels(voxels)
@image_comparison(
baseline_images=['voxels-edge-style'],
extensions=['png'],
remove_text=True,
style='default'
)
def test_edge_style(self):
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
x, y, z = np.indices((5, 5, 4))
voxels = ((x - 2)**2 + (y - 2)**2 + (z-1.5)**2) < 2.2**2
v = ax.voxels(voxels, linewidths=3, edgecolor='C1')
# change the edge color of one voxel
v[max(v.keys())].set_edgecolor('C2')
@image_comparison(
baseline_images=['voxels-named-colors'],
extensions=['png'],
remove_text=True
)
def test_named_colors(self):
""" test with colors set to a 3d object array of strings """
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
x, y, z = np.indices((10, 10, 10))
voxels = (x == y) | (y == z)
voxels = voxels & ~(x * y * z < 1)
colors = np.zeros((10, 10, 10), dtype=np.object_)
colors.fill('C0')
colors[(x < 5) & (y < 5)] = '0.25'
colors[(x + z) < 10] = 'cyan'
ax.voxels(voxels, facecolors=colors)
@image_comparison(
baseline_images=['voxels-rgb-data'],
extensions=['png'],
remove_text=True
)
def test_rgb_data(self):
""" test with colors set to a 4d float array of rgb data """
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
x, y, z = np.indices((10, 10, 10))
voxels = (x == y) | (y == z)
colors = np.zeros((10, 10, 10, 3))
colors[...,0] = x/9.0
colors[...,1] = y/9.0
colors[...,2] = z/9.0
ax.voxels(voxels, facecolors=colors)
@image_comparison(
baseline_images=['voxels-alpha'],
extensions=['png'],
remove_text=True
)
def test_alpha(self):
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
x, y, z = np.indices((10, 10, 10))
v1 = x == y
v2 = np.abs(x - y) < 2
voxels = v1 | v2
colors = np.zeros((10, 10, 10, 4))
colors[v2] = [1, 0, 0, 0.5]
colors[v1] = [0, 1, 0, 0.5]
v = ax.voxels(voxels, facecolors=colors)
assert type(v) is dict
for coord, poly in v.items():
assert voxels[coord], "faces returned for absent voxel"
assert isinstance(poly, art3d.Poly3DCollection)
@image_comparison(
baseline_images=['voxels-xyz'],
extensions=['png'],
tol=0.01
)
def test_xyz(self):
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
def midpoints(x):
sl = ()
for i in range(x.ndim):
x = (x[sl + np.index_exp[:-1]] +
x[sl + np.index_exp[1:]]) / 2.0
sl += np.index_exp[:]
return x
# prepare some coordinates, and attach rgb values to each
r, g, b = np.indices((17, 17, 17)) / 16.0
rc = midpoints(r)
gc = midpoints(g)
bc = midpoints(b)
# define a sphere about [0.5, 0.5, 0.5]
sphere = (rc - 0.5)**2 + (gc - 0.5)**2 + (bc - 0.5)**2 < 0.5**2
# combine the color components
colors = np.zeros(sphere.shape + (3,))
colors[..., 0] = rc
colors[..., 1] = gc
colors[..., 2] = bc
# and plot everything
ax.voxels(r, g, b, sphere,
facecolors=colors,
edgecolors=np.clip(2*colors - 0.5, 0, 1), # brighter
linewidth=0.5)
def test_calling_conventions(self):
x, y, z = np.indices((3, 4, 5))
filled = np.ones((2, 3, 4))
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
# all the valid calling conventions
for kw in (dict(), dict(edgecolor='k')):
ax.voxels(filled, **kw)
ax.voxels(filled=filled, **kw)
ax.voxels(x, y, z, filled, **kw)
ax.voxels(x, y, z, filled=filled, **kw)
# duplicate argument
with pytest.raises(TypeError) as exc:
ax.voxels(x, y, z, filled, filled=filled)
exc.match(".*voxels.*")
# missing arguments
with pytest.raises(TypeError) as exc:
ax.voxels(x, y)
exc.match(".*voxels.*")
# x,y,z are positional only - this passes them on as attributes of
# Poly3DCollection
with pytest.raises(AttributeError):
ax.voxels(filled=filled, x=x, y=y, z=z)
def test_inverted_cla():
# Github PR #5450. Setting autoscale should reset
# axes to be non-inverted.
fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
# 1. test that a new axis is not inverted per default
assert not ax.xaxis_inverted()
assert not ax.yaxis_inverted()
assert not ax.zaxis_inverted()
ax.set_xlim(1, 0)
ax.set_ylim(1, 0)
ax.set_zlim(1, 0)
assert ax.xaxis_inverted()
assert ax.yaxis_inverted()
assert ax.zaxis_inverted()
ax.cla()
assert not ax.xaxis_inverted()
assert not ax.yaxis_inverted()
assert not ax.zaxis_inverted()