diff --git a/package-lock.json b/package-lock.json index 6fc0a4476d1..9995ba7a17b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4521,9 +4521,9 @@ } }, "gl-axes3d": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gl-axes3d/-/gl-axes3d-1.2.7.tgz", - "integrity": "sha512-PXyLDQR3+shlvmJg8At0bdsA1FdsotA1fRAz1zktsPhx8dwghE2aGKZ2bLLppYRndbXAgMmBhz+dz+wlZltLsw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/gl-axes3d/-/gl-axes3d-1.3.2.tgz", + "integrity": "sha512-djAEyX7pz1C9CICos300JNAbdsFHCb2oWXAg1d/Zge+8VgUg+QayfQemHhVv8JVbcoWulnvZp8K+yQEBnCEhPw==", "requires": { "bit-twiddle": "^1.0.0", "dup": "^1.0.0", @@ -4551,13 +4551,14 @@ } }, "gl-cone3d": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gl-cone3d/-/gl-cone3d-1.1.0.tgz", - "integrity": "sha512-uru4LHoo5E/F2q6o3JkLsi1DWt8X0rcwMTcG9khI1ed6iTyrREghFdqYOHGeQfJdrXzqC714sz0eGmKOJXtXcA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-cone3d/-/gl-cone3d-1.2.0.tgz", + "integrity": "sha512-1+B/ylWF8BfxxeZcSuVJ0FiETK2r8OjSj9O7cVG0k8vV9cAX8t9UF3uYITrLZHNvbbmLPwxeywanWoY6h1W+DA==", "requires": { "gl-shader": "^4.2.1", "gl-vec3": "^1.0.0", "glsl-inverse": "^1.0.0", + "glsl-out-of-range": "^1.0.2", "glslify": "^6.1.0" } }, @@ -4590,13 +4591,14 @@ } }, "gl-error3d": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/gl-error3d/-/gl-error3d-1.0.7.tgz", - "integrity": "sha512-otIih1SAh7Fo8DaaGQXOrg307cVpOjtTOwgiJzmmHAglD2EaKVSzNHONI5RVVVP+bBaObZz+wW18Mpeasij9pA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/gl-error3d/-/gl-error3d-1.0.8.tgz", + "integrity": "sha512-BAps+MLAknIOdWOE+YJGr/Ie1d+y18jA+Y7js/NOO0V5bCHbJry2Mb/3W9da6wRzxxQOFYM6upKux1eL+ZKzww==", "requires": { "gl-buffer": "^2.1.2", "gl-shader": "^4.2.1", "gl-vao": "^1.3.0", + "glsl-out-of-range": "^1.0.2", "glslify": "^6.0.2" } }, @@ -4640,15 +4642,16 @@ } }, "gl-line3d": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gl-line3d/-/gl-line3d-1.1.2.tgz", - "integrity": "sha512-OEkE5dsTunz0JApcx/+T57kOXWY+jNUS4nntnhEy14OcRCb4K6gz53HB+Oi8Cz9nb/95f805QLNgnkhDpdz8uw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gl-line3d/-/gl-line3d-1.1.3.tgz", + "integrity": "sha512-guXmbEorazS9EinjahRrkGf4gneU3V9AdkGmF90k4x7AwjDfyjkc7culQqP97EW2KRVcz4PDzyIZu1MoVtC3Iw==", "requires": { "binary-search-bounds": "^1.0.0", "gl-buffer": "^2.0.8", "gl-shader": "^4.2.1", "gl-texture2d": "^2.0.2", "gl-vao": "^1.1.3", + "glsl-out-of-range": "^1.0.2", "glsl-read-float": "^1.0.0", "glslify": "^6.1.0", "ndarray": "^1.0.16" @@ -4680,9 +4683,9 @@ } }, "gl-mesh3d": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gl-mesh3d/-/gl-mesh3d-2.0.0.tgz", - "integrity": "sha512-cvusWaXEnpH4eXHlN+B3gXj55tOywr5Y2ERI5HrJTdvc5Z77NHEZ6FA66kacdbhqr3r1vM0CMOeeLoteDQumpQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gl-mesh3d/-/gl-mesh3d-2.0.1.tgz", + "integrity": "sha512-9oc1qGQ36tBQg7M0YztgRfa90ShLJyJC3iyJIV9tCQ6X1/4JiEqFc9Uu+/hCT/dW4kd8ZwkLPKEICqIM7LkEMw==", "requires": { "barycentric": "^1.0.1", "colormap": "^2.1.0", @@ -4692,6 +4695,7 @@ "gl-texture2d": "^2.0.8", "gl-vao": "^1.1.3", "glsl-face-normal": "^1.0.2", + "glsl-out-of-range": "^1.0.2", "glsl-specular-cook-torrance": "^2.0.1", "glslify": "^6.1.0", "ndarray": "^1.0.15", @@ -4723,20 +4727,20 @@ } }, "gl-plot3d": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-1.5.5.tgz", - "integrity": "sha512-pmpIVJ/otokKSdUrpT0a0YjT1B0qdrH3qFO7LcuCSV/8YIo0ybYbXAoYacksgbiJehVVxvnN1ZMCkDIl1uFh4w==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-1.5.10.tgz", + "integrity": "sha512-CgmfW0ssqmvluSc/C74k3xJaBXB2kZq7gvkrPfLhj5OSxnJORSX0ACf+Sl6Cv8YrfX/5EzQvyT67d+rhtlBmEg==", "requires": { "3d-view-controls": "^2.2.0", "a-big-triangle": "^1.0.0", - "gl-axes3d": "^1.2.5", + "gl-axes3d": "^1.3.2", "gl-fbo": "^2.0.3", "gl-mat4": "^1.1.2", "gl-select-static": "^2.0.2", "gl-shader": "^4.2.1", "gl-spikes3d": "^1.0.3", "glslify": "^6.1.0", - "is-mobile": "^0.2.2", + "is-mobile": "^2.0.0", "mouse-change": "^1.1.1", "ndarray": "^1.0.16" } @@ -4763,14 +4767,15 @@ } }, "gl-scatter3d": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/gl-scatter3d/-/gl-scatter3d-1.0.11.tgz", - "integrity": "sha512-fKpIBm6QHuw3RVzM3fjYgpigQuHIDj5tXbbGx8whWIx7S3ureiZgTxsM2Mtwo+OLsm1lUEryGf2YbFf3NQ9CiQ==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/gl-scatter3d/-/gl-scatter3d-1.0.12.tgz", + "integrity": "sha512-FoOSXeZGQB4fWFwGAV9iJ87B2Fnxkb0JOZOXKUSuqoUoO2OCobHVCYqPV5dQE0A3u8jQkgkje2kSMc2vWXNdwA==", "requires": { "gl-buffer": "^2.0.6", "gl-mat4": "^1.0.0", "gl-shader": "^4.2.0", "gl-vao": "^1.1.2", + "glsl-out-of-range": "^1.0.2", "glslify": "^6.1.0", "typedarray-pool": "^1.0.2", "vectorize-text": "^3.0.0" @@ -4832,19 +4837,20 @@ } }, "gl-streamtube3d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gl-streamtube3d/-/gl-streamtube3d-1.0.0.tgz", - "integrity": "sha512-BsELPv5pR9gifon8x3pa2R/E+oGvV0kHlpBUhxs/7b6p/CRWMwD9RaRtVHgiW+xAA3JaSqURrZLs95S7657QPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gl-streamtube3d/-/gl-streamtube3d-1.1.0.tgz", + "integrity": "sha512-ZYRk9iGr+1G1KFHs7GtUry9mQKvuFSAlaca8FFsDovSwUMSk/qGgsE1P8p2tpOeZ/oG0vG1hodW6bN/+Jy+RiA==", "requires": { "gl-vec3": "^1.0.0", "glsl-inverse": "^1.0.0", + "glsl-out-of-range": "^1.0.2", "glslify": "^6.1.1" } }, "gl-surface3d": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/gl-surface3d/-/gl-surface3d-1.3.5.tgz", - "integrity": "sha512-+8/zQKgVvaGee1KYcfM6bnNsfa0UtVwERQymeu4N1il16qK1b+Dgp2y+lzyM97J5Tez0qyDw2BbkOrmve3+8YQ==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/gl-surface3d/-/gl-surface3d-1.3.6.tgz", + "integrity": "sha512-aNCCee0vU3JW6iQmsFUXl5QNu4VXx6OF/rZAfgOM38BxJxnCcFZg+NUXA+S2cyWG4cEEjw8zDqaED0OvX6aj+w==", "requires": { "binary-search-bounds": "^1.0.0", "bit-twiddle": "^1.0.2", @@ -4855,6 +4861,7 @@ "gl-shader": "^4.2.0", "gl-texture2d": "^2.0.0", "gl-vao": "^1.1.1", + "glsl-out-of-range": "^1.0.2", "glsl-specular-beckmann": "^1.1.2", "glslify": "^6.1.0", "ndarray": "^1.0.16", @@ -5032,7 +5039,7 @@ }, "glsl-face-normal": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glsl-face-normal/-/glsl-face-normal-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/glsl-face-normal/-/glsl-face-normal-1.0.2.tgz", "integrity": "sha1-fud12Rmk8u6S9Xu2mOh8x12/Eog=" }, "glsl-inject-defines": { @@ -5050,6 +5057,11 @@ "resolved": "https://registry.npmjs.org/glsl-inverse/-/glsl-inverse-1.0.0.tgz", "integrity": "sha1-EsCx0GX1WERNHm/q95td34qRiuY=" }, + "glsl-out-of-range": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-out-of-range/-/glsl-out-of-range-1.0.2.tgz", + "integrity": "sha512-Qej48sfhSajxvfOmFNz5RV37DEHUjVTz38id1Y/Nt0kAXEe8IQSOXhKvlnD+uDpU5JKS6fLxlxLy8lJ/bepqAQ==" + }, "glsl-read-float": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/glsl-read-float/-/glsl-read-float-1.1.0.tgz", @@ -5087,12 +5099,12 @@ }, "glsl-specular-beckmann": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz", + "resolved": "http://registry.npmjs.org/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz", "integrity": "sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE=" }, "glsl-specular-cook-torrance": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz", + "resolved": "http://registry.npmjs.org/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz", "integrity": "sha1-qJHMBsjHtPRyhwK0gk/ay7ln148=", "requires": { "glsl-specular-beckmann": "^1.1.1" @@ -5909,9 +5921,9 @@ "integrity": "sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY=" }, "is-mobile": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-0.2.2.tgz", - "integrity": "sha1-Di4AbZntLCFVt2HfgPKjYZrirZ8=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.0.0.tgz", + "integrity": "sha512-k2+p7BBCzhqHMdYJwGUNNo+6zegGiMIVbM6bEPzxWXpQV6BUzV892UW0oDFgqxT6DygO7LdxRbwC0xmOhJdbew==" }, "is-number": { "version": "3.0.0", diff --git a/package.json b/package.json index 6dbd9305fc7..cae468892cf 100644 --- a/package.json +++ b/package.json @@ -70,21 +70,21 @@ "es6-promise": "^3.0.2", "fast-isnumeric": "^1.1.1", "font-atlas-sdf": "^1.3.3", - "gl-cone3d": "^1.1.0", + "gl-cone3d": "^1.2.0", "gl-contour2d": "^1.1.4", - "gl-error3d": "^1.0.7", + "gl-error3d": "^1.0.8", "gl-heatmap2d": "^1.0.4", - "gl-line3d": "^1.1.2", + "gl-line3d": "^1.1.3", "gl-mat4": "^1.2.0", - "gl-mesh3d": "^2.0.0", + "gl-mesh3d": "2.0.1", "gl-plot2d": "^1.3.1", - "gl-plot3d": "^1.5.5", + "gl-plot3d": "^1.5.10", "gl-pointcloud2d": "^1.0.1", - "gl-scatter3d": "^1.0.11", + "gl-scatter3d": "^1.0.12", "gl-select-box": "^1.0.2", "gl-spikes2d": "^1.0.1", - "gl-streamtube3d": "^1.0.0", - "gl-surface3d": "^1.3.5", + "gl-streamtube3d": "^1.1.0", + "gl-surface3d": "^1.3.6", "gl-text": "^1.1.6", "glslify": "^6.3.1", "has-hover": "^1.0.1", diff --git a/src/plots/gl3d/scene.js b/src/plots/gl3d/scene.js index 5dfa04f9d02..4911a4967ff 100644 --- a/src/plots/gl3d/scene.js +++ b/src/plots/gl3d/scene.js @@ -435,16 +435,11 @@ proto.plot = function(sceneData, fullLayout, layout) { } var dataScale = [1, 1, 1]; for(j = 0; j < 3; ++j) { - if(dataBounds[0][j] > dataBounds[1][j]) { + if(dataBounds[1][j] === dataBounds[0][j]) { dataScale[j] = 1.0; } else { - if(dataBounds[1][j] === dataBounds[0][j]) { - dataScale[j] = 1.0; - } - else { - dataScale[j] = 1.0 / (dataBounds[1][j] - dataBounds[0][j]); - } + dataScale[j] = 1.0 / (dataBounds[1][j] - dataBounds[0][j]); } } @@ -560,6 +555,13 @@ proto.plot = function(sceneData, fullLayout, layout) { sceneBounds[0][i] -= d / 32.0; sceneBounds[1][i] += d / 32.0; } + + if(axis.autorange === 'reversed') { + // swap bounds: + var tmp = sceneBounds[0][i]; + sceneBounds[0][i] = sceneBounds[1][i]; + sceneBounds[1][i] = tmp; + } } else { var range = axis.range; sceneBounds[0][i] = axis.r2l(range[0]); diff --git a/test/image/baselines/gl3d_cone-newplot_reversed_ranges.png b/test/image/baselines/gl3d_cone-newplot_reversed_ranges.png new file mode 100644 index 00000000000..0d2750151c0 Binary files /dev/null and b/test/image/baselines/gl3d_cone-newplot_reversed_ranges.png differ diff --git a/test/image/baselines/gl3d_ibm-plot.png b/test/image/baselines/gl3d_ibm-plot.png index e9fee420a36..ca85f4d0f5f 100644 Binary files a/test/image/baselines/gl3d_ibm-plot.png and b/test/image/baselines/gl3d_ibm-plot.png differ diff --git a/test/image/baselines/gl3d_log-axis-big.png b/test/image/baselines/gl3d_log-axis-big.png index 7ebf8f9bac6..67cb1cb47c0 100644 Binary files a/test/image/baselines/gl3d_log-axis-big.png and b/test/image/baselines/gl3d_log-axis-big.png differ diff --git a/test/image/baselines/gl3d_mesh3d_surface3d_scatter3d_line3d_error3d_log_reversed_ranges.png b/test/image/baselines/gl3d_mesh3d_surface3d_scatter3d_line3d_error3d_log_reversed_ranges.png new file mode 100644 index 00000000000..781f005c5c7 Binary files /dev/null and b/test/image/baselines/gl3d_mesh3d_surface3d_scatter3d_line3d_error3d_log_reversed_ranges.png differ diff --git a/test/image/baselines/gl3d_streamtube_reversed_ranges.png b/test/image/baselines/gl3d_streamtube_reversed_ranges.png new file mode 100644 index 00000000000..e39f2b4a363 Binary files /dev/null and b/test/image/baselines/gl3d_streamtube_reversed_ranges.png differ diff --git a/test/image/baselines/gl3d_world-cals.png b/test/image/baselines/gl3d_world-cals.png index f451f9795e7..4636762d831 100644 Binary files a/test/image/baselines/gl3d_world-cals.png and b/test/image/baselines/gl3d_world-cals.png differ diff --git a/test/image/mocks/gl3d_cone-newplot_reversed_ranges.json b/test/image/mocks/gl3d_cone-newplot_reversed_ranges.json new file mode 100644 index 00000000000..e3152cdb792 --- /dev/null +++ b/test/image/mocks/gl3d_cone-newplot_reversed_ranges.json @@ -0,0 +1,147 @@ +{ + "data": [ + { + "x": [ + 0.2 + ], + "y": [ + 0.4 + ], + "z": [ + -0.6 + ], + "u": [ + 1 + ], + "v": [ + 1 + ], + "w": [ + 0 + ], + "type": "cone" + }, + { + "x": [ + 0.4 + ], + "y": [ + -0.6 + ], + "z": [ + 0.2 + ], + "u": [ + 1 + ], + "v": [ + 0 + ], + "w": [ + 1 + ], + "type": "cone" + }, + { + "x": [ + -0.6 + ], + "y": [ + 0.2 + ], + "z": [ + 0.4 + ], + "u": [ + 0 + ], + "v": [ + 1 + ], + "w": [ + 1 + ], + "type": "cone" + }, + { + "x": [ + -0.2 + ], + "y": [ + -0.4 + ], + "z": [ + 0.6 + ], + "u": [ + -1 + ], + "v": [ + -1 + ], + "w": [ + 0 + ], + "type": "cone" + }, + { + "x": [ + -0.4 + ], + "y": [ + 0.6 + ], + "z": [ + -0.2 + ], + "u": [ + -1 + ], + "v": [ + 0 + ], + "w": [ + -1 + ], + "type": "cone" + }, + { + "x": [ + 0.6 + ], + "y": [ + -0.2 + ], + "z": [ + -0.4 + ], + "u": [ + 0 + ], + "v": [ + -1 + ], + "w": [ + -1 + ], + "type": "cone" + } + ], + "layout": { + "height": 758, + "width": 1310, + "title": "Cone objects with Y-axis using autorange: 'reversed'", + "scene": { + "yaxis": { + "autorange": "reversed" + }, + "camera": { + "eye": { + "x": 1, + "y": -1.5, + "z": 1.25 + } + } + } + } +} diff --git a/test/image/mocks/gl3d_mesh3d_surface3d_scatter3d_line3d_error3d_log_reversed_ranges.json b/test/image/mocks/gl3d_mesh3d_surface3d_scatter3d_line3d_error3d_log_reversed_ranges.json new file mode 100644 index 00000000000..540570e3c66 --- /dev/null +++ b/test/image/mocks/gl3d_mesh3d_surface3d_scatter3d_line3d_error3d_log_reversed_ranges.json @@ -0,0 +1,135 @@ +{ + "data": [ + { + "x": [1,1,3,3,1,1,3,3], + "y": [21,23,23,21,21,23,23,21], + "z": [0.01,0.01,0.01,0.01,100,100,100,100], + "i": [7,0,0,0,4,4,2,6,4,0,3,7], + "j": [3,4,1,2,5,6,5,5,0,1,2,2], + "k": [0,7,2,3,6,7,1,2,5,5,7,6], + "type": "mesh3d" + }, + { + "x": [5,-5], + "y": [10,15], + "z": [ + [0.01,100], + [1000,0.1], + [100,0.01], + [0.001,10] + ], + "type": "surface", + "colorscale": [ + [ + 0, + "rgb(127,127,255)" + ], + [ + 0.1, + "rgb(63,63,255)" + ], + [ + 0.2, + "rgb(0,0,255)" + ], + [ + 0.3, + "rgb(0,63,191)" + ], + [ + 0.4, + "rgb(0,127,127)" + ], + [ + 0.5, + "rgb(0,191,63)" + ], + [ + 0.6, + "rgb(0,255,0)" + ], + [ + 0.7, + "rgb(63,191,0)" + ], + [ + 0.8, + "rgb(127,127,0)" + ], + [ + 0.9, + "rgb(191,63,0)" + ], + [ + 1, + "rgb(255,0,0)" + ] + ], + "cmin": 0, + "cmax": 2 + }, + { + "x": [-5,-4,-3,-2,-1,0,1,2,3,4,5], + "y": [25,16,9,4,1,0,1,4,9,16,25], + "z": [0.00001,0.0001,0.001,0.01,0.1,1,10,100,1000,10000,100000], + "line": { + "color": "black", + "width": 5 + }, + "text": ["A","B","C","D","E","F","G","H","I","J","K"], + "type": "scatter3d", + "mode": "markers+lines+text", + "error_x": { + "type": "sqrt", + "color": "red" + }, + "error_y": { + "type": "sqrt", + "color": "green" + }, + "error_z": { + "type": "sqrt", + "color": "blue" + } + } + ], + "layout": { + "height": 758, + "width": 1310, + "title": "X-axis using autorange:'reversed',Y-axis using range:[30,-5] & Z-axis using range:'reversed' & type:log", + "scene": { + "xaxis": { + "autorange": "reversed", + "showbackground": true, + "backgroundcolor": "rgb(127,191,191)", + "gridcolor": "rgb(255,255,255)", + "zerolinecolor": "rgb(63,0,0)", + "zerolinewidth": 5 + }, + "yaxis": { + "range": [30,-5], + "showbackground": true, + "backgroundcolor": "rgb(191,127,191)", + "gridcolor": "rgb(255,255,255)", + "zerolinecolor": "rgb(0,63,0)", + "zerolinewidth": 5 + }, + "zaxis": { + "autorange": "reversed", + "type": "log", + "showbackground": true, + "backgroundcolor": "rgb(191,191,127)", + "gridcolor": "rgb(255,255,255)", + "zerolinecolor": "rgb(0,0,63)", + "zerolinewidth": 5 + }, + "camera": { + "eye": { + "x": -1.75, + "y": -0.75, + "z": 0.75 + } + } + } + } +} diff --git a/test/image/mocks/gl3d_streamtube_reversed_ranges.json b/test/image/mocks/gl3d_streamtube_reversed_ranges.json new file mode 100644 index 00000000000..1643d076257 --- /dev/null +++ b/test/image/mocks/gl3d_streamtube_reversed_ranges.json @@ -0,0 +1,42 @@ +{ + "data": [ + { + "type": "streamtube", + "x": [0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2,0,0,0,1,1,1,2,2,2], + "y": [0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2], + "z": [0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2], + "u": [1,1,1,0.5,0.5,0.5,0.25,0.25,0.25,1,1,1,0.5,0.5,0.5,0.25,0.25,0.25,1,1,1,0.5,0.5,0.5,0.25,0.25,0.25], + "v": [1,1,1,1,1,1,1,1,1,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,1.5,2,2,2,2,2,2,2,2,2], + "w": [0,0.2,0.4,0,0.2,0.4,0,0.2,0.4,0,0.2,0.4,0,0.2,0.4,0,0.2,0.4,0,0.2,0.4,0,0.2,0.4,0,0.2,0.4], + "sizeref": 0.5, + "cmin": 0, + "cmax": 3 + } + ], + "layout": { + "height": 758, + "width": 1310, + "title": "Streamtube, X and Y axes reversed using autorange: reversed, Z-axis reversed using range: [2, -2]", + "scene": { + "camera": { + "eye": { + "x": 0.5, + "y": -2, + "z": 1 + } + }, + "xaxis": { + "autorange": "reversed" + }, + "yaxis": { + "autorange": "reversed" + }, + "zaxis": { + "range": [ + 2, + -2 + ] + } + } + } +}