diff --git a/package-lock.json b/package-lock.json index 1e208223..36ec1fed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,20 +14,6 @@ "turntable-camera-controller": "^3.0.0" } }, - "3d-view-controls": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/3d-view-controls/-/3d-view-controls-2.2.2.tgz", - "integrity": "sha512-WL0u3PN41lEx/4qvKqV6bJlweUYoW18FXMshW/qHb41AVdZxDReLoJNGYsI7x6jf9bYelEF62BJPQmO7yEnG2w==", - "dev": true, - "requires": { - "3d-view": "^2.0.0", - "has-passive-events": "^1.0.0", - "mouse-change": "^1.1.1", - "mouse-event-offset": "^3.0.2", - "mouse-wheel": "^1.0.2", - "right-now": "^1.0.0" - } - }, "@choojs/findup": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", @@ -104,14 +90,14 @@ "dev": true }, "@plotly/d3-sankey": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.5.1.tgz", - "integrity": "sha512-uMToNGexOSLG0hBm+uAzElfFW0Pt2utgJ//puL5nuerNnPnRTTe3Un7XFVcWqRhvXEViF00Xq/8wGoA8i8eZJA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", + "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", "dev": true, "requires": { "d3-array": "1", "d3-collection": "1", - "d3-interpolate": "1" + "d3-shape": "^1.2.0" } }, "a-big-triangle": { @@ -143,6 +129,12 @@ "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", "dev": true }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + }, "acorn-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", @@ -727,9 +719,9 @@ "dev": true }, "binary-search-bounds": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", - "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", + "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==", "dev": true }, "bit-twiddle": { @@ -931,19 +923,44 @@ } }, "buble": { - "version": "0.19.6", - "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.6.tgz", - "integrity": "sha512-9kViM6nJA1Q548Jrd06x0geh+BG2ru2+RMDkIHHgJY/8AcyCs34lTHwra9BX7YdPrZXd5aarkpr/SY8bmPgPdg==", + "version": "0.19.7", + "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.7.tgz", + "integrity": "sha512-YLgWxX/l+NnfotydBlxqCMPR4FREE4ubuHphALz0FxQ7u2hp3BzxTKQ4nKpapOaRJfEm1gukC68KnT2OymRK0g==", "dev": true, "requires": { - "chalk": "^2.4.1", - "magic-string": "^0.25.1", + "acorn": "^6.1.1", + "acorn-dynamic-import": "^4.0.0", + "acorn-jsx": "^5.0.1", + "chalk": "^2.4.2", + "magic-string": "^0.25.2", "minimist": "^1.2.0", "os-homedir": "^1.0.1", - "regexpu-core": "^4.2.0", - "vlq": "^1.0.0" + "regexpu-core": "^4.5.4" }, "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "magic-string": { "version": "0.25.2", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", @@ -952,12 +969,6 @@ "requires": { "sourcemap-codec": "^1.4.4" } - }, - "vlq": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.0.tgz", - "integrity": "sha512-o3WmXySo+oI5thgqr7Qy8uBkT/v9Zr+sRyrh1lr8aWPUkgDWdWt4Nae2WKBrLsocgE8BuWWD0jLc+VW8LeU+2g==", - "dev": true } } }, @@ -1078,14 +1089,6 @@ "binary-search-bounds": "^2.0.3", "robust-in-sphere": "^1.1.3", "robust-orientation": "^1.1.3" - }, - "dependencies": { - "binary-search-bounds": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", - "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==", - "dev": true - } } }, "cell-orientation": { @@ -1783,9 +1786,9 @@ "dev": true }, "d3-force": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.0.tgz", - "integrity": "sha512-PFLcDnRVANHMudbQlIB87gcfQorEsDIAvRpZ2bNddfM/WxdsEkyrEaOIPoydhH1I1V4HPjNLGOMLXCA0AuGQ9w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", + "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", "dev": true, "requires": { "d3-collection": "1", @@ -1794,6 +1797,12 @@ "d3-timer": "1" } }, + "d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-L+GHMSZNwTpiq4rt9GEsNcpLa4M96lXMR8M/nMG9p5hBE0jy6C+3hWtyZMenPQdwla249iJy7Nx0uKt3n+u9+w==", + "dev": true + }, "d3-interpolate": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.3.2.tgz", @@ -1803,12 +1812,39 @@ "d3-color": "1" } }, + "d3-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.7.tgz", + "integrity": "sha512-q0cW1RpvA5c5ma2rch62mX8AYaiLX0+bdaSM2wxSU9tXjU4DNvkx9qiUvjkuWCj3p22UO/hlPivujqMiR9PDzA==", + "dev": true + }, "d3-quadtree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.6.tgz", "integrity": "sha512-NUgeo9G+ENQCQ1LsRr2qJg3MQ4DJvxcDNCiohdJGHt5gRhBW6orIB5m5FJ9kK3HNL8g9F4ERVoBzcEwQBfXWVA==", "dev": true }, + "d3-sankey-circular": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/d3-sankey-circular/-/d3-sankey-circular-0.33.0.tgz", + "integrity": "sha512-sn6Nuoc1lgZ5PYrxqJ0G3ZbInHM4ZP+lrg5SMc0AolgenQ9CBERf3gVliQzxeXyo2kSU7QgewUZwjvddEzT/JA==", + "dev": true, + "requires": { + "d3-array": "^1.2.1", + "d3-collection": "^1.0.4", + "d3-shape": "^1.2.0", + "elementary-circuits-directed-graph": "^1.0.4" + } + }, + "d3-shape": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.5.tgz", + "integrity": "sha512-VKazVR3phgD+MUCldapHD7P9kcrvPcexeX/PkMJmkUov4JM8IxsSg1DvbYoYich9AtdTsa5nNk2++ImPiDiSxg==", + "dev": true, + "requires": { + "d3-path": "1" + } + }, "d3-timer": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", @@ -1938,24 +1974,62 @@ "dev": true }, "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.0.tgz", + "integrity": "sha512-C4kvKNlYrwXhKxz97BuohF8YoGgQ23Xm9lvoHmgT7JaPGprSEjk3+XFled74Yt/x0ZABUHg2D67covzAPUKx5Q==", "dev": true, "requires": { "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-path-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.0.0.tgz", + "integrity": "sha512-m5dHHzpOXEiv18JEORttBO64UgTEypx99vCxQLjbBvGhOJxnTNglYoFXxwo6AbsQb79sqqycQEHv2hWkHZAijA==", "dev": true + }, + "is-path-in-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.0.0.tgz", + "integrity": "sha512-6Vz5Gc9s/sDA3JBVu0FzWufm8xaBsqy1zn8Q6gmvGP6nSDMw78aS4poBNeatWjaRpTpxxLn1WOndAiOlk+qY8A==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } } } }, @@ -2119,6 +2193,15 @@ "integrity": "sha1-ZOXxWdlxIWMYRby67K8nnDm1404=", "dev": true }, + "elementary-circuits-directed-graph": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.0.4.tgz", + "integrity": "sha512-+xpVxSimU+fcHiTRPWrRN1IFOKaygwotCtZGSBle/rnFaFAoI+4Y8/pimAY1cKiDIHTek2Zox1R7SEQAB/AQ1g==", + "dev": true, + "requires": { + "strongly-connected-components": "^1.0.1" + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -2675,6 +2758,14 @@ "requires": { "binary-search-bounds": "^1.0.0", "cubic-hermite": "^1.0.0" + }, + "dependencies": { + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=", + "dev": true + } } }, "find-up": { @@ -3584,9 +3675,9 @@ } }, "gl-axes3d": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/gl-axes3d/-/gl-axes3d-1.5.1.tgz", - "integrity": "sha512-AOx3jfzN+Z2YTFZ+7OTYaRWoFgSJhYA35BHZI8Q1VnYkB1ZQpco837x3zDSioA/qjkTG1lSUs2WpsfBoBW9NFg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/gl-axes3d/-/gl-axes3d-1.5.2.tgz", + "integrity": "sha512-47Cfh5KhUVRFtYXgufR4lGY5cyXH7SPgAlS1FlvTGK84spIYFCBMlOGUN3AdavGLGUOcXS4ml+tMM61cY6M3gg==", "dev": true, "requires": { "bit-twiddle": "^1.0.2", @@ -3616,9 +3707,9 @@ } }, "gl-cone3d": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/gl-cone3d/-/gl-cone3d-1.2.2.tgz", - "integrity": "sha512-6wdxG/YGZZYlD5QcqhCocFOzxVrZSro7L4fj60XhHZ4LuXaQrjlQJmMja2fayOzDPXKLZYOQydC9jKLEZczHLQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/gl-cone3d/-/gl-cone3d-1.3.1.tgz", + "integrity": "sha512-ftw75smsDy5nU94susUNimXo8H40BEOVjaFrjT387vP4fJqkSVpzVK7jGrPA8/nSrFCOIQ0msWNYL9MMqQ3hjg==", "dev": true, "requires": { "gl-shader": "^4.2.1", @@ -3649,20 +3740,12 @@ "iota-array": "^1.0.0", "ndarray": "^1.0.18", "surface-nets": "^1.0.2" - }, - "dependencies": { - "binary-search-bounds": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", - "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==", - "dev": true - } } }, "gl-error3d": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/gl-error3d/-/gl-error3d-1.0.13.tgz", - "integrity": "sha512-KxZ7NhsYOLZTXpYpoHfebGZJPCxl5ZumlqX1NvJ+1hRxE0pt7gT6ZBMZvWCgUSt+XDtMtD6IolG6ADtRvgYCcg==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/gl-error3d/-/gl-error3d-1.0.15.tgz", + "integrity": "sha512-7mB1zU22Vzdvq0KzzYRzE0xvCRF9nHd1+9ElUqkvt0GMH0gVIpxKk+m3hNPM/iQHmNupcXaE1cBcOQE2agN3uA==", "dev": true, "requires": { "gl-buffer": "^2.1.2", @@ -3705,20 +3788,12 @@ "glslify": "^7.0.0", "iota-array": "^1.0.0", "typedarray-pool": "^1.1.0" - }, - "dependencies": { - "binary-search-bounds": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", - "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==", - "dev": true - } } }, "gl-line3d": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/gl-line3d/-/gl-line3d-1.1.10.tgz", - "integrity": "sha512-/IudYVrkERVwtQNaXYJNwDy3qoN/q/2Pb71bk2cqtTswda7moD2JO5o7xg9enSXGRb6vggRw26G4DDt/iMpK+Q==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/gl-line3d/-/gl-line3d-1.1.11.tgz", + "integrity": "sha512-EitFKPEEYdn/ivFOxJ8khSi0BzNum4sXZFLq6SQq21MX5YPCYb0o+XzjpWNuU32BoXORBC78B1JTiQqnTaWhWQ==", "dev": true, "requires": { "binary-search-bounds": "^2.0.4", @@ -3730,14 +3805,6 @@ "glsl-read-float": "^1.0.0", "glslify": "^7.0.0", "ndarray": "^1.0.16" - }, - "dependencies": { - "binary-search-bounds": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", - "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==", - "dev": true - } } }, "gl-mat2": { @@ -3770,9 +3837,9 @@ } }, "gl-mesh3d": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/gl-mesh3d/-/gl-mesh3d-2.0.7.tgz", - "integrity": "sha512-sP4qv1c3nBRfCJmW499DldibUjm7DNVOJMiyTS33Q39dcBGPdI9u1yzpzIRi6eQ216DZasaKZrLPF6W7nEABkQ==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/gl-mesh3d/-/gl-mesh3d-2.0.9.tgz", + "integrity": "sha512-Kp1V1FVu+hLNaHcmYzU6vNLSmjscpHz7wkRpk3IQj+jBHbxsIS+ZrsNpuoGThl4SnnCz4XLR8j5S/ae/YDrjWg==", "dev": true, "requires": { "barycentric": "^1.0.1", @@ -3805,34 +3872,30 @@ "glsl-inverse": "^1.0.0", "glslify": "^7.0.0", "text-cache": "^4.2.1" - }, - "dependencies": { - "binary-search-bounds": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", - "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==", - "dev": true - } } }, "gl-plot3d": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-1.6.3.tgz", - "integrity": "sha512-/pQAJHDrYgbwTYygXn1aErwRX6KDb2WwJAFaRBjr4xOoSC/flC5VI/1LyQFuQwNlxExx58gAm88aMkWwi8sdiQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-2.2.1.tgz", + "integrity": "sha512-WSzZ9118mUal3uW/9bCPqdrlncmD/T0zWoOY9PiskIOAJ5dxKhzPbY2XkjDs+jGh/ce1yCSEh6LO9aB9SirGow==", "dev": true, "requires": { - "3d-view-controls": "^2.2.2", + "3d-view": "^2.0.0", "a-big-triangle": "^1.0.3", - "gl-axes3d": "^1.4.4", + "gl-axes3d": "^1.5.2", "gl-fbo": "^2.0.5", "gl-mat4": "^1.2.0", "gl-select-static": "^2.0.4", "gl-shader": "^4.2.1", "gl-spikes3d": "^1.0.8", "glslify": "^7.0.0", + "has-passive-events": "^1.0.0", "is-mobile": "^2.0.0", "mouse-change": "^1.4.0", - "ndarray": "^1.0.18" + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.2.0", + "ndarray": "^1.0.18", + "right-now": "^1.0.0" } }, "gl-pointcloud2d": { @@ -3859,9 +3922,9 @@ } }, "gl-scatter3d": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/gl-scatter3d/-/gl-scatter3d-1.1.6.tgz", - "integrity": "sha512-KwdBJMyc9d7snHAfIlJAPPFa70zNWjrxuZV6NyMCEM9WlzFCoIScMtbuPdpQZJccaFjmM+aBfyiyWBbGWYsBjw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/gl-scatter3d/-/gl-scatter3d-1.2.1.tgz", + "integrity": "sha512-bGeCkqWOvjE+CM6eJGapTfZcVAjAVdUoi3LjRtvnVmpaTBeMF+HWG5mTa1pWKHu+DNEosH3Yjr52wNenYHMUdg==", "dev": true, "requires": { "gl-buffer": "^2.0.6", @@ -3937,9 +4000,9 @@ } }, "gl-streamtube3d": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gl-streamtube3d/-/gl-streamtube3d-1.1.2.tgz", - "integrity": "sha512-+26m5VyF5tyjLetDD9FGGb1yWU5gdZqHpCwwLH/Gmm0YMWn/Y8B/a/44qn5OeqeMyG1aox7C/fhZlRXhfxX4Vw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/gl-streamtube3d/-/gl-streamtube3d-1.2.1.tgz", + "integrity": "sha512-1aj1noU+jJirl5IwFXk29eDx1nO7PQk4r0UZK3My56J3vDSfRR+IbMq2YBhBkjfCWsKY1nc9ESD8t9EcqZY91w==", "dev": true, "requires": { "gl-vec3": "^1.0.0", @@ -3949,9 +4012,9 @@ } }, "gl-surface3d": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/gl-surface3d/-/gl-surface3d-1.4.1.tgz", - "integrity": "sha512-pJss1rw6SoCRhvvNd0x49GSDK7YusQq1JqCtUb4TPPJCCkY3TmsDdMAve7JL41ZqoVmzFdOGEBZ1wERSZWadFg==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/gl-surface3d/-/gl-surface3d-1.4.5.tgz", + "integrity": "sha512-uu+s3jxM7kMdTpYvXVJPujOQMo3B/+AOG4KX7niZHVnykuCKO11+haZSDF2ucymrIrRyUGknGIto6CVpLmP7og==", "dev": true, "requires": { "binary-search-bounds": "^2.0.4", @@ -3973,14 +4036,6 @@ "ndarray-scratch": "^1.1.1", "surface-nets": "^1.0.2", "typedarray-pool": "^1.0.0" - }, - "dependencies": { - "binary-search-bounds": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", - "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==", - "dev": true - } } }, "gl-text": { @@ -4020,9 +4075,9 @@ } }, "gl-util": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.1.tgz", - "integrity": "sha512-KAQ/CsMlrLmcmQN44qBLSfsJb4PAkczDOSSP5JUM7pf/PFx3PdBZDaIfk+N9HZQzhP0sk8k8oBSLPJeSm/S0wQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.2.tgz", + "integrity": "sha512-8czWhGTGp/H4S35X1UxGbFlJ1hjtTFhm2mc85GcymEi1CDf633WJgtkCddEiSjIa4BnNxBrqOIhj6jlF6naPqw==", "dev": true, "requires": { "is-browser": "^2.0.1", @@ -4655,14 +4710,16 @@ } }, "gulp-uglify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.1.tgz", - "integrity": "sha512-KVffbGY9d4Wv90bW/B1KZJyunLMyfHTBbilpDvmcrj5Go0/a1G3uVpt+1gRBWSw/11dqR3coJ1oWNTt1AiXuWQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.2.tgz", + "integrity": "sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg==", "dev": true, "requires": { + "array-each": "^1.0.1", + "extend-shallow": "^3.0.2", "gulplog": "^1.0.0", "has-gulplog": "^0.1.0", - "lodash": "^4.13.1", + "isobject": "^3.0.1", "make-error-cause": "^1.1.1", "safe-buffer": "^5.1.2", "through2": "^2.0.0", @@ -4837,9 +4894,9 @@ } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "ignore": { @@ -4973,6 +5030,14 @@ "dev": true, "requires": { "binary-search-bounds": "^1.0.0" + }, + "dependencies": { + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=", + "dev": true + } } }, "invert-kv": { @@ -5396,9 +5461,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", + "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -5848,6 +5913,14 @@ "gl-mat4": "^1.1.2", "gl-vec3": "^1.0.3", "mat4-interpolate": "^1.0.3" + }, + "dependencies": { + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=", + "dev": true + } } }, "mdn-data": { @@ -6587,9 +6660,9 @@ } }, "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", + "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==", "dev": true }, "pad-left": { @@ -6602,9 +6675,9 @@ } }, "parenthesis": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.5.tgz", - "integrity": "sha512-9KbfUp3+gD0MIl4AGfLBwVNvcPf1fokUJtYxql511chVNnS8DrYFazqBfZDqD4GV76XUhQbbxmZJPPOsV4GIbw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.6.tgz", + "integrity": "sha512-2fobSoJQTFoIKJ2kXw8QupNtKJ93lNwRgwBxf8YxMNWnWwvMVzqs/baseqWhHP1bRQGf0cv75UtO71nUO5dFuA==", "dev": true }, "parse-filepath": { @@ -6720,13 +6793,13 @@ } }, "pbf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.1.0.tgz", - "integrity": "sha512-/hYJmIsTmh7fMkHAWWXJ5b8IKLWdjdlAFb3IHkRBn1XUhIYBChVGfVwmHEAV3UfXTxsP/AKfYTXTS/dCPxJd5w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.0.tgz", + "integrity": "sha512-98Eh7rsJNJF/Im6XYMLaOW3cLnNyedlOd6hu3iWMD5I7FZGgpw8yN3vQBrmLbLodu7G784Irb9Qsv2yFrxSAGw==", "dev": true, "requires": { - "ieee754": "^1.1.6", - "resolve-protobuf-schema": "^2.0.0" + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" } }, "performance-now": { @@ -6835,13 +6908,12 @@ } }, "plotly.js": { - "version": "1.44.4", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.44.4.tgz", - "integrity": "sha512-YTSR4gZCpZw4PznaxdRQEh39SUok0lTJtRfIYG5AGoSmQ83JN6nEbHsGbaNZeB3L0M5eHRbeCEEJDSDLngKFTQ==", + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.46.0.tgz", + "integrity": "sha512-x+2BiKtwtuBsO+vuM1/RqmdFgXs58ftprOVxKGtZmygI6NBYlFcOtkGlGy5U3Lg8H9Fzq0U26J+UpdmEisomgw==", "dev": true, "requires": { - "3d-view": "^2.0.0", - "@plotly/d3-sankey": "^0.5.1", + "@plotly/d3-sankey": "0.7.2", "alpha-shape": "^1.0.0", "array-range": "^1.0.1", "canvas-fit": "^1.5.0", @@ -6850,25 +6922,28 @@ "country-regex": "^1.1.0", "d3": "^3.5.12", "d3-force": "^1.0.6", + "d3-hierarchy": "^1.1.8", + "d3-interpolate": "1", + "d3-sankey-circular": "0.33.0", "delaunay-triangulate": "^1.1.6", "es6-promise": "^3.0.2", "fast-isnumeric": "^1.1.2", "font-atlas-sdf": "^1.3.3", - "gl-cone3d": "^1.2.2", + "gl-cone3d": "^1.3.1", "gl-contour2d": "^1.1.5", - "gl-error3d": "^1.0.13", + "gl-error3d": "^1.0.15", "gl-heatmap2d": "^1.0.5", - "gl-line3d": "^1.1.10", + "gl-line3d": "^1.1.11", "gl-mat4": "^1.2.0", - "gl-mesh3d": "^2.0.7", + "gl-mesh3d": "^2.0.9", "gl-plot2d": "^1.4.2", - "gl-plot3d": "^1.6.3", + "gl-plot3d": "^2.2.1", "gl-pointcloud2d": "^1.0.2", - "gl-scatter3d": "^1.1.6", + "gl-scatter3d": "^1.2.1", "gl-select-box": "^1.0.3", "gl-spikes2d": "^1.0.2", - "gl-streamtube3d": "^1.1.2", - "gl-surface3d": "^1.4.1", + "gl-streamtube3d": "^1.2.1", + "gl-surface3d": "^1.4.5", "gl-text": "^1.1.6", "glslify": "^7.0.0", "has-hover": "^1.0.1", @@ -6886,7 +6961,7 @@ "regl": "^1.3.11", "regl-error2d": "^2.0.6", "regl-line2d": "3.0.13", - "regl-scatter2d": "^3.1.3", + "regl-scatter2d": "^3.1.4", "regl-splom": "^1.0.6", "right-now": "^1.0.0", "robust-orientation": "^1.1.3", @@ -6959,9 +7034,9 @@ "dev": true }, "point-cluster": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/point-cluster/-/point-cluster-3.1.4.tgz", - "integrity": "sha512-jVjzC1vYoZlvcLWi170i41he5LhJTncOgFPaZx1uoqNn+8q+24xjLS9yG68XfN6/U1F52kliD6a3oXjJduerTQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/point-cluster/-/point-cluster-3.1.5.tgz", + "integrity": "sha512-KpVtB1mXDlo6yzv80MA6oUq+1519CMeeUd4PPluM4ZlAQgHi/qeBrLY2G53RLy41kas7XvKol0FM98MSrjNH7Q==", "dev": true, "requires": { "array-bounds": "^1.0.1", @@ -6974,14 +7049,6 @@ "is-obj": "^1.0.1", "math-log2": "^1.0.1", "parse-rect": "^1.2.0" - }, - "dependencies": { - "binary-search-bounds": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", - "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==", - "dev": true - } } }, "point-in-big-polygon": { @@ -6994,6 +7061,14 @@ "interval-tree-1d": "^1.0.1", "robust-orientation": "^1.1.3", "slab-decomposition": "^1.0.1" + }, + "dependencies": { + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=", + "dev": true + } } }, "polybooljs": { @@ -7359,9 +7434,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", - "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz", + "integrity": "sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==", "dev": true, "requires": { "regenerate": "^1.4.0" @@ -7384,17 +7459,17 @@ "dev": true }, "regexpu-core": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", - "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", "dev": true, "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^7.0.0", + "regenerate-unicode-properties": "^8.0.2", "regjsgen": "^0.5.0", "regjsparser": "^0.6.0", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.0.2" + "unicode-match-property-value-ecmascript": "^1.1.0" } }, "regjsgen": { @@ -7455,9 +7530,9 @@ } }, "regl-scatter2d": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.1.3.tgz", - "integrity": "sha512-71DpYoJKAopjCP8kRgdReoBLIUre9vsoUgoWDEEeSHRsDEqIwPguhuEerxXpqY5zZ8P3COEqjYZ/sGpoeI8WCA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.1.4.tgz", + "integrity": "sha512-X3FNkh3lw4B3cGLpGZYhSXoeeNAYYeAZnjoP4R8+uCmCbBiwoXUiLQw73HxjsCs53l/upzrSLCwu13QZy/MHeQ==", "dev": true, "requires": { "array-range": "^1.0.1", @@ -8110,6 +8185,14 @@ "binary-search-bounds": "^1.0.0", "functional-red-black-tree": "^1.0.0", "robust-orientation": "^1.1.3" + }, + "dependencies": { + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=", + "dev": true + } } }, "slash": { @@ -8380,9 +8463,9 @@ "dev": true }, "static-eval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.1.tgz", - "integrity": "sha512-1JJ8ADJ7UB//CRqocI6j4WxGvSqQHX14Fz0gXDNvRA6Y1JIAI/lMNdqn1lpnaA6ugQ0fMH0uBB955DkwhKActw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", "dev": true, "requires": { "escodegen": "^1.8.1" @@ -9274,19 +9357,19 @@ } }, "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.3.tgz", + "integrity": "sha512-rIQPT2UMDnk4jRX+w4WO84/pebU2jiLsjgIyrCktYgSvx28enOE3iYQMr+BD1rHiitWnDmpu0cY/LfIEpKcjcw==", "dev": true, "requires": { - "commander": "~2.17.1", + "commander": "~2.19.0", "source-map": "~0.6.1" }, "dependencies": { "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true }, "source-map": { @@ -9350,15 +9433,15 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", - "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", "dev": true }, "unicode-property-aliases-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", - "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", "dev": true }, "union-find": { diff --git a/package.json b/package.json index 660fad50..51d1f07b 100644 --- a/package.json +++ b/package.json @@ -8,20 +8,20 @@ }, "devDependencies": { "bootstrap": "4.3.1", - "del": "^3.0.0", + "del": "^4.1.0", "font-awesome": "^4.7.0", "gulp": "^4.0.0", "gulp-concat": "^2.6.1", "gulp-csso": "^3.0.1", "gulp-flatten": "^0.4.0", - "gulp-sass": "^4.0.1", + "gulp-sass": "^4.0.2", "gulp-sass-glob": "^1.0.9", "gulp-sass-lint": "^1.4.0", "gulp-spawn": "^0.4.4", - "gulp-uglify": "^3.0.1", + "gulp-uglify": "^3.0.2", "jquery": "^3.3.1", "moment": "^2.24.0", - "plotly.js": "^1.44.4", + "plotly.js": "^1.46.0", "popper.js": "^1.14.7", "pump": "^3.0.0", "tempusdominus-bootstrap-4": "^5.1.2", diff --git a/static/babybuddy/js/graph.9d17ed9a2576.js b/static/babybuddy/js/graph.531e69c82303.js similarity index 96% rename from static/babybuddy/js/graph.9d17ed9a2576.js rename to static/babybuddy/js/graph.531e69c82303.js index 6e74d25a..6b0e54e8 100644 --- a/static/babybuddy/js/graph.9d17ed9a2576.js +++ b/static/babybuddy/js/graph.531e69c82303.js @@ -1,5 +1,5 @@ /** -* plotly.js (cartesian) v1.44.4 +* plotly.js (cartesian) v1.46.0 * Copyright 2012-2019, Plotly, Inc. * All rights reserved. * Licensed under the MIT license @@ -38,16 +38,16 @@ var rules = { "X .cursor-n-resize": "cursor:n-resize;", "X .cursor-ne-resize": "cursor:ne-resize;", "X .cursor-grab": "cursor:-webkit-grab;cursor:grab;", - "X .modebar": "position:absolute;top:2px;right:2px;z-index:1001;", + "X .modebar": "position:absolute;top:2px;right:2px;", "X .ease-bg": "-webkit-transition:background-color 0.3s ease 0s;-moz-transition:background-color 0.3s ease 0s;-ms-transition:background-color 0.3s ease 0s;-o-transition:background-color 0.3s ease 0s;transition:background-color 0.3s ease 0s;", "X .modebar--hover>:not(.watermark)": "opacity:0;-webkit-transition:opacity 0.3s ease 0s;-moz-transition:opacity 0.3s ease 0s;-ms-transition:opacity 0.3s ease 0s;-o-transition:opacity 0.3s ease 0s;transition:opacity 0.3s ease 0s;", "X:hover .modebar--hover .modebar-group": "opacity:1;", - "X .modebar-group": "float:left;display:inline-block;box-sizing:border-box;margin-left:8px;position:relative;vertical-align:middle;white-space:nowrap;", + "X .modebar-group": "float:left;display:inline-block;box-sizing:border-box;padding-left:8px;position:relative;vertical-align:middle;white-space:nowrap;", "X .modebar-btn": "position:relative;font-size:16px;padding:3px 4px;height:22px;cursor:pointer;line-height:normal;box-sizing:border-box;", "X .modebar-btn svg": "position:relative;top:2px;", "X .modebar.vertical": "display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-end;max-height:100%;", "X .modebar.vertical svg": "top:-1px;", - "X .modebar.vertical .modebar-group": "display:block;float:none;margin-left:0px;margin-bottom:8px;", + "X .modebar.vertical .modebar-group": "display:block;float:none;padding-left:0px;padding-bottom:8px;", "X .modebar.vertical .modebar-group .modebar-btn": "display:block;text-align:center;", "X [data-title]:before,X [data-title]:after": "position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;", "X [data-title]:hover:before,X [data-title]:hover:after": "display:block;opacity:1;", @@ -215,7 +215,7 @@ module.exports = { module.exports = _dereq_('../src/traces/bar'); -},{"../src/traces/bar":274}],4:[function(_dereq_,module,exports){ +},{"../src/traces/bar":273}],4:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -228,7 +228,7 @@ module.exports = _dereq_('../src/traces/bar'); module.exports = _dereq_('../src/traces/box'); -},{"../src/traces/box":288}],5:[function(_dereq_,module,exports){ +},{"../src/traces/box":287}],5:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -241,7 +241,7 @@ module.exports = _dereq_('../src/traces/box'); module.exports = _dereq_('../src/traces/contour'); -},{"../src/traces/contour":308}],6:[function(_dereq_,module,exports){ +},{"../src/traces/contour":307}],6:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -267,7 +267,7 @@ module.exports = _dereq_('../src/core'); module.exports = _dereq_('../src/traces/heatmap'); -},{"../src/traces/heatmap":324}],8:[function(_dereq_,module,exports){ +},{"../src/traces/heatmap":323}],8:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -280,7 +280,7 @@ module.exports = _dereq_('../src/traces/heatmap'); module.exports = _dereq_('../src/traces/histogram'); -},{"../src/traces/histogram":342}],9:[function(_dereq_,module,exports){ +},{"../src/traces/histogram":341}],9:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -293,7 +293,7 @@ module.exports = _dereq_('../src/traces/histogram'); module.exports = _dereq_('../src/traces/histogram2d'); -},{"../src/traces/histogram2d":349}],10:[function(_dereq_,module,exports){ +},{"../src/traces/histogram2d":348}],10:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -306,7 +306,7 @@ module.exports = _dereq_('../src/traces/histogram2d'); module.exports = _dereq_('../src/traces/histogram2dcontour'); -},{"../src/traces/histogram2dcontour":353}],11:[function(_dereq_,module,exports){ +},{"../src/traces/histogram2dcontour":352}],11:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -347,7 +347,7 @@ module.exports = Plotly; module.exports = _dereq_('../src/traces/pie'); -},{"../src/traces/pie":360}],13:[function(_dereq_,module,exports){ +},{"../src/traces/pie":359}],13:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -360,7 +360,7 @@ module.exports = _dereq_('../src/traces/pie'); module.exports = _dereq_('../src/traces/scatterternary'); -},{"../src/traces/scatterternary":399}],14:[function(_dereq_,module,exports){ +},{"../src/traces/scatterternary":398}],14:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -373,7 +373,7 @@ module.exports = _dereq_('../src/traces/scatterternary'); module.exports = _dereq_('../src/traces/violin'); -},{"../src/traces/violin":407}],15:[function(_dereq_,module,exports){ +},{"../src/traces/violin":406}],15:[function(_dereq_,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -15219,7 +15219,7 @@ module.exports = templatedArray('annotation', { } }); -},{"../../plot_api/plot_template":202,"../../plots/cartesian/constants":218,"../../plots/font_attributes":239,"./arrow_paths":35}],37:[function(_dereq_,module,exports){ +},{"../../plot_api/plot_template":202,"../../plots/cartesian/constants":218,"../../plots/font_attributes":238,"./arrow_paths":35}],37:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -15447,7 +15447,7 @@ function clickData2r(d, ax) { return ax.type === 'log' ? ax.l2r(d) : ax.d2r(d); } -},{"../../lib":168,"../../plot_api/plot_template":202,"../../registry":257}],39:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plot_api/plot_template":202,"../../registry":256}],39:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -15502,7 +15502,6 @@ module.exports = function handleAnnotationCommonDefaults(annIn, annOut, fullLayo coerce('arrowwidth', ((borderOpacity && borderWidth) || 1) * 2); coerce('standoff'); coerce('startstandoff'); - } var hoverText = coerce('hovertext'); @@ -16334,7 +16333,6 @@ function drawRaw(gd, options, index, subplotId, xa, ya) { var xUpdate, yUpdate; if(xa) { xUpdate = xa.p2r(xa.r2p(options.x) + dx); - } else { var widthFraction = options._xsize / gs.w; var xLeft = options.x + (options._xshift - options.xshift) / gs.w - widthFraction / 2; @@ -16403,7 +16401,7 @@ function drawRaw(gd, options, index, subplotId, xa, ya) { else annText.call(textLayout); } -},{"../../lib":168,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/cartesian/axes":212,"../../plots/plots":245,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"../fx":90,"./draw_arrow_head":43,"d3":16}],43:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/cartesian/axes":212,"../../plots/plots":244,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"../fx":90,"./draw_arrow_head":43,"d3":16}],43:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -16481,7 +16479,6 @@ module.exports = function drawArrowHead(el3, ends, options) { end.x += backOffX; end.y += backOffY; el3.attr({x2: end.x, y2: end.y}); - } if(startBackOff) { @@ -16495,7 +16492,6 @@ module.exports = function drawArrowHead(el3, ends, options) { start.x -= startBackOffX; start.y -= startbackOffY; el3.attr({x1: start.x, y1: start.y}); - } } else if(el.nodeName === 'path') { @@ -16591,7 +16587,7 @@ module.exports = { convertCoords: _dereq_('./convert_coords') }; -},{"../../plots/cartesian/include_components":223,"./attributes":36,"./calc_autorange":37,"./click":38,"./convert_coords":40,"./defaults":41,"./draw":42}],45:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/include_components":222,"./attributes":36,"./calc_autorange":37,"./click":38,"./convert_coords":40,"./defaults":41,"./draw":42}],45:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -16872,7 +16868,7 @@ module.exports = function draw(scene) { } }; -},{"../../plots/gl3d/project":242,"../annotations/draw":42}],49:[function(_dereq_,module,exports){ +},{"../../plots/gl3d/project":241,"../annotations/draw":42}],49:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -16920,7 +16916,7 @@ function includeGL3D(layoutIn, layoutOut) { } } -},{"../../lib":168,"../../registry":257,"./attributes":45,"./convert":46,"./defaults":47,"./draw":48}],50:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"./attributes":45,"./convert":46,"./defaults":47,"./draw":48}],50:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -17307,7 +17303,7 @@ module.exports = overrideAll({ } }, 'colorbars', 'from-root'); -},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plots/cartesian/layout_attributes":225,"../../plots/font_attributes":239}],53:[function(_dereq_,module,exports){ +},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plots/cartesian/layout_attributes":224,"../../plots/font_attributes":238}],53:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -17469,7 +17465,7 @@ module.exports = function colorbarDefaults(containerIn, containerOut, layout) { coerce('title.side'); }; -},{"../../lib":168,"../../plot_api/plot_template":202,"../../plots/cartesian/tick_label_defaults":232,"../../plots/cartesian/tick_mark_defaults":233,"../../plots/cartesian/tick_value_defaults":234,"./attributes":52}],56:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plot_api/plot_template":202,"../../plots/cartesian/tick_label_defaults":231,"../../plots/cartesian/tick_mark_defaults":232,"../../plots/cartesian/tick_value_defaults":233,"./attributes":52}],56:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -17906,7 +17902,6 @@ module.exports = function draw(gd, id) { var vals = Axes.calcTicks(cbAxisOut); var transFn = Axes.makeTransFn(cbAxisOut); - var labelFns = Axes.makeLabelFns(cbAxisOut, shift); var tickSign = Axes.getTickSigns(cbAxisOut)[2]; Axes.drawTicks(gd, cbAxisOut, { @@ -17920,9 +17915,7 @@ module.exports = function draw(gd, id) { vals: vals, layer: axisLayer, transFn: transFn, - labelXFn: labelFns.labelXFn, - labelYFn: labelFns.labelYFn, - labelAnchorFn: labelFns.labelAnchorFn + labelFns: Axes.makeLabelFns(cbAxisOut, shift) }); }, function() { @@ -18167,7 +18160,7 @@ module.exports = function draw(gd, id) { return component; }; -},{"../../constants/alignment":146,"../../lib":168,"../../lib/extend":162,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../plots/cartesian/axis_defaults":214,"../../plots/cartesian/layout_attributes":225,"../../plots/cartesian/position_defaults":228,"../../plots/plots":245,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"../titles":139,"./attributes":52,"./constants":54,"d3":16,"tinycolor2":34}],57:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../lib":168,"../../lib/extend":162,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../plots/cartesian/axis_defaults":214,"../../plots/cartesian/layout_attributes":224,"../../plots/cartesian/position_defaults":227,"../../plots/plots":244,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"../titles":139,"./attributes":52,"./constants":54,"d3":16,"tinycolor2":34}],57:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -18276,6 +18269,8 @@ module.exports = function colorScaleAttrs(context, opts) { var auto = cLetter + 'auto'; var min = cLetter + 'min'; var max = cLetter + 'max'; + var mid = cLetter + 'mid'; + var autoFull = code(contextHead + auto); var minFull = code(contextHead + min); var maxFull = code(contextHead + max); var minmaxFull = minFull + ' and ' + maxFull; @@ -18327,6 +18322,15 @@ module.exports = function colorScaleAttrs(context, opts) { }; + attrs[mid] = { + valType: 'number', + + dflt: null, + editType: 'calc', + impliedEdits: autoImpliedEdits, + + }; + attrs.colorscale = { valType: 'colorscale', @@ -18393,9 +18397,11 @@ module.exports = function calc(gd, trace, opts) { var autoAttr = cLetter + 'auto'; var minAttr = cLetter + 'min'; var maxAttr = cLetter + 'max'; + var midAttr = cLetter + 'mid'; var auto = container[autoAttr]; var min = container[minAttr]; var max = container[maxAttr]; + var mid = container[midAttr]; var scl = container.colorscale; if(auto !== false || min === undefined) { @@ -18406,6 +18412,15 @@ module.exports = function calc(gd, trace, opts) { max = Lib.aggNums(Math.max, null, vals); } + if(auto !== false && mid !== undefined) { + if(max - mid > mid - min) { + min = mid - (max - mid); + } + else if(max - mid < mid - min) { + max = mid + (mid - min); + } + } + if(min === max) { min -= 0.5; max += 0.5; @@ -18469,10 +18484,16 @@ module.exports = function crossTraceDefaults(fullData) { for(var i = 0; i < fullData.length; i++) { var trace = fullData[i]; - var _module = trace._module; + var colorbar = trace._module.colorbar; - if(_module.colorbar) { - relinkColorAtts(trace, _module.colorbar); + if(colorbar) { + if(Array.isArray(colorbar)) { + for(var j = 0; j < colorbar.length; j++) { + relinkColorAtts(trace, colorbar[j]); + } + } else { + relinkColorAtts(trace, colorbar); + } } // TODO could generalize _module.colorscale and use it here? @@ -18531,9 +18552,14 @@ module.exports = function colorScaleDefaults(traceIn, traceOut, layout, coerce, var minIn = containerIn[cLetter + 'min']; var maxIn = containerIn[cLetter + 'max']; var validMinMax = isNumeric(minIn) && isNumeric(maxIn) && (minIn < maxIn); - coerce(prefix + cLetter + 'auto', !validMinMax); - coerce(prefix + cLetter + 'min'); - coerce(prefix + cLetter + 'max'); + var auto = coerce(prefix + cLetter + 'auto', !validMinMax); + + if(auto) { + coerce(prefix + cLetter + 'mid'); + } else { + coerce(prefix + cLetter + 'min'); + coerce(prefix + cLetter + 'max'); + } // handles both the trace case (autocolorscale is false by default) and // the marker and marker.line case (autocolorscale is true by default) @@ -19427,7 +19453,7 @@ function pointerOffset(e) { ); } -},{"../../constants/interactions":148,"../../lib":168,"../../plots/cartesian/constants":218,"../../registry":257,"./align":67,"./cursor":68,"./unhover":70,"has-hover":20,"has-passive-events":21,"mouse-event-offset":24}],70:[function(_dereq_,module,exports){ +},{"../../constants/interactions":148,"../../lib":168,"../../plots/cartesian/constants":218,"../../registry":256,"./align":67,"./cursor":68,"./unhover":70,"has-hover":20,"has-passive-events":21,"mouse-event-offset":24}],70:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -19623,7 +19649,9 @@ drawing.hideOutsideRangePoints = function(traceGroups, subplot) { var trace = d[0].trace; var xcalendar = trace.xcalendar; var ycalendar = trace.ycalendar; - var selector = trace.type === 'bar' ? '.bartext' : '.point,.textpoint'; + var selector = trace.type === 'bar' ? '.bartext' : + trace.type === 'waterfall' ? '.bartext,.line' : + '.point,.textpoint'; traceGroups.selectAll(selector).each(function(d) { drawing.hideOutsideRangePoint(d, d3.select(this), xa, ya, xcalendar, ycalendar); @@ -20668,7 +20696,7 @@ drawing.setTextPointsScale = function(selection, xScale, yScale) { }); }; -},{"../../constants/alignment":146,"../../constants/interactions":148,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../lib/svg_text_utils":189,"../../registry":257,"../../traces/scatter/make_bubble_size_func":384,"../../traces/scatter/subtypes":391,"../color":51,"../colorscale":63,"./symbol_defs":73,"d3":16,"fast-isnumeric":18,"tinycolor2":34}],73:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../constants/interactions":148,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../lib/svg_text_utils":189,"../../registry":256,"../../traces/scatter/make_bubble_size_func":383,"../../traces/scatter/subtypes":390,"../color":51,"../colorscale":63,"./symbol_defs":73,"d3":16,"fast-isnumeric":18,"tinycolor2":34}],73:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21357,7 +21385,7 @@ function calcOneAxis(calcTrace, trace, axis, coord) { baseExtremes.max = baseExtremes.max.concat(extremes.max); } -},{"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":257,"./compute_error":76,"fast-isnumeric":18}],76:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":256,"./compute_error":76,"fast-isnumeric":18}],76:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21537,7 +21565,7 @@ module.exports = function(traceIn, traceOut, defaultColor, opts) { } }; -},{"../../lib":168,"../../plot_api/plot_template":202,"../../registry":257,"./attributes":74,"fast-isnumeric":18}],78:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plot_api/plot_template":202,"../../registry":256,"./attributes":74,"fast-isnumeric":18}],78:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21780,7 +21808,7 @@ function errorCoords(d, xa, ya) { return out; } -},{"../../traces/scatter/subtypes":391,"../drawing":72,"d3":16,"fast-isnumeric":18}],80:[function(_dereq_,module,exports){ +},{"../../traces/scatter/subtypes":390,"../drawing":72,"d3":16,"fast-isnumeric":18}],80:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21863,7 +21891,7 @@ module.exports = { } }; -},{"../../plots/font_attributes":239}],82:[function(_dereq_,module,exports){ +},{"../../plots/font_attributes":238}],82:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21921,7 +21949,7 @@ function paste(traceAttr, cd, cdAttr, fn) { } } -},{"../../lib":168,"../../registry":257}],83:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],83:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21959,7 +21987,7 @@ module.exports = function click(gd, evt, subplot) { } }; -},{"../../registry":257,"./hover":87}],84:[function(_dereq_,module,exports){ +},{"../../registry":256,"./hover":87}],84:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -22240,7 +22268,8 @@ var pointKeyMap = { locations: 'location', labels: 'label', values: 'value', - 'marker.colors': 'color' + 'marker.colors': 'color', + parents: 'parent' }; function getPointKey(astr) { @@ -22417,7 +22446,6 @@ exports.loneHover = function loneHover(hoverItem, opts) { }; exports.multiHovers = function multiHovers(hoverItems, opts) { - if(!Array.isArray(hoverItems)) { hoverItems = [hoverItems]; } @@ -22932,11 +22960,15 @@ function _hover(gd, evt, subplot, noHoverEvent) { var pt = hoverData[itemnum]; var eventData = helpers.makeEventData(pt, pt.trace, pt.cd); - var ht = false; - if(pt.cd[pt.index] && pt.cd[pt.index].ht) ht = pt.cd[pt.index].ht; - hoverData[itemnum].hovertemplate = ht || pt.trace.hovertemplate || false; - hoverData[itemnum].eventData = [eventData]; + if(pt.hovertemplate !== false) { + var ht = false; + if(pt.cd[pt.index] && pt.cd[pt.index].ht) { + ht = pt.cd[pt.index].ht; + } + pt.hovertemplate = ht || pt.trace.hovertemplate || false; + } + pt.eventData = [eventData]; newhoverdata.push(eventData); } @@ -22964,7 +22996,7 @@ function _hover(gd, evt, subplot, noHoverEvent) { var hoverLabels = createHoverText(hoverData, labelOpts, gd); - hoverAvoidOverlaps(hoverData, rotateLabels ? 'xa' : 'ya', fullLayout); + hoverAvoidOverlaps(hoverLabels, rotateLabels ? 'xa' : 'ya', fullLayout); alignHoverText(hoverLabels, rotateLabels); @@ -22998,6 +23030,7 @@ function _hover(gd, evt, subplot, noHoverEvent) { var EXTRA_STRING_REGEX = /([\s\S]*)<\/extra>/; function createHoverText(hoverData, opts, gd) { + var fullLayout = gd._fullLayout; var hovermode = opts.hovermode; var rotateLabels = opts.rotateLabels; var bgColor = opts.bgColor; @@ -23138,6 +23171,7 @@ function createHoverText(hoverData, opts, gd) { // show all the individual labels + // first create the objects var hoverLabels = container.selectAll('g.hovertext') .data(hoverData, function(d) { @@ -23185,6 +23219,10 @@ function createHoverText(hoverData, opts, gd) { if(d.nameOverride !== undefined) d.name = d.nameOverride; if(d.name) { + if(fullLayout.meta) { + d.name = Lib.templateString(d.name, {meta: fullLayout.meta}); + } + name = svgTextUtils.plainText(d.name || '', { len: d.nameLength, allowedTags: ['br', 'sub', 'sup', 'b', 'i', 'em'] @@ -23200,7 +23238,7 @@ function createHoverText(hoverData, opts, gd) { text = d[(hovermode === 'x' ? 'y' : 'x') + 'Label'] || ''; } else if(d.xLabel === undefined) { - if(d.yLabel !== undefined) text = d.yLabel; + if(d.yLabel !== undefined && d.trace.type !== 'scattercarpet') text = d.yLabel; } else if(d.yLabel === undefined) text = d.xLabel; else text = '(' + d.xLabel + ', ' + d.yLabel + ')'; @@ -23226,11 +23264,18 @@ function createHoverText(hoverData, opts, gd) { } // hovertemplate + var d3locale = gd._fullLayout._d3locale; var hovertemplate = d.hovertemplate || false; var hovertemplateLabels = d.hovertemplateLabels || d; var eventData = d.eventData[0] || {}; if(hovertemplate) { - text = Lib.hovertemplateString(hovertemplate, hovertemplateLabels, eventData); + text = Lib.hovertemplateString( + hovertemplate, + hovertemplateLabels, + d3locale, + eventData, + {meta: fullLayout.meta} + ); text = text.replace(EXTRA_STRING_REGEX, function(match, extra) { name = extra; // Assign name for secondary text label @@ -23309,13 +23354,22 @@ function createHoverText(hoverData, opts, gd) { d.pos = hty; anchorStartOK = htx + dx / 2 + txTotalWidth <= outerWidth; anchorEndOK = htx - dx / 2 - txTotalWidth >= 0; + if((d.idealAlign === 'left' || !anchorStartOK) && anchorEndOK) { htx -= dx / 2; d.anchor = 'end'; } else if(anchorStartOK) { htx += dx / 2; d.anchor = 'start'; - } else d.anchor = 'middle'; + } else { + d.anchor = 'middle'; + + var txHalfWidth = txTotalWidth / 2; + var overflowR = htx + txHalfWidth - outerWidth; + var overflowL = htx - txHalfWidth; + if(overflowR > 0) htx -= overflowR; + if(overflowL < 0) htx += -overflowL; + } } tx.attr('text-anchor', d.anchor); @@ -23339,17 +23393,21 @@ function createHoverText(hoverData, opts, gd) { // know what happens if the group spans all the way from one edge to // the other, though it hardly matters - there's just too much // information then. -function hoverAvoidOverlaps(hoverData, ax, fullLayout) { +function hoverAvoidOverlaps(hoverLabels, ax, fullLayout) { var nummoves = 0; var axSign = 1; + var nLabels = hoverLabels.size(); // make groups of touching points - var pointgroups = hoverData.map(function(d, i) { + var pointgroups = new Array(nLabels); + + hoverLabels.each(function(d, i) { var axis = d[ax]; var axIsX = axis._id.charAt(0) === 'x'; var rng = axis.range; if(!i && rng && ((rng[0] > rng[1]) !== axIsX)) axSign = -1; - return [{ + pointgroups[i] = [{ + datum: d, i: i, traceIndex: d.trace.index, dp: 0, @@ -23359,8 +23417,9 @@ function hoverAvoidOverlaps(hoverData, ax, fullLayout) { pmin: 0, pmax: (axIsX ? fullLayout.width : fullLayout.height) }]; - }) - .sort(function(a, b) { + }); + + pointgroups.sort(function(a, b) { return (a[0].posref - b[0].posref) || // for equal positions, sort trace indices increasing or decreasing // depending on whether the axis is reversed or not... so stacked @@ -23446,7 +23505,7 @@ function hoverAvoidOverlaps(hoverData, ax, fullLayout) { // loop through groups, combining them if they overlap, // until nothing moves - while(!donepositioning && nummoves <= hoverData.length) { + while(!donepositioning && nummoves <= nLabels) { // to avoid infinite loops, don't move more times // than there are traces nummoves++; @@ -23494,7 +23553,7 @@ function hoverAvoidOverlaps(hoverData, ax, fullLayout) { var grp = pointgroups[i]; for(j = grp.length - 1; j >= 0; j--) { var pt = grp[j]; - var hoverPt = hoverData[pt.i]; + var hoverPt = pt.datum; hoverPt.offset = pt.dp; hoverPt.del = pt.del; } @@ -23844,7 +23903,7 @@ function spikesChanged(gd, oldspikepoints) { return false; } -},{"../../lib":168,"../../lib/events":161,"../../lib/override_cursor":179,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"./constants":84,"./helpers":86,"d3":16,"fast-isnumeric":18,"tinycolor2":34}],88:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../lib/events":161,"../../lib/override_cursor":179,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"./constants":84,"./helpers":86,"d3":16,"fast-isnumeric":18,"tinycolor2":34}],88:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -23900,11 +23959,14 @@ module.exports = function(opts, extra) { valType: 'string', dflt: '', - arrayOk: true, - editType: 'none', + editType: opts.editType || 'none', }; + if(opts.arrayOk !== false) { + hovertemplate.arrayOk = true; + } + return hovertemplate; }; @@ -24083,7 +24145,7 @@ module.exports = { } }; -},{"../../plots/font_attributes":239,"./constants":84}],92:[function(_dereq_,module,exports){ +},{"../../plots/font_attributes":238,"./constants":84}],92:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -24114,7 +24176,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { } else { // flag for 'horizontal' plots: // determines the state of the mode bar 'compare' hovermode button - layoutOut._isHoriz = isHoriz(fullData); + layoutOut._isHoriz = isHoriz(fullData, layoutOut); hovermodeDflt = layoutOut._isHoriz ? 'y' : 'x'; } } @@ -24141,19 +24203,21 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { } }; -function isHoriz(fullData) { - var out = true; +function isHoriz(fullData, fullLayout) { + var stackOpts = fullLayout._scatterStackOpts || {}; for(var i = 0; i < fullData.length; i++) { var trace = fullData[i]; + var subplot = trace.xaxis + trace.yaxis; + var subplotStackOpts = stackOpts[subplot] || {}; + var groupOpts = subplotStackOpts[trace.stackgroup] || {}; - if(trace.orientation !== 'h') { - out = false; - break; + if(trace.orientation !== 'h' && groupOpts.orientation !== 'h') { + return false; } } - return out; + return true; } },{"../../lib":168,"./layout_attributes":91}],93:[function(_dereq_,module,exports){ @@ -24564,7 +24628,7 @@ module.exports = { contentDefaults: contentDefaults }; -},{"../../lib":168,"../../lib/regex":183,"../../plot_api/plot_template":202,"../../plots/cartesian/constants":218,"../../plots/domain":238}],95:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../lib/regex":183,"../../plot_api/plot_template":202,"../../plots/cartesian/constants":218,"../../plots/domain":237}],95:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -24811,7 +24875,6 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) { function imageDefaults(imageIn, imageOut, fullLayout) { - function coerce(attr, dflt) { return Lib.coerce(imageIn, imageOut, attributes, attr, dflt); } @@ -24932,7 +24995,6 @@ module.exports = function draw(gd) { thisImage.attr('xmlns', xmlnsNamespaces.svg); var imagePromise = new Promise(function(resolve) { - var img = new Image(); this.img = img; @@ -25093,7 +25155,7 @@ module.exports = { convertCoords: _dereq_('./convert_coords') }; -},{"../../plots/cartesian/include_components":223,"./attributes":95,"./convert_coords":96,"./defaults":97,"./draw":98}],100:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/include_components":222,"./attributes":95,"./convert_coords":96,"./defaults":97,"./draw":98}],100:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -25209,7 +25271,7 @@ module.exports = { editType: 'legend' }; -},{"../../plots/font_attributes":239,"../color/attributes":50}],101:[function(_dereq_,module,exports){ +},{"../../plots/font_attributes":238,"../color/attributes":50}],101:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -25342,7 +25404,7 @@ module.exports = function legendDefaults(layoutIn, layoutOut, fullData) { Lib.noneOrAll(containerIn, containerOut, ['x', 'y']); }; -},{"../../lib":168,"../../plot_api/plot_template":202,"../../plots/layout_attributes":243,"../../registry":257,"./attributes":100,"./helpers":106}],103:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plot_api/plot_template":202,"../../plots/layout_attributes":242,"../../registry":256,"./attributes":100,"./helpers":106}],103:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -25463,10 +25525,13 @@ module.exports = function draw(gd) { }) .each(function() { d3.select(this) - .call(drawTexts, gd, maxLength) - .call(setupTraceToggle, gd); + .call(drawTexts, gd, maxLength); }) - .call(style, gd); + .call(style, gd) + .each(function() { + d3.select(this) + .call(setupTraceToggle, gd); + }); Lib.syncOrAsync([Plots.previousPromises, function() { @@ -25749,9 +25814,13 @@ function drawTexts(g, gd, maxLength) { var trace = legendItem.trace; var isPie = Registry.traceIs(trace, 'pie'); var traceIndex = trace.index; - var name = isPie ? legendItem.label : trace.name; var isEditable = gd._context.edits.legendText && !isPie; + var name = isPie ? legendItem.label : trace.name; + if(fullLayout.meta) { + name = Lib.templateString(name, {meta: fullLayout.meta}); + } + var textEl = Lib.ensureSingle(g, 'text', 'legendtext'); textEl.attr('text-anchor', 'start') @@ -25894,6 +25963,8 @@ function computeLegendDimensions(gd, groups, traces) { var extraWidth = 0; + var traceGap = 5; + opts._width = 0; opts._height = 0; @@ -25927,23 +25998,53 @@ function computeLegendDimensions(gd, groups, traces) { extraWidth = 40; } else if(isGrouped) { - var groupXOffsets = [opts._width]; + var maxHeight = 0; + var maxWidth = 0; var groupData = groups.data(); - for(var i = 0, n = groupData.length; i < n; i++) { - var textWidths = groupData[i].map(function(legendItemArray) { + var maxItems = 0; + + var i; + for(i = 0; i < groupData.length; i++) { + var group = groupData[i]; + var groupWidths = group.map(function(legendItemArray) { return legendItemArray[0].width; }); - var groupWidth = 40 + Math.max.apply(null, textWidths); + var groupWidth = Lib.aggNums(Math.max, null, groupWidths); + var groupHeight = group.reduce(function(a, b) { + return a + b[0].height; + }, 0); - opts._width += opts.tracegroupgap + groupWidth; + maxWidth = Math.max(maxWidth, groupWidth); + maxHeight = Math.max(maxHeight, groupHeight); + maxItems = Math.max(maxItems, group.length); + } + maxWidth += traceGap; + maxWidth += 40; + + var groupXOffsets = [opts._width]; + var groupYOffsets = []; + var rowNum = 0; + for(i = 0; i < groupData.length; i++) { + if(fullLayout._size.w < (borderwidth + opts._width + traceGap + maxWidth)) { + groupXOffsets[groupXOffsets.length - 1] = groupXOffsets[0]; + opts._width = maxWidth; + rowNum++; + } else { + opts._width += maxWidth + borderwidth; + } + + var rowYOffset = (rowNum * maxHeight); + rowYOffset += rowNum > 0 ? opts.tracegroupgap : 0; + + groupYOffsets.push(rowYOffset); groupXOffsets.push(opts._width); } groups.each(function(d, i) { - Drawing.setTranslate(this, groupXOffsets[i], 0); + Drawing.setTranslate(this, groupXOffsets[i], groupYOffsets[i]); }); groups.each(function() { @@ -25961,11 +26062,13 @@ function computeLegendDimensions(gd, groups, traces) { groupHeight += textHeight; }); - - opts._height = Math.max(opts._height, groupHeight); }); - opts._height += 10 + borderwidth * 2; + var maxYLegend = groupYOffsets[groupYOffsets.length - 1] + maxHeight; + opts._height = 10 + (borderwidth * 2) + maxYLegend; + + var maxOffset = Math.max.apply(null, groupXOffsets); + opts._width = maxOffset + maxWidth + 40; opts._width += borderwidth * 2; } else { @@ -25974,7 +26077,6 @@ function computeLegendDimensions(gd, groups, traces) { var maxTraceWidth = 0; var offsetX = 0; var fullTracesWidth = 0; - var traceGap = opts.tracegroupgap || 5; // calculate largest width for traces and use for width of all legend items traces.each(function(d) { @@ -26094,7 +26196,7 @@ function expandHorizontalMargin(gd) { }); } -},{"../../constants/alignment":146,"../../constants/interactions":148,"../../lib":168,"../../lib/events":161,"../../lib/svg_text_utils":189,"../../plots/plots":245,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"./constants":101,"./get_legend_data":104,"./handle_click":105,"./helpers":106,"./style":108,"d3":16}],104:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../constants/interactions":148,"../../lib":168,"../../lib/events":161,"../../lib/svg_text_utils":189,"../../plots/plots":244,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"./constants":101,"./get_legend_data":104,"./handle_click":105,"./helpers":106,"./style":108,"d3":16}],104:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -26199,7 +26301,7 @@ module.exports = function getLegendData(calcdata, opts) { return legendData; }; -},{"../../registry":257,"./helpers":106}],105:[function(_dereq_,module,exports){ +},{"../../registry":256,"./helpers":106}],105:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -26423,7 +26525,7 @@ module.exports = function handleClick(g, gd, numClicks) { } }; -},{"../../lib":168,"../../registry":257}],106:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],106:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -26535,6 +26637,7 @@ module.exports = function style(s, gd) { .enter().append('g') .classed('legendpoints', true); }) + .each(styleWaterfalls) .each(styleBars) .each(styleBoxes) .each(stylePies) @@ -26619,7 +26722,6 @@ module.exports = function style(s, gd) { trace.colorscale, 'stroke'); } } - } function stylePoints(d) { @@ -26715,6 +26817,38 @@ module.exports = function style(s, gd) { txt.selectAll('text').call(Drawing.textPointStyle, tMod, gd); } + function styleWaterfalls(d) { + var trace = d[0].trace; + + var ptsData = []; + if(trace.type === 'waterfall' && trace.visible) { + ptsData = d[0].hasTotals ? + [['increasing', 'M-6,-6V6H0Z'], ['totals', 'M6,6H0L-6,-6H-0Z'], ['decreasing', 'M6,6V-6H0Z']] : + [['increasing', 'M-6,-6V6H6Z'], ['decreasing', 'M6,6V-6H-6Z']]; + } + + var pts = d3.select(this).select('g.legendpoints') + .selectAll('path.legendwaterfall') + .data(ptsData); + pts.enter().append('path').classed('legendwaterfall', true) + .attr('transform', 'translate(20,0)') + .style('stroke-miterlimit', 1); + pts.exit().remove(); + + pts.each(function(dd) { + var pt = d3.select(this); + var cont = trace[dd[0]].marker; + + pt.attr('d', dd[1]) + .style('stroke-width', cont.line.width + 'px') + .call(Color.fill, cont.color); + + if(cont.line.width) { + pt.call(Color.stroke, cont.line.color); + } + }); + } + function styleBars(d) { var trace = d[0].trace; var marker = trace.marker || {}; @@ -26840,7 +26974,7 @@ module.exports = function style(s, gd) { } }; -},{"../../lib":168,"../../registry":257,"../../traces/pie/style_one":365,"../../traces/scatter/subtypes":391,"../color":51,"../drawing":72,"d3":16}],109:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"../../traces/pie/style_one":364,"../../traces/scatter/subtypes":390,"../color":51,"../drawing":72,"d3":16}],109:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -27190,11 +27324,14 @@ function handleCamera3d(gd, ev) { var key = sceneId + '.camera'; var scene = fullLayout[sceneId]._scene; - if(attr === 'resetDefault') { - aobj[key] = null; - } - else if(attr === 'resetLastSave') { - aobj[key] = Lib.extendDeep({}, scene.cameraInitial); + if(attr === 'resetLastSave') { + aobj[key + '.up'] = scene.viewInitial.up; + aobj[key + '.eye'] = scene.viewInitial.eye; + aobj[key + '.center'] = scene.viewInitial.center; + } else if(attr === 'resetDefault') { + aobj[key + '.up'] = null; + aobj[key + '.eye'] = null; + aobj[key + '.center'] = null; } } @@ -27453,7 +27590,7 @@ function resetView(gd, subplotType) { Registry.call('_guiRelayout', gd, aObj); } -},{"../../../build/ploticon":2,"../../lib":168,"../../plots/cartesian/axis_ids":215,"../../plots/plots":245,"../../registry":257}],110:[function(_dereq_,module,exports){ +},{"../../../build/ploticon":2,"../../lib":168,"../../plots/cartesian/axis_ids":215,"../../plots/plots":244,"../../registry":256}],110:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -27728,7 +27865,7 @@ function fillCustomButton(customButtons) { return customButtons; } -},{"../../plots/cartesian/axis_ids":215,"../../registry":257,"../../traces/scatter/subtypes":391,"./buttons":109,"./modebar":112}],112:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/axis_ids":215,"../../registry":256,"../../traces/scatter/subtypes":390,"./buttons":109,"./modebar":112}],112:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -27795,7 +27932,7 @@ proto.update = function(graphInfo, buttons) { var bgSelector = context.displayModeBar === 'hover' ? '.js-plotly-plot .plotly:hover ' : ''; Lib.deleteRelatedStyleRule(modeBarId); - Lib.addRelatedStyleRule(modeBarId, bgSelector + '#' + modeBarId, 'background-color: ' + style.bgcolor); + Lib.addRelatedStyleRule(modeBarId, bgSelector + '#' + modeBarId + ' .modebar-group', 'background-color: ' + style.bgcolor); Lib.addRelatedStyleRule(modeBarId, '#' + modeBarId + ' .modebar-btn .icon path', 'fill: ' + style.color); Lib.addRelatedStyleRule(modeBarId, '#' + modeBarId + ' .modebar-btn:hover .icon path', 'fill: ' + style.activecolor); Lib.addRelatedStyleRule(modeBarId, '#' + modeBarId + ' .modebar-btn.active .icon path', 'fill: ' + style.activecolor); @@ -28001,7 +28138,6 @@ proto.updateActiveButton = function(buttonClicked) { button3.classed('active', val === thisval); } - }); }; @@ -28064,7 +28200,7 @@ function createModeBar(gd, buttons) { var modeBar = new ModeBar({ graphInfo: gd, - container: fullLayout._paperdiv.node(), + container: fullLayout._modebardiv.node(), buttons: buttons }); @@ -28215,7 +28351,7 @@ module.exports = { editType: 'plot' }; -},{"../../plot_api/plot_template":202,"../../plots/font_attributes":239,"../color/attributes":50}],114:[function(_dereq_,module,exports){ +},{"../../plot_api/plot_template":202,"../../plots/font_attributes":238,"../color/attributes":50}],114:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -28366,7 +28502,6 @@ var FROM_BR = alignmentConstants.FROM_BR; var constants = _dereq_('./constants'); var getUpdateObject = _dereq_('./get_update_object'); - module.exports = function draw(gd) { var fullLayout = gd._fullLayout; @@ -28424,7 +28559,6 @@ module.exports = function draw(gd) { reposition(gd, buttons, selectorLayout, axisLayout._name, selector); }); - }; function makeSelectorData(gd) { @@ -28492,12 +28626,16 @@ function drawButtonText(button, selectorLayout, d, gd) { }); text.call(Drawing.font, selectorLayout.font) - .text(getLabel(d)) + .text(getLabel(d, gd._fullLayout.meta)) .call(textLayout); } -function getLabel(opts) { - if(opts.label) return opts.label; +function getLabel(opts, meta) { + if(opts.label) { + return meta ? + Lib.templateString(opts.label, {meta: meta}) : + opts.label; + } if(opts.step === 'all') return 'all'; @@ -28593,7 +28731,7 @@ function reposition(gd, buttons, opts, axName, selector) { selector.attr('transform', 'translate(' + lx + ',' + ly + ')'); } -},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/cartesian/axis_ids":215,"../../plots/plots":245,"../../registry":257,"../color":51,"../drawing":72,"./constants":114,"./get_update_object":117,"d3":16}],117:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/cartesian/axis_ids":215,"../../plots/plots":244,"../../registry":256,"../color":51,"../drawing":72,"./constants":114,"./get_update_object":117,"d3":16}],117:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -29182,7 +29320,6 @@ function setupDragElement(rangeSlider, gd, axisOpts, opts) { } function setDataRange(rangeSlider, gd, axisOpts, opts) { - function clamp(v) { return axisOpts.l2r(Lib.constrain(v, opts._rl[0], opts._rl[1])); } @@ -29506,7 +29643,7 @@ function drawGrabbers(rangeSlider, gd, axisOpts, opts) { grabAreaMax.attr('height', opts._height); } -},{"../../lib":168,"../../lib/setcursor":187,"../../plots/cartesian":224,"../../plots/cartesian/axis_ids":215,"../../plots/plots":245,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"../titles":139,"./constants":121,"d3":16}],124:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../lib/setcursor":187,"../../plots/cartesian":223,"../../plots/cartesian/axis_ids":215,"../../plots/plots":244,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"../titles":139,"./constants":121,"d3":16}],124:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -29789,7 +29926,7 @@ module.exports = templatedArray('shape', { editType: 'arraydraw' }); -},{"../../lib/extend":162,"../../plot_api/plot_template":202,"../../traces/scatter/attributes":367,"../annotations/attributes":36,"../drawing/attributes":71}],128:[function(_dereq_,module,exports){ +},{"../../lib/extend":162,"../../plot_api/plot_template":202,"../../traces/scatter/attributes":366,"../annotations/attributes":36,"../drawing/attributes":71}],128:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -30726,7 +30863,7 @@ function movePath(pathIn, moveX, moveY) { }); } -},{"../../lib":168,"../../lib/setcursor":187,"../../plot_api/plot_template":202,"../../plots/cartesian/axes":212,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"./constants":129,"./helpers":132}],132:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../lib/setcursor":187,"../../plot_api/plot_template":202,"../../plots/cartesian/axes":212,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"./constants":129,"./helpers":132}],132:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -30878,7 +31015,7 @@ module.exports = { drawOne: drawModule.drawOne }; -},{"../../plots/cartesian/include_components":223,"./attributes":127,"./calc_autorange":128,"./defaults":130,"./draw":131}],134:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/include_components":222,"./attributes":127,"./calc_autorange":128,"./defaults":130,"./draw":131}],134:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -31121,7 +31258,7 @@ module.exports = overrideAll(templatedArray('slider', { } }), 'arraydraw', 'from-root'); -},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plot_api/plot_template":202,"../../plots/animation_attributes":207,"../../plots/font_attributes":239,"../../plots/pad_attributes":244,"./constants":135}],135:[function(_dereq_,module,exports){ +},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plot_api/plot_template":202,"../../plots/animation_attributes":207,"../../plots/font_attributes":238,"../../plots/pad_attributes":243,"./constants":135}],135:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -31244,7 +31381,6 @@ module.exports = function slidersDefaults(layoutIn, layoutOut) { }; function sliderDefaults(sliderIn, sliderOut, layoutOut) { - function coerce(attr, dflt) { return Lib.coerce(sliderIn, sliderOut, attributes, attr, dflt); } @@ -31612,7 +31748,6 @@ function drawSlider(gd, sliderGroup, sliderOpts) { sliderGroup.call(setGripPosition, sliderOpts, false); sliderGroup.call(drawCurrentValue, sliderOpts); - } function drawCurrentValue(sliderGroup, sliderOpts, valueOverride) { @@ -31652,6 +31787,10 @@ function drawCurrentValue(sliderGroup, sliderOpts, valueOverride) { str += valueOverride; } else { var curVal = sliderOpts.steps[sliderOpts.active].label; + var meta = sliderOpts._gd._fullLayout.meta; + if(meta) { + curVal = Lib.templateString(curVal, {meta: meta}); + } str += curVal; } @@ -31699,8 +31838,14 @@ function drawLabel(item, data, sliderOpts) { }); }); + var tx = data.step.label; + var meta = sliderOpts._gd._fullLayout.meta; + if(meta) { + tx = Lib.templateString(tx, {meta: meta}); + } + text.call(Drawing.font, sliderOpts.font) - .text(data.step.label) + .text(tx) .call(svgTextUtils.convertToTspans, sliderOpts._gd); return text; @@ -31734,7 +31879,6 @@ function drawLabelGroup(sliderGroup, sliderOpts) { dims.currentValueTotalHeight ); }); - } function handleInput(gd, sliderGroup, sliderOpts, normalizedPosition, doTransition) { @@ -31865,7 +32009,6 @@ function drawTicks(sliderGroup, sliderOpts) { (isMajor ? constants.tickOffset : constants.minorTickOffset) + dims.currentValueTotalHeight ); }); - } function computeLabelSteps(sliderOpts) { @@ -31962,7 +32105,7 @@ function drawRail(sliderGroup, sliderOpts) { ); } -},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/plots":245,"../color":51,"../drawing":72,"./constants":135,"d3":16}],138:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/plots":244,"../color":51,"../drawing":72,"./constants":135,"d3":16}],138:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -32250,7 +32393,7 @@ function draw(gd, titleClass, options) { return group; } -},{"../../constants/interactions":148,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/plots":245,"../../registry":257,"../color":51,"../drawing":72,"d3":16,"fast-isnumeric":18}],140:[function(_dereq_,module,exports){ +},{"../../constants/interactions":148,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/plots":244,"../../registry":256,"../color":51,"../drawing":72,"d3":16,"fast-isnumeric":18}],140:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -32408,7 +32551,7 @@ module.exports = overrideAll(templatedArray('updatemenu', { } }), 'arraydraw', 'from-root'); -},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plot_api/plot_template":202,"../../plots/font_attributes":239,"../../plots/pad_attributes":244,"../color/attributes":50}],141:[function(_dereq_,module,exports){ +},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plot_api/plot_template":202,"../../plots/font_attributes":238,"../../plots/pad_attributes":243,"../color/attributes":50}],141:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -32520,7 +32663,6 @@ module.exports = function updateMenusDefaults(layoutIn, layoutOut) { }; function menuDefaults(menuIn, menuOut, layoutOut) { - function coerce(attr, dflt) { return Lib.coerce(menuIn, menuOut, attributes, attr, dflt); } @@ -32708,7 +32850,6 @@ module.exports = function draw(gd) { } else { drawButtons(gd, gHeader, null, null, menuOpts); } - }); }; @@ -33017,8 +33158,14 @@ function drawItemText(item, menuOpts, itemOpts, gd) { }); }); + var tx = itemOpts.label; + var meta = gd._fullLayout.meta; + if(meta) { + tx = Lib.templateString(tx, {meta: meta}); + } + text.call(Drawing.font, menuOpts.font) - .text(itemOpts.label) + .text(tx) .call(svgTextUtils.convertToTspans, gd); } @@ -33221,7 +33368,7 @@ function removeAllButtons(gButton, newMenuIndexAttr) { .selectAll('g.' + constants.dropdownButtonClassName).remove(); } -},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/plots":245,"../color":51,"../drawing":72,"./constants":141,"./scrollbox":145,"d3":16}],144:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/plots":244,"../color":51,"../drawing":72,"./constants":141,"./scrollbox":145,"d3":16}],144:[function(_dereq_,module,exports){ arguments[4][138][0].apply(exports,arguments) },{"./attributes":140,"./constants":141,"./defaults":142,"./draw":143,"dup":138}],145:[function(_dereq_,module,exports){ /** @@ -33925,7 +34072,7 @@ exports.svgAttrs = { 'use strict'; // package version injected by `npm run preprocess` -exports.version = '1.44.4'; +exports.version = '1.46.0'; // inject promise polyfill _dereq_('es6-promise').polyfill(); @@ -33993,7 +34140,7 @@ exports.Queue = _dereq_('./lib/queue'); // export d3 used in the bundle exports.d3 = _dereq_('d3'); -},{"../build/plotcss":1,"../build/ploticon":2,"./components/annotations":44,"./components/annotations3d":49,"./components/colorscale":63,"./components/errorbars":78,"./components/fx":90,"./components/grid":94,"./components/images":99,"./components/legend":107,"./components/rangeselector":118,"./components/rangeslider":125,"./components/shapes":133,"./components/sliders":138,"./components/updatemenus":144,"./fonts/mathjax_config":152,"./lib/queue":182,"./locale-en":193,"./locale-en-us":192,"./plot_api":197,"./plot_api/plot_schema":201,"./plots/plots":245,"./registry":257,"./snapshot":262,"./traces/scatter":379,"d3":16,"es6-promise":17}],152:[function(_dereq_,module,exports){ +},{"../build/plotcss":1,"../build/ploticon":2,"./components/annotations":44,"./components/annotations3d":49,"./components/colorscale":63,"./components/errorbars":78,"./components/fx":90,"./components/grid":94,"./components/images":99,"./components/legend":107,"./components/rangeselector":118,"./components/rangeslider":125,"./components/shapes":133,"./components/sliders":138,"./components/updatemenus":144,"./fonts/mathjax_config":152,"./lib/queue":182,"./locale-en":193,"./locale-en-us":192,"./plot_api":197,"./plot_api/plot_schema":201,"./plots/plots":244,"./registry":256,"./snapshot":261,"./traces/scatter":378,"d3":16,"es6-promise":17}],152:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -34120,7 +34267,7 @@ function rad2deg(rad) { return rad / PI * 180; } * @return {boolean} */ function isFullCircle(aBnds) { - return Math.abs(aBnds[1] - aBnds[0]) > twoPI - 1e-15; + return Math.abs(aBnds[1] - aBnds[0]) > twoPI - 1e-14; } /** @@ -34789,7 +34936,6 @@ exports.valObjectMeta = { // either be a matching 1D array or an array of such matching 1D arrays coerceFunction: function(v, propOut, dflt, opts) { - // simplified coerce function just for array items function coercePart(v, opts, dflt) { var out; @@ -35423,7 +35569,6 @@ exports.cleanDate = function(v, dflt, calendar) { */ var fracMatch = /%\d?f/g; function modDateFormat(fmt, x, formatter, calendar) { - fmt = fmt.replace(fracMatch, function(match) { var digits = Math.min(+(match.charAt(1)) || 6, 6); var fracSecs = ((x / 1000 % 1) + 2) @@ -35643,7 +35788,7 @@ exports.findExactDates = function(data, calendar) { }; }; -},{"../constants/numerical":149,"../registry":257,"./loggers":172,"./mod":175,"d3":16,"fast-isnumeric":18}],161:[function(_dereq_,module,exports){ +},{"../constants/numerical":149,"../registry":256,"./loggers":172,"./mod":175,"d3":16,"fast-isnumeric":18}],161:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -35662,7 +35807,6 @@ var EventEmitter = _dereq_('events').EventEmitter; var Events = { init: function(plotObj) { - /* * If we have already instantiated an emitter for this plot * return early. @@ -35888,7 +36032,6 @@ function _extend(inputs, isDeep, keepAllKeys, noArrayCopies) { // TODO does this do the right thing for typed arrays? if(length === 2 && isArray(target) && isArray(inputs[1]) && target.length === 0) { - allPrimitives = primitivesLoopSplice(inputs[1], target); if(allPrimitives) { @@ -37177,7 +37320,6 @@ lib.objectFromPath = function(path, value) { tmpObj = tmpObj[el]; } else { - if(i === keys.length - 1) { tmpObj[key] = value; } else { @@ -37328,7 +37470,7 @@ lib.numSeparate = function(value, separators, separatethousands) { return x1 + x2; }; -var TEMPLATE_STRING_REGEX = /%{([^\s%{}:]*)(:[^}]*)?}/g; +lib.TEMPLATE_STRING_REGEX = /%{([^\s%{}:]*)(:[^}]*)?}/g; var SIMPLE_PROPERTY_REGEX = /^\w*$/; /** @@ -37348,7 +37490,7 @@ lib.templateString = function(string, obj) { // just in case it speeds things up *slightly*: var getterCache = {}; - return string.replace(TEMPLATE_STRING_REGEX, function(dummy, key) { + return string.replace(lib.TEMPLATE_STRING_REGEX, function(dummy, key) { if(SIMPLE_PROPERTY_REGEX.test(key)) { return obj[key] || ''; } @@ -37365,25 +37507,26 @@ var maximumNumberOfHoverTemplateWarnings = 10; * or fallback to associated labels. * * Examples: - * Lib.templateString('name: %{trace}', {trace: 'asdf'}) --> 'name: asdf' - * Lib.templateString('name: %{trace[0].name}', {trace: [{name: 'asdf'}]}) --> 'name: asdf' - * Lib.templateString('price: %{y:$.2f}', {y: 1}) --> 'price: $1.00' + * Lib.hovertemplateString('name: %{trace}', {trace: 'asdf'}) --> 'name: asdf' + * Lib.hovertemplateString('name: %{trace[0].name}', {trace: [{name: 'asdf'}]}) --> 'name: asdf' + * Lib.hovertemplateString('price: %{y:$.2f}', {y: 1}) --> 'price: $1.00' * + * @param {obj} d3 locale * @param {string} input string containing %{...:...} template strings * @param {obj} data object containing fallback text when no formatting is specified, ex.: {yLabel: 'formattedYValue'} * @param {obj} data objects containing substitution values * * @return {string} templated string */ -lib.hovertemplateString = function(string, labels) { +lib.hovertemplateString = function(string, labels, d3locale) { var args = arguments; // Not all that useful, but cache nestedProperty instantiation // just in case it speeds things up *slightly*: var getterCache = {}; - return string.replace(TEMPLATE_STRING_REGEX, function(match, key, format) { + return string.replace(lib.TEMPLATE_STRING_REGEX, function(match, key, format) { var obj, value, i; - for(i = 2; i < args.length; i++) { + for(i = 3; i < args.length; i++) { obj = args[i]; if(obj.hasOwnProperty(key)) { value = obj[key]; @@ -37410,7 +37553,13 @@ lib.hovertemplateString = function(string, labels) { } if(format) { - value = d3.format(format.replace(TEMPLATE_STRING_FORMAT_SEPARATOR, ''))(value); + var fmt; + if(d3locale) { + fmt = d3locale.numberFormat; + } else { + fmt = d3.format; + } + value = fmt(format.replace(TEMPLATE_STRING_FORMAT_SEPARATOR, ''))(value); } else { if(labels.hasOwnProperty(key + 'Label')) value = labels[key + 'Label']; } @@ -37474,7 +37623,6 @@ lib.pseudoRandom = function() { // more info: http://stackoverflow.com/questions/18531624/isplainobject-thing module.exports = function isPlainObject(obj) { - // We need to be a little less strict in the `imagetest` container because // of how async image requests are handled. // @@ -37738,7 +37886,7 @@ module.exports = function localize(gd, s) { return s; }; -},{"../registry":257}],172:[function(_dereq_,module,exports){ +},{"../registry":256}],172:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -39014,7 +39162,6 @@ module.exports = function relinkPrivateKeys(toContainer, fromContainer) { continue; } if(k.charAt(0) === '_' || typeof fromVal === 'function') { - // if it already exists at this point, it's something // that we recreate each time around, so ignore it if(k in toContainer) continue; @@ -39022,7 +39169,6 @@ module.exports = function relinkPrivateKeys(toContainer, fromContainer) { toContainer[k] = fromVal; } else if(isArrayOrTypedArray(fromVal) && isArrayOrTypedArray(toVal) && isPlainObject(fromVal[0])) { - // filter out data_array items that can contain user objects // most of the time the toVal === fromVal check will catch these early // but if the user makes new ones we also don't want to recurse in. @@ -39037,7 +39183,6 @@ module.exports = function relinkPrivateKeys(toContainer, fromContainer) { } } else if(isPlainObject(fromVal) && isPlainObject(toVal)) { - // recurse into objects, but only if they still exist relinkPrivateKeys(toVal, fromVal); @@ -39524,7 +39669,6 @@ function cleanEscapesForTex(s) { } function texToSVG(_texString, _config, _callback) { - var originalRenderer, originalConfig, originalProcessSectionDelay, @@ -40442,7 +40586,7 @@ module.exports = function containerArrayMatch(astr) { return {array: arrayStr, index: Number(match[1]), property: match[3] || ''}; }; -},{"../registry":257}],195:[function(_dereq_,module,exports){ +},{"../registry":256}],195:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -40587,10 +40731,11 @@ var Registry = _dereq_('../registry'); var Lib = _dereq_('../lib'); var Plots = _dereq_('../plots/plots'); var AxisIds = _dereq_('../plots/cartesian/axis_ids'); -var cleanId = AxisIds.cleanId; -var getFromTrace = AxisIds.getFromTrace; var Color = _dereq_('../components/color'); +var cleanId = AxisIds.cleanId; +var getFromTrace = AxisIds.getFromTrace; +var traceIs = Registry.traceIs; // clear the promise queue if one of them got rejected exports.clearPromiseQueue = function(gd) { @@ -40807,7 +40952,6 @@ function cleanAxRef(container, attr) { */ function cleanTitle(titleContainer) { if(titleContainer) { - // title -> title.text // (although title used to be a string attribute, // numbers are accepted as well) @@ -40828,7 +40972,6 @@ function cleanTitle(titleContainer) { var newAttrSet = titleContainer.title && titleContainer.title[newAttrName]; if(oldAttrSet && !newAttrSet) { - // Ensure title object exists if(!titleContainer.title) { titleContainer.title = {}; @@ -40861,7 +41004,7 @@ exports.cleanData = function(data) { // error_y.opacity is obsolete - merge into color if(trace.error_y && 'opacity' in trace.error_y) { var dc = Color.defaults; - var yeColor = trace.error_y.color || (Registry.traceIs(trace, 'bar') ? + var yeColor = trace.error_y.color || (traceIs(trace, 'bar') ? Color.defaultLine : dc[tracei % dc.length]); trace.error_y.color = Color.addOpacity( @@ -40873,8 +41016,8 @@ exports.cleanData = function(data) { // convert bardir to orientation, and put the data into // the axes it's eventually going to be used with if('bardir' in trace) { - if(trace.bardir === 'h' && (Registry.traceIs(trace, 'bar') || - trace.type.substr(0, 9) === 'histogram')) { + if(trace.bardir === 'h' && (traceIs(trace, 'bar') || + trace.type.substr(0, 9) === 'histogram')) { trace.orientation = 'h'; exports.swapXYData(trace); } @@ -40903,11 +41046,11 @@ exports.cleanData = function(data) { if(trace.yaxis) trace.yaxis = cleanId(trace.yaxis, 'y'); // scene ids scene1 -> scene - if(Registry.traceIs(trace, 'gl3d') && trace.scene) { + if(traceIs(trace, 'gl3d') && trace.scene) { trace.scene = Plots.subplotsRegistry.gl3d.cleanId(trace.scene); } - if(!Registry.traceIs(trace, 'pie') && !Registry.traceIs(trace, 'bar')) { + if(!traceIs(trace, 'pie') && !traceIs(trace, 'bar') && trace.type !== 'waterfall') { if(Array.isArray(trace.textposition)) { for(i = 0; i < trace.textposition.length; i++) { trace.textposition[i] = cleanTextPosition(trace.textposition[i]); @@ -41183,7 +41326,6 @@ exports.manageArrayContainers = function(np, newVal, undoit) { // delete item if(pLastIsNumber && newVal === null) { - // Clear item in array container when new value is null var contPath = parts.slice(0, pLength - 1).join('.'); var cont = Lib.nestedProperty(obj, contPath).get(); @@ -41194,7 +41336,6 @@ exports.manageArrayContainers = function(np, newVal, undoit) { } // create item else if(pLastIsNumber && np.get() === undefined) { - // When adding a new item, make sure undo command will remove it if(np.get() === undefined) undoit[np.astr] = null; @@ -41202,7 +41343,6 @@ exports.manageArrayContainers = function(np, newVal, undoit) { } // update item else { - // If the last part of attribute string isn't a number, // np.set is all we need. np.set(newVal); @@ -41275,7 +41415,7 @@ exports.clearAxisTypes = function(gd, traces, layoutUpdate) { } }; -},{"../components/color":51,"../lib":168,"../plots/cartesian/axis_ids":215,"../plots/plots":245,"../registry":257,"fast-isnumeric":18,"gl-mat4/fromQuat":19}],197:[function(_dereq_,module,exports){ +},{"../components/color":51,"../lib":168,"../plots/cartesian/axis_ids":215,"../plots/plots":244,"../registry":256,"fast-isnumeric":18,"gl-mat4/fromQuat":19}],197:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -41318,7 +41458,7 @@ var templateApi = _dereq_('./template_api'); exports.makeTemplate = templateApi.makeTemplate; exports.validateTemplate = templateApi.validateTemplate; -},{"../snapshot/download":259,"./plot_api":199,"./template_api":204,"./to_image":205,"./validate":206}],198:[function(_dereq_,module,exports){ +},{"../snapshot/download":258,"./plot_api":199,"./template_api":204,"./to_image":205,"./validate":206}],198:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -41536,7 +41676,7 @@ exports.applyContainerArrayChanges = function applyContainerArrayChanges(gd, np, return true; }; -},{"../lib/is_plain_object":169,"../lib/loggers":172,"../lib/noop":177,"../lib/search":186,"../registry":257,"./container_array_match":194}],199:[function(_dereq_,module,exports){ +},{"../lib/is_plain_object":169,"../lib/loggers":172,"../lib/noop":177,"../lib/search":186,"../registry":256,"./container_array_match":194}],199:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -41571,6 +41711,7 @@ var connectColorbar = _dereq_('../components/colorbar/connect'); var initInteractions = _dereq_('../plots/cartesian/graph_interact').initInteractions; var xmlnsNamespaces = _dereq_('../constants/xmlns_namespaces'); var svgTextUtils = _dereq_('../lib/svg_text_utils'); +var clearSelect = _dereq_('../plots/cartesian/select').clearSelect; var dfltConfig = _dereq_('./plot_config').dfltConfig; var manageArrays = _dereq_('./manage_arrays'); @@ -41783,8 +41924,6 @@ exports.plot = function(gd, data, layout, config) { 'position': 'absolute', 'top': 0, 'left': 0, - 'width': '100%', - 'height': '100%', 'overflow': 'visible', 'pointer-events': 'none' }); @@ -41818,6 +41957,16 @@ exports.plot = function(gd, data, layout, config) { } } + if(fullLayout.modebar.orientation === 'h') { + fullLayout._modebardiv + .style('height', null) + .style('width', '100%'); + } else { + fullLayout._modebardiv + .style('width', null) + .style('height', fullLayout.height + 'px'); + } + return Plots.previousPromises(gd); } @@ -42263,7 +42412,6 @@ function assertIndexArray(gd, indices, arrayName) { * @param newIndices */ function checkMoveTracesArgs(gd, currentIndices, newIndices) { - // check that gd has attribute 'data' and 'data' is array if(!Array.isArray(gd.data)) { throw new Error('gd.data must be an array.'); @@ -42289,7 +42437,6 @@ function checkMoveTracesArgs(gd, currentIndices, newIndices) { if(typeof newIndices !== 'undefined' && currentIndices.length !== newIndices.length) { throw new Error('current and new indices must be of equal length.'); } - } /** * A private function to reduce the type checking clutter in addTraces. @@ -42346,7 +42493,6 @@ function checkAddTracesArgs(gd, traces, newIndices) { * @param maxPoints */ function assertExtendTracesArgs(gd, update, indices, maxPoints) { - var maxPointsIsObject = Lib.isPlainObject(maxPoints); if(!Array.isArray(gd.data)) { @@ -42363,7 +42509,6 @@ function assertExtendTracesArgs(gd, update, indices, maxPoints) { assertIndexArray(gd, indices, 'indices'); for(var key in update) { - /* * Verify that the attribute to be updated contains as many trace updates * as indices. Failure must result in throw and no-op @@ -42394,7 +42539,6 @@ function assertExtendTracesArgs(gd, update, indices, maxPoints) { * @return {Object[]} */ function getExtendProperties(gd, update, indices, maxPoints) { - var maxPointsIsObject = Lib.isPlainObject(maxPoints); var updateProps = []; var trace, target, prop, insert, maxp; @@ -42407,9 +42551,7 @@ function getExtendProperties(gd, update, indices, maxPoints) { // loop through all update keys and traces and harvest validated data. for(var key in update) { - for(var j = 0; j < indices.length; j++) { - /* * Choose the trace indexed by the indices map argument and get the prop setter-getter * instance that references the key and value for this particular trace. @@ -42696,12 +42838,10 @@ exports.addTraces = function addTraces(gd, traces, newIndices) { } try { - // this is redundant, but necessary to not catch later possible errors! checkMoveTracesArgs(gd, currentIndices, newIndices); } catch(error) { - // something went wrong, reset gd to be safe and rethrow error gd.data.splice(gd.data.length - traces.length, traces.length); throw error; @@ -42826,7 +42966,6 @@ exports.moveTraces = function moveTraces(gd, currentIndices, newIndices) { // get the traces that aren't being moved around for(i = 0; i < gd.data.length; i++) { - // if index isn't in currentIndices, include it in ignored! if(currentIndices.indexOf(i) === -1) { newData.push(gd.data[i]); @@ -43119,7 +43258,7 @@ function _restyle(gd, aobj, traces) { // and figure out what kind of graphics update we need to do for(var ai in aobj) { if(helpers.hasParent(aobj, ai)) { - throw new Error('cannot set ' + ai + 'and a parent attribute simultaneously'); + throw new Error('cannot set ' + ai + ' and a parent attribute simultaneously'); } var vi = aobj[ai]; @@ -43471,22 +43610,34 @@ exports.relayout = relayout; // Optimization mostly for large splom traces where // Plots.supplyDefaults can take > 100ms function axRangeSupplyDefaultsByPass(gd, flags, specs) { - var k; + var fullLayout = gd._fullLayout; if(!flags.axrange) return false; - for(k in flags) { + for(var k in flags) { if(k !== 'axrange' && flags[k]) return false; } - for(k in specs.rangesAltered) { - var axName = Axes.id2name(k); + for(var axId in specs.rangesAltered) { + var axName = Axes.id2name(axId); var axIn = gd.layout[axName]; - var axOut = gd._fullLayout[axName]; + var axOut = fullLayout[axName]; axOut.autorange = axIn.autorange; axOut.range = axIn.range.slice(); axOut.cleanRange(); + + if(axOut._matchGroup) { + for(var axId2 in axOut._matchGroup) { + if(axId2 !== axId) { + var ax2 = fullLayout[Axes.id2name(axId2)]; + ax2.autorange = axOut.autorange; + ax2.range = axOut.range.slice(); + ax2._input.range = axOut.range.slice(); + } + } + } } + return true; } @@ -43496,20 +43647,37 @@ function addAxRangeSequence(seq, rangesAltered) { // executed after drawData var drawAxes = rangesAltered ? function(gd) { - var opts = {skipTitle: true}; + var axIds = []; + var skipTitle = true; + for(var id in rangesAltered) { - if(Axes.getFromId(gd, id).automargin) { - opts = {}; - break; + var ax = Axes.getFromId(gd, id); + axIds.push(id); + + if(ax._matchGroup) { + for(var id2 in ax._matchGroup) { + if(!rangesAltered[id2]) { + axIds.push(id2); + } + } } + + if(ax.automargin) skipTitle = false; } - return Axes.draw(gd, Object.keys(rangesAltered), opts); + + return Axes.draw(gd, axIds, {skipTitle: skipTitle}); } : function(gd) { return Axes.draw(gd, 'redraw'); }; + var _clearSelect = function(gd) { + var zoomlayer = gd._fullLayout._zoomlayer; + if(zoomlayer) clearSelect(zoomlayer); + }; + seq.push( + _clearSelect, subroutines.doAutoRangeAndConstraints, drawAxes, subroutines.drawData, @@ -43596,7 +43764,7 @@ function _relayout(gd, aobj) { // alter gd.layout for(var ai in aobj) { if(helpers.hasParent(aobj, ai)) { - throw new Error('cannot set ' + ai + 'and a parent attribute simultaneously'); + throw new Error('cannot set ' + ai + ' and a parent attribute simultaneously'); } var p = layoutNP(layout, ai); @@ -43807,6 +43975,9 @@ function _relayout(gd, aobj) { ) { flags.plot = true; } + else if(fullLayout._has('gl2d')) { + flags.plot = true; + } else if(valObject) editTypes.update(flags, valObject); else flags.calc = true; @@ -44025,6 +44196,8 @@ var traceUIControlPatterns = [ // "visible" includes trace.transforms[i].styles[j].value.visible {pattern: /(^|value\.)visible$/, attr: 'legend.uirevision'}, {pattern: /^dimensions\[\d+\]\.constraintrange/}, + {pattern: /^node\.(x|y)/}, // for Sankey nodes + {pattern: /^level$/}, // for Sunburst traces // below this you must be in editable: true mode // TODO: I still put name and title with `trace.uirevision` @@ -44243,7 +44416,6 @@ exports.react = function(gd, data, layout, config) { plotDone = exports.newPlot(gd, data, layout, config); } else { - if(Lib.isPlainObject(data)) { var obj = data; data = obj.data; @@ -44373,7 +44545,6 @@ exports.react = function(gd, data, layout, config) { return gd; }); - }; function diffData(gd, oldFullData, newFullData, immutable, transition, newDataRevision) { @@ -44595,7 +44766,6 @@ function getDiffFlags(oldContainer, newContainer, outerparts, opts) { } else if(canBeDataArray) { if(wasArray && nowArray) { - // don't try to diff two data arrays. If immutable we know the data changed, // if not, assume it didn't and let `layout.datarevision` tell us if it did if(immutable) { @@ -44890,7 +45060,6 @@ exports.animate = function(gd, frameOrGroupNameOrFrameList, animationOpts) { if(newFrame.onComplete) { newFrame.onComplete(); } - }); gd.emit('plotly_animatingframe', { @@ -45154,7 +45323,6 @@ exports.addFrames = function(gd, frameList, indices) { if(typeof frame.name === 'number') { Lib.warn('Warning: addFrames accepts frames with numeric names, but the numbers are' + 'implicitly cast to strings'); - } if(!frame.name) { @@ -45299,6 +45467,7 @@ function makePlotFramework(gd) { .classed('gl-container', true); fullLayout._paperdiv.selectAll('.main-svg').remove(); + fullLayout._paperdiv.select('.modebar-container').remove(); fullLayout._paper = fullLayout._paperdiv.insert('svg', ':first-child') .classed('main-svg', true); @@ -45306,6 +45475,11 @@ function makePlotFramework(gd) { fullLayout._toppaper = fullLayout._paperdiv.append('svg') .classed('main-svg', true); + fullLayout._modebardiv = fullLayout._paperdiv.append('div'); + + fullLayout._hoverpaper = fullLayout._paperdiv.append('svg') + .classed('main-svg', true); + if(!fullLayout._uid) { var otherUids = {}; d3.selectAll('defs').each(function() { @@ -45365,6 +45539,9 @@ function makePlotFramework(gd) { // single pie layer for the whole plot fullLayout._pielayer = fullLayout._paper.append('g').classed('pielayer', true); + // single sunbursrt layer for the whole plot + fullLayout._sunburstlayer = fullLayout._paper.append('g').classed('sunburstlayer', true); + // fill in image server scrape-svg fullLayout._glimages = fullLayout._paper.append('g').classed('glimages', true); @@ -45382,12 +45559,19 @@ function makePlotFramework(gd) { fullLayout._infolayer = fullLayout._toppaper.append('g').classed('infolayer', true); fullLayout._menulayer = fullLayout._toppaper.append('g').classed('menulayer', true); fullLayout._zoomlayer = fullLayout._toppaper.append('g').classed('zoomlayer', true); - fullLayout._hoverlayer = fullLayout._toppaper.append('g').classed('hoverlayer', true); + fullLayout._hoverlayer = fullLayout._hoverpaper.append('g').classed('hoverlayer', true); + + // Make the modebar container + fullLayout._modebardiv + .classed('modebar-container', true) + .style('position', 'absolute') + .style('top', '0px') + .style('right', '0px'); gd.emit('plotly_framework'); } -},{"../components/color":51,"../components/colorbar/connect":53,"../components/drawing":72,"../constants/xmlns_namespaces":150,"../lib":168,"../lib/events":161,"../lib/queue":182,"../lib/svg_text_utils":189,"../plots/cartesian/axes":212,"../plots/cartesian/constants":218,"../plots/cartesian/graph_interact":222,"../plots/plots":245,"../plots/polar/legacy":248,"../registry":257,"./edit_types":195,"./helpers":196,"./manage_arrays":198,"./plot_config":200,"./plot_schema":201,"./subroutines":203,"d3":16,"fast-isnumeric":18,"has-hover":20}],200:[function(_dereq_,module,exports){ +},{"../components/color":51,"../components/colorbar/connect":53,"../components/drawing":72,"../constants/xmlns_namespaces":150,"../lib":168,"../lib/events":161,"../lib/queue":182,"../lib/svg_text_utils":189,"../plots/cartesian/axes":212,"../plots/cartesian/constants":218,"../plots/cartesian/graph_interact":221,"../plots/cartesian/select":229,"../plots/plots":244,"../plots/polar/legacy":247,"../registry":256,"./edit_types":195,"./helpers":196,"./manage_arrays":198,"./plot_config":200,"./plot_schema":201,"./subroutines":203,"d3":16,"fast-isnumeric":18,"has-hover":20}],200:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -46271,7 +46455,6 @@ function formatAttributes(attrs) { } function mergeValTypeAndRole(attrs) { - function makeSrcAttr(attrName) { return { valType: 'string', @@ -46304,7 +46487,6 @@ function mergeValTypeAndRole(attrs) { } function formatArrayContainers(attrs) { - function callback(attr, attrName, attrs) { if(!attr) return; @@ -46370,7 +46552,7 @@ function insertAttrs(baseAttrs, newAttrs, astr) { np.set(extendDeepAll(np.get() || {}, newAttrs)); } -},{"../lib":168,"../plots/animation_attributes":207,"../plots/attributes":209,"../plots/frame_attributes":240,"../plots/layout_attributes":243,"../plots/polar/legacy/area_attributes":246,"../plots/polar/legacy/axis_attributes":247,"../registry":257,"./edit_types":195,"./plot_config":200}],202:[function(_dereq_,module,exports){ +},{"../lib":168,"../plots/animation_attributes":207,"../plots/attributes":209,"../plots/frame_attributes":239,"../plots/layout_attributes":242,"../plots/polar/legacy/area_attributes":245,"../plots/polar/legacy/axis_attributes":246,"../registry":256,"./edit_types":195,"./plot_config":200}],202:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -47287,7 +47469,8 @@ exports.doCamera = function(gd) { var sceneLayout = fullLayout[sceneIds[i]]; var scene = sceneLayout._scene; - scene.setCamera(sceneLayout.camera); + var cameraData = sceneLayout.camera; + scene.setCamera(cameraData); } }; @@ -47384,17 +47567,49 @@ exports.redrawReglTraces = function(gd) { }; exports.doAutoRangeAndConstraints = function(gd) { + var fullLayout = gd._fullLayout; var axList = Axes.list(gd, '', true); + var matchGroups = fullLayout._axisMatchGroups || []; + var ax; for(var i = 0; i < axList.length; i++) { - var ax = axList[i]; + ax = axList[i]; cleanAxisConstraints(gd, ax); - // in case margins changed, update scale - ax.setScale(); doAutoRange(gd, ax); } enforceAxisConstraints(gd); + + groupLoop: + for(var j = 0; j < matchGroups.length; j++) { + var group = matchGroups[j]; + var rng = null; + var id; + + for(id in group) { + ax = Axes.getFromId(gd, id); + if(ax.autorange === false) continue groupLoop; + + if(rng) { + if(rng[0] < rng[1]) { + rng[0] = Math.min(rng[0], ax.range[0]); + rng[1] = Math.max(rng[1], ax.range[1]); + } else { + rng[0] = Math.max(rng[0], ax.range[0]); + rng[1] = Math.min(rng[1], ax.range[1]); + } + } else { + rng = ax.range; + } + } + + for(id in group) { + ax = Axes.getFromId(gd, id); + ax.range = rng.slice(); + ax._input.range = rng.slice(); + ax.setScale(); + } + } }; // An initial paint must be completed before these components can be @@ -47422,7 +47637,7 @@ exports.drawMarginPushers = function(gd) { Registry.getComponentMethod('updatemenus', 'draw')(gd); }; -},{"../components/color":51,"../components/drawing":72,"../components/modebar":110,"../components/titles":139,"../constants/alignment":146,"../lib":168,"../lib/clear_gl_canvases":157,"../plots/cartesian/autorange":211,"../plots/cartesian/axes":212,"../plots/cartesian/constraints":220,"../plots/plots":245,"../registry":257,"d3":16}],204:[function(_dereq_,module,exports){ +},{"../components/color":51,"../components/drawing":72,"../components/modebar":110,"../components/titles":139,"../constants/alignment":146,"../lib":168,"../lib/clear_gl_canvases":157,"../plots/cartesian/autorange":211,"../plots/cartesian/axes":212,"../plots/cartesian/constraints":219,"../plots/plots":244,"../registry":256,"d3":16}],204:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -47897,7 +48112,7 @@ function format(opts) { return opts; } -},{"../lib":168,"../plots/attributes":209,"../plots/plots":245,"./plot_config":200,"./plot_schema":201,"./plot_template":202}],205:[function(_dereq_,module,exports){ +},{"../lib":168,"../plots/attributes":209,"../plots/plots":244,"./plot_config":200,"./plot_schema":201,"./plot_template":202}],205:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -48088,7 +48303,7 @@ function toImage(gd, opts) { module.exports = toImage; -},{"../lib":168,"../snapshot/helpers":261,"../snapshot/svgtoimg":263,"../snapshot/tosvg":265,"./plot_api":199}],206:[function(_dereq_,module,exports){ +},{"../lib":168,"../snapshot/helpers":260,"../snapshot/svgtoimg":262,"../snapshot/tosvg":264,"./plot_api":199}],206:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -48534,7 +48749,7 @@ function convertPathToAttributeString(path) { return astr; } -},{"../lib":168,"../plots/plots":245,"./plot_config":200,"./plot_schema":201}],207:[function(_dereq_,module,exports){ +},{"../lib":168,"../plots/plots":244,"./plot_config":200,"./plot_schema":201}],207:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -49145,6 +49360,8 @@ function concatExtremes(gd, ax) { } function doAutoRange(gd, ax) { + ax.setScale(); + if(ax.autorange) { ax.range = getAutoRange(gd, ax); @@ -49398,7 +49615,7 @@ function goodNumber(v) { function lessOrEqual(v0, v1) { return v0 <= v1; } function greaterOrEqual(v0, v1) { return v0 >= v1; } -},{"../../constants/numerical":149,"../../lib":168,"../../registry":257,"fast-isnumeric":18}],212:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"../../registry":256,"fast-isnumeric":18}],212:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -51203,14 +51420,11 @@ axes.drawOne = function(gd, ax, opts) { // TODO: mirror labels, esp for subplots seq.push(function() { - var labelFns = axes.makeLabelFns(ax, mainLinePosition); return axes.drawLabels(gd, ax, { vals: vals, layer: mainAxLayer, transFn: transFn, - labelXFn: labelFns.labelXFn, - labelYFn: labelFns.labelYFn, - labelAnchorFn: labelFns.labelAnchorFn, + labelFns: axes.makeLabelFns(ax, mainLinePosition) }); }); @@ -51222,8 +51436,6 @@ axes.drawOne = function(gd, ax, opts) { seq.push(function() { labelLength += getLabelLevelSpan(ax, axId + 'tick') + pad; labelLength += ax._tickAngles[axId + 'tick'] ? ax.tickfont.size * LINE_SPACING : 0; - var secondaryPosition = mainLinePosition + labelLength * sgn; - var secondaryLabelFns = axes.makeLabelFns(ax, secondaryPosition); return axes.drawLabels(gd, ax, { vals: getSecondaryLabelVals(ax, vals), @@ -51232,9 +51444,7 @@ axes.drawOne = function(gd, ax, opts) { repositionOnUpdate: true, secondary: true, transFn: transFn, - labelXFn: secondaryLabelFns.labelXFn, - labelYFn: secondaryLabelFns.labelYFn, - labelAnchorFn: secondaryLabelFns.labelAnchorFn, + labelFns: axes.makeLabelFns(ax, mainLinePosition + labelLength * sgn) }); }); @@ -51354,29 +51564,29 @@ axes.drawOne = function(gd, ax, opts) { push = {x: 0, y: 0, r: 0, l: 0, t: 0, b: 0}; var bbox = ax._boundingBox; - var counterAx = mainPlotinfo[counterLetter + 'axis']; + var titleOffset = getTitleOffset(gd, ax); var anchorAxDomainIndex; var offset; switch(axLetter + s) { case 'xb': anchorAxDomainIndex = 0; - offset = bbox.top - counterAx._length - counterAx._offset; + offset = bbox.top - titleOffset; push[s] = bbox.height; break; case 'xt': anchorAxDomainIndex = 1; - offset = counterAx._offset - bbox.bottom; + offset = titleOffset - bbox.bottom; push[s] = bbox.height; break; case 'yl': anchorAxDomainIndex = 0; - offset = counterAx._offset - bbox.right; + offset = titleOffset - bbox.right; push[s] = bbox.width; break; case 'yr': anchorAxDomainIndex = 1; - offset = bbox.left - counterAx._length - counterAx._offset; + offset = bbox.left - titleOffset; push[s] = bbox.width; break; } @@ -51388,9 +51598,34 @@ axes.drawOne = function(gd, ax, opts) { if(push[s] > 0) { push[s] += offset; } + if(ax.title.text !== fullLayout._dfltTitle[axLetter]) { push[s] += ax.title.font.size; } + + if(axLetter === 'x' && bbox.width > 0) { + var rExtra = bbox.right - (ax._offset + ax._length); + if(rExtra > 0) { + push.x = 1; + push.r = rExtra; + } + var lExtra = ax._offset - bbox.left; + if(lExtra > 0) { + push.x = 0; + push.l = lExtra; + } + } else if(axLetter === 'y' && bbox.height > 0) { + var bExtra = bbox.bottom - (ax._offset + ax._length); + if(bExtra > 0) { + push.y = 0; + push.b = bExtra; + } + var tExtra = ax._offset - bbox.top; + if(tExtra > 0) { + push.y = 1; + push.t = tExtra; + } + } } Plots.autoMargin(gd, axAutoMarginID(ax), push); @@ -51579,66 +51814,79 @@ axes.makeTickPath = function(ax, shift, sgn, len) { * @param {number} shift * @param {number} angle [in degrees] ... * @return {object} - * - {fn} labelXFn - * - {fn} labelYFn - * - {fn} labelAnchorFn - * - {number} labelStandoff - * - {number} labelShift + * - {fn} xFn + * - {fn} yFn + * - {fn} anchorFn + * - {fn} heightFn + * - {number} labelStandoff (gap parallel to ticks) + * - {number} labelShift (gap perpendicular to ticks) */ axes.makeLabelFns = function(ax, shift, angle) { var axLetter = ax._id.charAt(0); - var pad = (ax.linewidth || 1) / 2; var ticksOnOutsideLabels = ax.tickson !== 'boundaries' && ax.ticks === 'outside'; - var labelStandoff = ticksOnOutsideLabels ? ax.ticklen : 0; + var labelStandoff = 0; var labelShift = 0; + if(ticksOnOutsideLabels) { + labelStandoff += ax.ticklen; + } if(angle && ax.ticks === 'outside') { var rad = Lib.deg2rad(angle); labelStandoff = ax.ticklen * Math.cos(rad) + 1; labelShift = ax.ticklen * Math.sin(rad); } - if(ax.showticklabels && (ticksOnOutsideLabels || ax.showline)) { labelStandoff += 0.2 * ax.tickfont.size; } + labelStandoff += (ax.linewidth || 1) / 2; - // Used in polar angular label x/y functions - // TODO generalize makeLabelFns so that it just work for angular axes var out = { labelStandoff: labelStandoff, labelShift: labelShift }; var x0, y0, ff, flipIt; + if(axLetter === 'x') { flipIt = ax.side === 'bottom' ? 1 : -1; x0 = labelShift * flipIt; - y0 = shift + (labelStandoff + pad) * flipIt; + y0 = shift + labelStandoff * flipIt; ff = ax.side === 'bottom' ? 1 : -0.2; - out.labelXFn = function(d) { return d.dx + x0; }; - out.labelYFn = function(d) { return d.dy + y0 + d.fontSize * ff; }; - out.labelAnchorFn = function(a) { + out.xFn = function(d) { return d.dx + x0; }; + out.yFn = function(d) { return d.dy + y0 + d.fontSize * ff; }; + out.anchorFn = function(d, a) { if(!isNumeric(a) || a === 0 || a === 180) { return 'middle'; } return (a * flipIt < 0) ? 'end' : 'start'; }; + out.heightFn = function(d, a, h) { + return (a < -60 || a > 60) ? -0.5 * h : + ax.side === 'top' ? -h : + 0; + }; } else if(axLetter === 'y') { flipIt = ax.side === 'right' ? 1 : -1; - x0 = labelStandoff + pad; + x0 = labelStandoff; y0 = -labelShift * flipIt; ff = Math.abs(ax.tickangle) === 90 ? 0.5 : 0; - out.labelXFn = function(d) { return d.dx + shift + (x0 + d.fontSize * ff) * flipIt; }; - out.labelYFn = function(d) { return d.dy + y0 + d.fontSize * MID_SHIFT; }; - out.labelAnchorFn = function(a) { + out.xFn = function(d) { return d.dx + shift + (x0 + d.fontSize * ff) * flipIt; }; + out.yFn = function(d) { return d.dy + y0 + d.fontSize * MID_SHIFT; }; + out.anchorFn = function(d, a) { if(isNumeric(a) && Math.abs(a) === 90) { return 'middle'; } return ax.side === 'right' ? 'start' : 'end'; }; + out.heightFn = function(d, a, h) { + a *= ax.side === 'left' ? 1 : -1; + return a < -30 ? -h : + a < 30 ? -0.5 * h : + 0; + }; } return out; @@ -51813,9 +52061,11 @@ axes.drawZeroLine = function(gd, ax, opts) { * - {boolean} repositionOnUpdate (set to true to reposition update selection) * - {boolean} secondary * - {fn} transFn - * - {fn} labelXFn - * - {fn} labelYFn - * - {fn} labelAnchorFn + * - {object} labelFns + * + {fn} xFn + * + {fn} yFn + * + {fn} anchorFn + * + {fn} heightFn */ axes.drawLabels = function(gd, ax, opts) { opts = opts || {}; @@ -51824,9 +52074,7 @@ axes.drawLabels = function(gd, ax, opts) { var axLetter = axId.charAt(0); var cls = opts.cls || axId + 'tick'; var vals = opts.vals; - var labelXFn = opts.labelXFn; - var labelYFn = opts.labelYFn; - var labelAnchorFn = opts.labelAnchorFn; + var labelFns = opts.labelFns; var tickAngle = opts.secondary ? 0 : ax.tickangle; var lastAngle = (ax._tickAngles || {})[cls]; @@ -51846,7 +52094,7 @@ axes.drawLabels = function(gd, ax, opts) { var newPromise = gd._promises.length; thisLabel - .call(svgTextUtils.positionText, labelXFn(d), labelYFn(d)) + .call(svgTextUtils.positionText, labelFns.xFn(d), labelFns.yFn(d)) .call(Drawing.font, d.font, d.fontSize, d.fontColor) .text(d.text) .call(svgTextUtils.convertToTspans, gd); @@ -51870,47 +52118,26 @@ axes.drawLabels = function(gd, ax, opts) { if(opts.repositionOnUpdate) { tickLabels.each(function(d) { d3.select(this).select('text') - .call(svgTextUtils.positionText, labelXFn(d), labelYFn(d)); + .call(svgTextUtils.positionText, labelFns.xFn(d), labelFns.yFn(d)); }); } - // How much to shift a multi-line label to center it vertically. - function getAnchorHeight(lineCount, lineHeight, angle) { - var h = (lineCount - 1) * lineHeight; - if(axLetter === 'x') { - if(angle < -60 || 60 < angle) { - return -0.5 * h; - } else if(ax.side === 'top') { - return -h; - } - } else { - angle *= ax.side === 'left' ? 1 : -1; - if(angle < -30) { - return -h; - } else if(angle < 30) { - return -0.5 * h; - } - } - return 0; - } - function positionLabels(s, angle) { s.each(function(d) { var thisLabel = d3.select(this); var mathjaxGroup = thisLabel.select('.text-math-group'); - var anchor = labelAnchorFn(angle, d); + var anchor = labelFns.anchorFn(d, angle); var transform = opts.transFn.call(thisLabel.node(), d) + ((isNumeric(angle) && +angle !== 0) ? - (' rotate(' + angle + ',' + labelXFn(d) + ',' + - (labelYFn(d) - d.fontSize / 2) + ')') : + (' rotate(' + angle + ',' + labelFns.xFn(d) + ',' + + (labelFns.yFn(d) - d.fontSize / 2) + ')') : ''); - var anchorHeight = getAnchorHeight( - svgTextUtils.lineCount(thisLabel), - LINE_SPACING * d.fontSize, - isNumeric(angle) ? +angle : 0 - ); + // how much to shift a multi-line label to center it vertically. + var nLines = svgTextUtils.lineCount(thisLabel); + var lineHeight = LINE_SPACING * d.fontSize; + var anchorHeight = labelFns.heightFn(d, isNumeric(angle) ? +angle : 0, (nLines - 1) * lineHeight); if(anchorHeight) { transform += ' translate(0, ' + anchorHeight + ')'; @@ -52063,11 +52290,37 @@ function drawDividers(gd, ax, opts) { .attr('d', opts.path); } +function getTitleOffset(gd, ax) { + var gs = gd._fullLayout._size; + var axLetter = ax._id.charAt(0); + var side = ax.side; + var anchorAxis; + + if(ax.anchor !== 'free') { + anchorAxis = axisIds.getFromId(gd, ax.anchor); + } else if(axLetter === 'x') { + anchorAxis = { + _offset: gs.t + (1 - (ax.position || 0)) * gs.h, + _length: 0 + }; + } else if(axLetter === 'y') { + anchorAxis = { + _offset: gs.l + (ax.position || 0) * gs.w, + _length: 0 + }; + } + + if(side === 'top' || side === 'left') { + return anchorAxis._offset; + } else if(side === 'bottom' || side === 'right') { + return anchorAxis._offset + anchorAxis._length; + } +} + function drawTitle(gd, ax) { var fullLayout = gd._fullLayout; var axId = ax._id; var axLetter = axId.charAt(0); - var gs = fullLayout._size; var fontSize = ax.title.font.size; var titleStandoff; @@ -52078,36 +52331,28 @@ function drawTitle(gd, ax) { titleStandoff = 10 + fontSize * offsetBase + (ax.linewidth ? ax.linewidth - 1 : 0); } - var transform, counterAxis, x, y; + var titleOffset = getTitleOffset(gd, ax); + + var transform, x, y; if(axLetter === 'x') { - counterAxis = (ax.anchor === 'free') ? - {_offset: gs.t + (1 - (ax.position || 0)) * gs.h, _length: 0} : - axisIds.getFromId(gd, ax.anchor); - x = ax._offset + ax._length / 2; if(ax.side === 'top') { y = -titleStandoff - fontSize * (ax.showticklabels ? 1 : 0); } else { - y = counterAxis._length + titleStandoff + - fontSize * (ax.showticklabels ? 1.5 : 0.5); + y = titleStandoff + fontSize * (ax.showticklabels ? 1.5 : 0.5); } - y += counterAxis._offset; + y += titleOffset; } else { - counterAxis = (ax.anchor === 'free') ? - {_offset: gs.l + (ax.position || 0) * gs.w, _length: 0} : - axisIds.getFromId(gd, ax.anchor); - y = ax._offset + ax._length / 2; if(ax.side === 'right') { - x = counterAxis._length + titleStandoff + - fontSize * (ax.showticklabels ? 1 : 0.5); + x = titleStandoff + fontSize * (ax.showticklabels ? 1 : 0.5); } else { x = -titleStandoff - fontSize * (ax.showticklabels ? 0.5 : 0); } - x += counterAxis._offset; + x += titleOffset; transform = {rotate: '-90', offset: 0}; } @@ -52220,14 +52465,16 @@ function hasBarsOrFill(gd, ax) { for(var i = 0; i < fullData.length; i++) { var trace = fullData[i]; - if(trace.visible === true && - (trace.xaxis + trace.yaxis) === subplot && - ( - Registry.traceIs(trace, 'bar') && trace.orientation === {x: 'h', y: 'v'}[axLetter] || - trace.fill && trace.fill.charAt(trace.fill.length - 1) === axLetter - ) - ) { - return true; + if(trace.visible === true && (trace.xaxis + trace.yaxis) === subplot) { + if( + (Registry.traceIs(trace, 'bar') || trace.type === 'waterfall') && + trace.orientation === {x: 'h', y: 'v'}[axLetter] + ) return true; + + if( + trace.fill && + trace.fill.charAt(trace.fill.length - 1) === axLetter + ) return true; } } return false; @@ -52412,7 +52659,7 @@ function isAngular(ax) { return ax._id === 'angularaxis'; } -},{"../../components/color":51,"../../components/drawing":72,"../../components/titles":139,"../../constants/alignment":146,"../../constants/numerical":149,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/plots":245,"../../registry":257,"./autorange":211,"./axis_autotype":213,"./axis_ids":215,"./clean_ticks":217,"./layout_attributes":225,"./set_convert":231,"d3":16,"fast-isnumeric":18}],213:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/drawing":72,"../../components/titles":139,"../../constants/alignment":146,"../../constants/numerical":149,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/plots":244,"../../registry":256,"./autorange":211,"./axis_autotype":213,"./axis_ids":215,"./clean_ticks":217,"./layout_attributes":224,"./set_convert":230,"d3":16,"fast-isnumeric":18}],213:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -52622,7 +52869,7 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, return containerOut; }; -},{"../../lib":168,"../../registry":257,"./category_order_defaults":216,"./layout_attributes":225,"./line_grid_defaults":227,"./set_convert":231,"./tick_label_defaults":232,"./tick_mark_defaults":233,"./tick_value_defaults":234}],215:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"./category_order_defaults":216,"./layout_attributes":224,"./line_grid_defaults":226,"./set_convert":230,"./tick_label_defaults":231,"./tick_mark_defaults":232,"./tick_value_defaults":233}],215:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -52740,7 +52987,17 @@ exports.idSort = function(id1, id2) { return +(id1.substr(1) || 1) - +(id2.substr(1) || 1); }; -},{"../../registry":257,"./constants":218}],216:[function(_dereq_,module,exports){ +exports.getAxisGroup = function getAxisGroup(fullLayout, axId) { + var matchGroups = fullLayout._axisMatchGroups; + + for(var i = 0; i < matchGroups.length; i++) { + var group = matchGroups[i]; + if(group[axId]) return 'g' + i; + } + return axId; +}; + +},{"../../registry":256,"./constants":218}],216:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -52991,7 +53248,7 @@ module.exports = { traceLayerClasses: [ 'heatmaplayer', 'contourcarpetlayer', 'contourlayer', - 'barlayer', + 'waterfalllayer', 'barlayer', 'carpetlayer', 'violinlayer', 'boxlayer', @@ -53014,23 +53271,29 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Lib = _dereq_('../../lib'); var id2name = _dereq_('./axis_ids').id2name; +var scaleZoom = _dereq_('./scale_zoom'); +var makePadFn = _dereq_('./autorange').makePadFn; +var concatExtremes = _dereq_('./autorange').concatExtremes; +var ALMOST_EQUAL = _dereq_('../../constants/numerical').ALMOST_EQUAL; +var FROM_BL = _dereq_('../../constants/alignment').FROM_BL; -module.exports = function handleConstraintDefaults(containerIn, containerOut, coerce, allAxisIds, layoutOut) { +exports.handleConstraintDefaults = function(containerIn, containerOut, coerce, allAxisIds, layoutOut) { var constraintGroups = layoutOut._axisConstraintGroups; + var matchGroups = layoutOut._axisMatchGroups; + var axId = containerOut._id; + var axLetter = axId.charAt(0); + var splomStash = ((layoutOut._splomAxes || {})[axLetter] || {})[axId] || {}; var thisID = containerOut._id; var letter = thisID.charAt(0); - if(containerOut.fixedrange) return; - // coerce the constraint mechanics even if this axis has no scaleanchor // because it may be the anchor of another axis. - coerce('constrain'); + var constrain = coerce('constrain'); Lib.coerce(containerIn, containerOut, { constraintoward: { valType: 'enumerated', @@ -53039,19 +53302,44 @@ module.exports = function handleConstraintDefaults(containerIn, containerOut, co } }, 'constraintoward'); - if(!containerIn.scaleanchor) return; + var matches, matchOpts; - var constraintOpts = getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut); + if((containerIn.matches || splomStash.matches) && !containerOut.fixedrange) { + matchOpts = getConstraintOpts(matchGroups, thisID, allAxisIds, layoutOut); + matches = Lib.coerce(containerIn, containerOut, { + matches: { + valType: 'enumerated', + values: matchOpts.linkableAxes || [], + dflt: splomStash.matches + } + }, 'matches'); + } - var scaleanchor = Lib.coerce(containerIn, containerOut, { - scaleanchor: { - valType: 'enumerated', - values: constraintOpts.linkableAxes - } - }, 'scaleanchor'); + // 'matches' wins over 'scaleanchor' (for now) + var scaleanchor, scaleOpts; + + if(!matches && containerIn.scaleanchor && !(containerOut.fixedrange && constrain !== 'domain')) { + scaleOpts = getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut, constrain); + scaleanchor = Lib.coerce(containerIn, containerOut, { + scaleanchor: { + valType: 'enumerated', + values: scaleOpts.linkableAxes || [] + } + }, 'scaleanchor'); + } + + if(matches) { + delete containerOut.constrain; + updateConstraintGroups(matchGroups, matchOpts.thisGroup, thisID, matches, 1); + } else if(allAxisIds.indexOf(containerIn.matches) !== -1) { + Lib.warn('ignored ' + containerOut._name + '.matches: "' + + containerIn.matches + '" to avoid either an infinite loop ' + + 'or because the target axis has fixed range.'); + } if(scaleanchor) { var scaleratio = coerce('scaleratio'); + // TODO: I suppose I could do attribute.min: Number.MIN_VALUE to avoid zero, // but that seems hacky. Better way to say "must be a positive number"? // Of course if you use several super-tiny values you could eventually @@ -53059,24 +53347,21 @@ module.exports = function handleConstraintDefaults(containerIn, containerOut, co // Likewise with super-huge values. if(!scaleratio) scaleratio = containerOut.scaleratio = 1; - updateConstraintGroups(constraintGroups, constraintOpts.thisGroup, - thisID, scaleanchor, scaleratio); - } - else if(allAxisIds.indexOf(containerIn.scaleanchor) !== -1) { + updateConstraintGroups(constraintGroups, scaleOpts.thisGroup, thisID, scaleanchor, scaleratio); + } else if(allAxisIds.indexOf(containerIn.scaleanchor) !== -1) { Lib.warn('ignored ' + containerOut._name + '.scaleanchor: "' + containerIn.scaleanchor + '" to avoid either an infinite loop ' + - 'and possibly inconsistent scaleratios, or because the target' + - 'axis has fixed range.'); + 'and possibly inconsistent scaleratios, or because the target ' + + 'axis has fixed range or this axis declares a *matches* constraint.'); } }; -function getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut) { - // If this axis is already part of a constraint group, we can't - // scaleanchor any other axis in that group, or we'd make a loop. - // Filter allAxisIds to enforce this, also matching axis types. - +// If this axis is already part of a constraint group, we can't +// scaleanchor any other axis in that group, or we'd make a loop. +// Filter allAxisIds to enforce this, also matching axis types. +function getConstraintOpts(groups, thisID, allAxisIds, layoutOut, constrain) { + var doesNotConstrainRange = constrain !== 'range'; var thisType = layoutOut[id2name(thisID)].type; - var i, j, idj, axj; var linkableAxes = []; @@ -53085,12 +53370,23 @@ function getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut) { if(idj === thisID) continue; axj = layoutOut[id2name(idj)]; - if(axj.type === thisType && !axj.fixedrange) linkableAxes.push(idj); + if(axj.type === thisType) { + if(!axj.fixedrange) { + linkableAxes.push(idj); + } else if(doesNotConstrainRange && axj.anchor) { + // allow domain constraints on subplots where + // BOTH axes have fixedrange:true and constrain:domain + var counterAxj = layoutOut[id2name(axj.anchor)]; + if(counterAxj.fixedrange) { + linkableAxes.push(idj); + } + } + } } - for(i = 0; i < constraintGroups.length; i++) { - if(constraintGroups[i][thisID]) { - var thisGroup = constraintGroups[i]; + for(i = 0; i < groups.length; i++) { + if(groups[i][thisID]) { + var thisGroup = groups[i]; var linkableAxesNoLoops = []; for(j = 0; j < linkableAxes.length; j++) { @@ -53104,7 +53400,6 @@ function getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut) { return {linkableAxes: linkableAxes, thisGroup: null}; } - /* * Add this axis to the axis constraint groups, which is the collection * of axes that are all constrained together on scale. @@ -53159,28 +53454,6 @@ function updateConstraintGroups(constraintGroups, thisGroup, thisID, scaleanchor thisGroup[scaleanchor] = 1; } -},{"../../lib":168,"./axis_ids":215}],220:[function(_dereq_,module,exports){ -/** -* Copyright 2012-2019, Plotly, Inc. -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. -*/ - - -'use strict'; - -var id2name = _dereq_('./axis_ids').id2name; -var scaleZoom = _dereq_('./scale_zoom'); -var makePadFn = _dereq_('./autorange').makePadFn; -var concatExtremes = _dereq_('./autorange').concatExtremes; - -var ALMOST_EQUAL = _dereq_('../../constants/numerical').ALMOST_EQUAL; - -var FROM_BL = _dereq_('../../constants/alignment').FROM_BL; - - exports.enforce = function enforceAxisConstraints(gd) { var fullLayout = gd._fullLayout; var constraintGroups = fullLayout._axisConstraintGroups || []; @@ -53370,7 +53643,7 @@ function updateDomain(ax, factor) { ax.setScale(); } -},{"../../constants/alignment":146,"../../constants/numerical":149,"./autorange":211,"./axis_ids":215,"./scale_zoom":229}],221:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../constants/numerical":149,"../../lib":168,"./autorange":211,"./axis_ids":215,"./scale_zoom":228}],220:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -53449,12 +53722,12 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { // which are the x/y {ax._id: ax} hash objects and their values // for linked axis relative to this subplot var links; + // similar to `links` but for matching axes + var matches; // set to ew/ns val when active, set to '' when inactive var xActive, yActive; // are all axes in this subplot are fixed? var allFixedRanges; - // is subplot constrained? - var isSubplotConstrained; // do we need to edit x/y ranges? var editX, editY; // graph-wide optimization flags @@ -53492,10 +53765,10 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { yActive = isDirectionActive(yaxes, ns); allFixedRanges = !yActive && !xActive; - links = calcLinks(gd, xaHash, yaHash); - isSubplotConstrained = links.isSubplotConstrained; - editX = ew || isSubplotConstrained; - editY = ns || isSubplotConstrained; + links = calcLinks(gd, gd._fullLayout._axisConstraintGroups, xaHash, yaHash); + matches = calcLinks(gd, gd._fullLayout._axisMatchGroups, xaHash, yaHash); + editX = ew || links.isSubplotConstrained || matches.isSubplotConstrained; + editY = ns || links.isSubplotConstrained || matches.isSubplotConstrained; var fullLayout = gd._fullLayout; hasScatterGl = fullLayout._has('scattergl'); @@ -53653,16 +53926,22 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { dragElement.init(dragOptions); - var x0, - y0, - box, - lum, - path0, - dimmed, - zoomMode, - zb, - corners; - + // x/y px position at start of drag + var x0, y0; + // bbox object of the zoombox + var box; + // luminance of bg behind zoombox + var lum; + // zoombox path outline + var path0; + // is zoombox dimmed (during drag) + var dimmed; + // 'x'-only, 'y' or 'xy' zooming + var zoomMode; + // zoombox d3 selection + var zb; + // zoombox corner d3 selection + var corners; // zoom takes over minDrag, so it also has to take over gd._dragged var zoomDragged; @@ -53678,9 +53957,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { dimmed = false; zoomMode = 'xy'; zoomDragged = false; - zb = makeZoombox(zoomlayer, lum, xs, ys, path0); - corners = makeCorners(zoomlayer, xs, ys); } @@ -53706,22 +53983,36 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { corners.attr('d', 'M0,0Z'); } - if(isSubplotConstrained) { + if(links.isSubplotConstrained) { if(dx > MINZOOM || dy > MINZOOM) { zoomMode = 'xy'; if(dx / pw > dy / ph) { dy = dx * ph / pw; if(y0 > y1) box.t = y0 - dy; else box.b = y0 + dy; - } - else { + } else { dx = dy * pw / ph; if(x0 > x1) box.l = x0 - dx; else box.r = x0 + dx; } corners.attr('d', xyCorners(box)); + } else { + noZoom(); } - else { + } + else if(matches.isSubplotConstrained) { + if(dx > MINZOOM || dy > MINZOOM) { + zoomMode = 'xy'; + + var r0 = Math.min(box.l / pw, (ph - box.b) / ph); + var r1 = Math.max(box.r / pw, (ph - box.t) / ph); + + box.l = r0 * pw; + box.r = r1 * pw; + box.b = (1 - r0) * ph; + box.t = (1 - r1) * ph; + corners.attr('d', xyCorners(box)); + } else { noZoom(); } } @@ -53769,9 +54060,11 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { // TODO: edit linked axes in zoomAxRanges and in dragTail if(zoomMode === 'xy' || zoomMode === 'x') { zoomAxRanges(xaxes, box.l / pw, box.r / pw, updates, links.xaxes); + updateMatchedAxRange('x', updates); } if(zoomMode === 'xy' || zoomMode === 'y') { zoomAxRanges(yaxes, (ph - box.b) / ph, (ph - box.t) / ph, updates, links.yaxes); + updateMatchedAxRange('y', updates); } removeZoombox(gd); @@ -53837,6 +54130,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { for(i = 0; i < xaxes.length; i++) { zoomWheelOneAxis(xaxes[i], xfrac, zoom); } + updateMatchedAxRange('x'); scrollViewBox[2] *= zoom; scrollViewBox[0] += scrollViewBox[2] * xfrac * (1 / zoom - 1); @@ -53847,6 +54141,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { for(i = 0; i < yaxes.length; i++) { zoomWheelOneAxis(yaxes[i], yfrac, zoom); } + updateMatchedAxRange('y'); scrollViewBox[3] *= zoom; scrollViewBox[1] += scrollViewBox[3] * (1 - yfrac) * (1 / zoom - 1); @@ -53883,8 +54178,14 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { gd._fullLayout._replotting = true; if(xActive === 'ew' || yActive === 'ns') { - if(xActive) dragAxList(xaxes, dx); - if(yActive) dragAxList(yaxes, dy); + if(xActive) { + dragAxList(xaxes, dx); + updateMatchedAxRange('x'); + } + if(yActive) { + dragAxList(yaxes, dy); + updateMatchedAxRange('y'); + } updateSubplots([xActive ? -dx : 0, yActive ? -dy : 0, pw, ph]); ticksAndAnnotations(); return; @@ -53915,7 +54216,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { (movedAx._rl[end] - movedAx._rl[otherEnd]); } - if(isSubplotConstrained && xActive && yActive) { + if(links.isSubplotConstrained && xActive && yActive) { // dragging a corner of a constrained subplot: // respect the fixed corner, but harmonize dx and dy var dxySign = ((xActive === 'w') === (yActive === 'n')) ? 1 : -1; @@ -53935,7 +54236,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { var x0 = (xActive === 'w') ? dx : 0; var y0 = (yActive === 'n') ? dy : 0; - if(isSubplotConstrained) { + if(links.isSubplotConstrained) { var i; if(!xActive && yActive.length === 1) { // dragging one end of the y axis of a constrained subplot @@ -53957,10 +54258,39 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { } } + updateMatchedAxRange('x'); + updateMatchedAxRange('y'); updateSubplots([x0, y0, pw - dx, ph - dy]); ticksAndAnnotations(); } + function updateMatchedAxRange(axLetter, out) { + var matchedAxes = matches.isSubplotConstrained ? + {x: yaxes, y: xaxes}[axLetter] : + matches[axLetter + 'axes']; + + var constrainedAxes = matches.isSubplotConstrained ? + {x: xaxes, y: yaxes}[axLetter] : + []; + + for(var i = 0; i < matchedAxes.length; i++) { + var ax = matchedAxes[i]; + var axId = ax._id; + var axId2 = matches.xLinks[axId] || matches.yLinks[axId]; + var ax2 = constrainedAxes[0] || xaHash[axId2] || yaHash[axId2]; + + if(ax2) { + var rng = ax2.range; + if(out) { + out[ax._name + '.range[0]'] = rng[0]; + out[ax._name + '.range[1]'] = rng[1]; + } else { + ax.range = rng; + } + } + } + } + // Draw ticks and annotations (and other components) when ranges change. // Also records the ranges that have changed for use by update at the end. function ticksAndAnnotations() { @@ -53976,10 +54306,12 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { if(editX) { pushActiveAxIds(xaxes); pushActiveAxIds(links.xaxes); + pushActiveAxIds(matches.xaxes); } if(editY) { pushActiveAxIds(yaxes); pushActiveAxIds(links.yaxes); + pushActiveAxIds(matches.yaxes); } updates = {}; @@ -53998,9 +54330,14 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { if(gd._transitioningWithDuration) return; var doubleClickConfig = gd._context.doubleClick; - var axList = (xActive ? xaxes : []).concat(yActive ? yaxes : []); - var attrs = {}; + var axList = []; + if(xActive) axList = axList.concat(xaxes); + if(yActive) axList = axList.concat(yaxes); + if(matches.xaxes) axList = axList.concat(matches.xaxes); + if(matches.yaxes) axList = axList.concat(matches.yaxes); + + var attrs = {}; var ax, i, rangeInitial; // For reset+autosize mode: @@ -54009,7 +54346,6 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { // doubleClickConfig === 'reset' below), we reset. // If they are *all* at their initial ranges, then we autosize. if(doubleClickConfig === 'reset+autosize') { - doubleClickConfig = 'autosize'; for(i = 0; i < axList.length; i++) { @@ -54037,10 +54373,10 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { else if(doubleClickConfig === 'reset') { // when we're resetting, reset all linked axes too, so we get back // to the fully-auto-with-constraints situation - if(xActive || isSubplotConstrained) axList = axList.concat(links.xaxes); - if(yActive && !isSubplotConstrained) axList = axList.concat(links.yaxes); + if(xActive || links.isSubplotConstrained) axList = axList.concat(links.xaxes); + if(yActive && !links.isSubplotConstrained) axList = axList.concat(links.yaxes); - if(isSubplotConstrained) { + if(links.isSubplotConstrained) { if(!xActive) axList = axList.concat(xaxes); else if(!yActive) axList = axList.concat(yaxes); } @@ -54082,10 +54418,6 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { ], gd); } - // x/y scaleFactor stash, - // minimizes number of per-point DOM updates in updateSubplots below - var xScaleFactorOld, yScaleFactorOld; - // updateSubplots - find all plot viewboxes that should be // affected by this drag, and update them. look for all plots // sharing an affected axis (including the one being dragged), @@ -54137,6 +54469,14 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { if(editX2) { xScaleFactor2 = xScaleFactor; clipDx = ew ? viewBox[0] : getShift(xa, xScaleFactor2); + } else if(matches.xaHash[xa._id]) { + xScaleFactor2 = xScaleFactor; + clipDx = viewBox[0] * xa._length / xa0._length; + } else if(matches.yaHash[xa._id]) { + xScaleFactor2 = yScaleFactor; + clipDx = yActive === 'ns' ? + -viewBox[1] * xa._length / ya0._length : + getShift(xa, xScaleFactor2, {n: 'top', s: 'bottom'}[yActive]); } else { xScaleFactor2 = getLinkedScaleFactor(xa, xScaleFactor, yScaleFactor); clipDx = scaleAndGetShift(xa, xScaleFactor2); @@ -54145,6 +54485,14 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { if(editY2) { yScaleFactor2 = yScaleFactor; clipDy = ns ? viewBox[1] : getShift(ya, yScaleFactor2); + } else if(matches.yaHash[ya._id]) { + yScaleFactor2 = yScaleFactor; + clipDy = viewBox[1] * ya._length / ya0._length; + } else if(matches.xaHash[ya._id]) { + yScaleFactor2 = xScaleFactor; + clipDy = xActive === 'ew' ? + -viewBox[0] * ya._length / xa0._length : + getShift(ya, yScaleFactor2, {e: 'right', w: 'left'}[xActive]); } else { yScaleFactor2 = getLinkedScaleFactor(ya, xScaleFactor, yScaleFactor); clipDy = scaleAndGetShift(ya, yScaleFactor2); @@ -54178,7 +54526,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { // the scale of the trace group. // apply only when scale changes, as adjusting the scale of // all the points can be expansive. - if(xScaleFactor2 !== xScaleFactorOld || yScaleFactor2 !== yScaleFactorOld) { + if(xScaleFactor2 !== sp.xScaleFactor || yScaleFactor2 !== sp.yScaleFactor) { Drawing.setPointGroupScale(sp.zoomScalePts, xScaleFactor2, yScaleFactor2); Drawing.setTextPointsScale(sp.zoomScaleTxt, xScaleFactor2, yScaleFactor2); } @@ -54186,8 +54534,8 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { Drawing.hideOutsideRangePoints(sp.clipOnAxisFalseTraces, sp); // update x/y scaleFactor stash - xScaleFactorOld = xScaleFactor2; - yScaleFactorOld = yScaleFactor2; + sp.xScaleFactor = xScaleFactor2; + sp.yScaleFactor = yScaleFactor2; } } } @@ -54201,7 +54549,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { if(editX && links.xaHash[ax._id]) { return xScaleFactor; } - if(editY && (isSubplotConstrained ? links.xaHash : links.yaHash)[ax._id]) { + if(editY && (links.isSubplotConstrained ? links.xaHash : links.yaHash)[ax._id]) { return yScaleFactor; } return 0; @@ -54216,8 +54564,8 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { return 0; } - function getShift(ax, scaleFactor) { - return ax._length * (1 - scaleFactor) * FROM_TL[ax.constraintoward || 'middle']; + function getShift(ax, scaleFactor, from) { + return ax._length * (1 - scaleFactor) * FROM_TL[from || ax.constraintoward || 'middle']; } return dragger; @@ -54270,17 +54618,12 @@ function getEndText(ax, end) { } function zoomAxRanges(axList, r0Fraction, r1Fraction, updates, linkedAxes) { - var i, - axi, - axRangeLinear0, - axRangeLinearSpan; - - for(i = 0; i < axList.length; i++) { - axi = axList[i]; + for(var i = 0; i < axList.length; i++) { + var axi = axList[i]; if(axi.fixedrange) continue; - axRangeLinear0 = axi._rl[0]; - axRangeLinearSpan = axi._rl[1] - axRangeLinear0; + var axRangeLinear0 = axi._rl[0]; + var axRangeLinearSpan = axi._rl[1] - axRangeLinear0; axi.range = [ axi.l2r(axRangeLinear0 + axRangeLinearSpan * r0Fraction), axi.l2r(axRangeLinear0 + axRangeLinearSpan * r1Fraction) @@ -54293,8 +54636,7 @@ function zoomAxRanges(axList, r0Fraction, r1Fraction, updates, linkedAxes) { // zoom linked axes about their centers if(linkedAxes && linkedAxes.length) { var linkedR0Fraction = (r0Fraction + (1 - r1Fraction)) / 2; - - zoomAxRanges(linkedAxes, linkedR0Fraction, 1 - linkedR0Fraction, updates); + zoomAxRanges(linkedAxes, linkedR0Fraction, 1 - linkedR0Fraction, updates, [], []); } } @@ -54421,15 +54763,14 @@ function xyCorners(box) { 'h' + clen + 'v3h-' + (clen + 3) + 'Z'; } -function calcLinks(gd, xaHash, yaHash) { - var constraintGroups = gd._fullLayout._axisConstraintGroups; +function calcLinks(gd, groups, xaHash, yaHash) { var isSubplotConstrained = false; var xLinks = {}; var yLinks = {}; var xID, yID, xLinkID, yLinkID; - for(var i = 0; i < constraintGroups.length; i++) { - var group = constraintGroups[i]; + for(var i = 0; i < groups.length; i++) { + var group = groups[i]; // check if any of the x axes we're dragging is in this constraint group for(xID in xaHash) { if(group[xID]) { @@ -54438,7 +54779,7 @@ function calcLinks(gd, xaHash, yaHash) { // to match the changes in the dragged x axes for(xLinkID in group) { if(!(xLinkID.charAt(0) === 'x' ? xaHash : yaHash)[xLinkID]) { - xLinks[xLinkID] = 1; + xLinks[xLinkID] = xID; } } @@ -54455,7 +54796,7 @@ function calcLinks(gd, xaHash, yaHash) { if(group[yID]) { for(yLinkID in group) { if(!(yLinkID.charAt(0) === 'x' ? xaHash : yaHash)[yLinkID]) { - yLinks[yLinkID] = 1; + yLinks[yLinkID] = yID; } } } @@ -54491,6 +54832,8 @@ function calcLinks(gd, xaHash, yaHash) { yaHash: yaHashLinked, xaxes: xaxesLinked, yaxes: yaxesLinked, + xLinks: xLinks, + yLinks: yLinks, isSubplotConstrained: isSubplotConstrained }; } @@ -54536,7 +54879,7 @@ module.exports = { attachWheelEventHandler: attachWheelEventHandler }; -},{"../../components/color":51,"../../components/dragelement":69,"../../components/drawing":72,"../../components/fx":90,"../../constants/alignment":146,"../../lib":168,"../../lib/clear_gl_canvases":157,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plot_api/subroutines":203,"../../registry":257,"../plots":245,"./axes":212,"./axis_ids":215,"./constants":218,"./scale_zoom":229,"./select":230,"d3":16,"has-passive-events":21,"tinycolor2":34}],222:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/dragelement":69,"../../components/drawing":72,"../../components/fx":90,"../../constants/alignment":146,"../../lib":168,"../../lib/clear_gl_canvases":157,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plot_api/subroutines":203,"../../registry":256,"../plots":244,"./axes":212,"./axis_ids":215,"./constants":218,"./scale_zoom":228,"./select":229,"d3":16,"has-passive-events":21,"tinycolor2":34}],221:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -54704,7 +55047,7 @@ exports.updateFx = function(gd) { setCursor(fullLayout._draggers, cursor); }; -},{"../../components/dragelement":69,"../../components/fx":90,"../../lib/setcursor":187,"./constants":218,"./dragbox":221,"d3":16}],223:[function(_dereq_,module,exports){ +},{"../../components/dragelement":69,"../../components/fx":90,"../../lib/setcursor":187,"./constants":218,"./dragbox":220,"d3":16}],222:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -54779,7 +55122,7 @@ module.exports = function makeIncludeComponents(containerArrayName) { }; }; -},{"../../lib":168,"../../registry":257}],224:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],223:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -55043,7 +55386,7 @@ function plotOne(gd, plotinfo, cdSubplot, transitionOpts, makeOnCompleteCallback ); // layers that allow `cliponaxis: false` - if(className !== 'scatterlayer' && className !== 'barlayer') { + if(className !== 'scatterlayer' && className !== 'barlayer' && className !== 'waterfalllayer') { Drawing.setClipUrl(sel, plotinfo.layerClipId, gd); } }); @@ -55059,7 +55402,7 @@ function plotOne(gd, plotinfo, cdSubplot, transitionOpts, makeOnCompleteCallback if(!gd._context.staticPlot) { if(plotinfo._hasClipOnAxisFalse) { plotinfo.clipOnAxisFalseTraces = plotinfo.plot - .selectAll('.scatterlayer, .barlayer') + .selectAll('.scatterlayer, .barlayer, .waterfalllayer') .selectAll('.trace'); } @@ -55402,7 +55745,7 @@ exports.toSVG = function(gd) { exports.updateFx = _dereq_('./graph_interact').updateFx; -},{"../../components/drawing":72,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../registry":257,"../get_data":241,"../plots":245,"./attributes":210,"./axis_ids":215,"./constants":218,"./graph_interact":222,"./layout_attributes":225,"./layout_defaults":226,"./transition_axes":235,"d3":16}],225:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../registry":256,"../get_data":240,"../plots":244,"./attributes":210,"./axis_ids":215,"./constants":218,"./graph_interact":221,"./layout_attributes":224,"./layout_defaults":225,"./transition_axes":234,"d3":16}],224:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -55536,6 +55879,16 @@ module.exports = { editType: 'plot', + }, + matches: { + valType: 'enumerated', + values: [ + constants.idRegex.x.toString(), + constants.idRegex.y.toString() + ], + + editType: 'calc', + }, // ticks tickmode: { @@ -55979,7 +56332,7 @@ module.exports = { } }; -},{"../../components/color/attributes":50,"../../components/drawing/attributes":71,"../../lib/extend":162,"../../plot_api/plot_template":202,"../font_attributes":239,"./constants":218}],226:[function(_dereq_,module,exports){ +},{"../../components/color/attributes":50,"../../components/drawing/attributes":71,"../../lib/extend":162,"../../plot_api/plot_template":202,"../font_attributes":238,"./constants":218}],225:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -55999,7 +56352,7 @@ var basePlotLayoutAttributes = _dereq_('../layout_attributes'); var layoutAttributes = _dereq_('./layout_attributes'); var handleTypeDefaults = _dereq_('./type_defaults'); var handleAxisDefaults = _dereq_('./axis_defaults'); -var handleConstraintDefaults = _dereq_('./constraint_defaults'); +var handleConstraintDefaults = _dereq_('./constraints').handleConstraintDefaults; var handlePositionDefaults = _dereq_('./position_defaults'); var axisIds = _dereq_('./axis_ids'); @@ -56106,6 +56459,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { } var counterAxes = {x: getCounterAxes('x'), y: getCounterAxes('y')}; + var allAxisIds = counterAxes.x.concat(counterAxes.y); function getOverlayableAxes(axLetter, axName) { var list = (axLetter === 'x') ? xNames : yNames; @@ -56181,14 +56535,12 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { delete axLayoutOut.spikesnap; } - var positioningOptions = { + handlePositionDefaults(axLayoutIn, axLayoutOut, coerce, { letter: axLetter, counterAxes: counterAxes[axLetter], overlayableAxes: overlayableAxes, grid: layoutOut.grid - }; - - handlePositionDefaults(axLayoutIn, axLayoutOut, coerce, positioningOptions); + }); axLayoutOut._input = axLayoutIn; } @@ -56229,27 +56581,85 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { coerce('fixedrange', fixedRangeDflt); } - // Finally, handle scale constraints. We need to do this after all axes have - // coerced both `type` (so we link only axes of the same type) and + // Finally, handle scale constraints and matching axes. + // + // We need to do this after all axes have coerced both `type` + // (so we link only axes of the same type) and // `fixedrange` (so we can avoid linking from OR TO a fixed axis). // sets of axes linked by `scaleanchor` along with the scaleratios compounded // together, populated in handleConstraintDefaults - layoutOut._axisConstraintGroups = []; - var allAxisIds = counterAxes.x.concat(counterAxes.y); + var constraintGroups = layoutOut._axisConstraintGroups = []; + // similar to _axisConstraintGroups, but for matching axes + var matchGroups = layoutOut._axisMatchGroups = []; for(i = 0; i < axNames.length; i++) { axName = axNames[i]; axLetter = axName.charAt(0); - axLayoutIn = layoutIn[axName]; axLayoutOut = layoutOut[axName]; handleConstraintDefaults(axLayoutIn, axLayoutOut, coerce, allAxisIds, layoutOut); } + + for(i = 0; i < matchGroups.length; i++) { + var group = matchGroups[i]; + var rng = null; + var autorange = null; + var axId; + + // find 'matching' range attrs + for(axId in group) { + axLayoutOut = layoutOut[id2name(axId)]; + if(!axLayoutOut.matches) { + rng = axLayoutOut.range; + autorange = axLayoutOut.autorange; + } + } + // if `ax.matches` values are reciprocal, + // pick values of first axis in group + if(rng === null || autorange === null) { + for(axId in group) { + axLayoutOut = layoutOut[id2name(axId)]; + rng = axLayoutOut.range; + autorange = axLayoutOut.autorange; + break; + } + } + // apply matching range attrs + for(axId in group) { + axLayoutOut = layoutOut[id2name(axId)]; + if(axLayoutOut.matches) { + axLayoutOut.range = rng.slice(); + axLayoutOut.autorange = autorange; + } + axLayoutOut._matchGroup = group; + } + + // remove matching axis from scaleanchor constraint groups (for now) + if(constraintGroups.length) { + for(axId in group) { + for(j = 0; j < constraintGroups.length; j++) { + var group2 = constraintGroups[j]; + for(var axId2 in group2) { + if(axId === axId2) { + Lib.warn('Axis ' + axId2 + ' is set with both ' + + 'a *scaleanchor* and *matches* constraint; ' + + 'ignoring the scale constraint.'); + + delete group2[axId2]; + if(Object.keys(group2).length < 2) { + constraintGroups.splice(j, 1); + } + } + } + } + } + } + } }; -},{"../../components/color":51,"../../lib":168,"../../plot_api/plot_template":202,"../../registry":257,"../layout_attributes":243,"./axis_defaults":214,"./axis_ids":215,"./constraint_defaults":219,"./layout_attributes":225,"./position_defaults":228,"./type_defaults":236}],227:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../../plot_api/plot_template":202,"../../registry":256,"../layout_attributes":242,"./axis_defaults":214,"./axis_ids":215,"./constraints":219,"./layout_attributes":224,"./position_defaults":227,"./type_defaults":235}],226:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -56314,7 +56724,7 @@ module.exports = function handleLineGridDefaults(containerIn, containerOut, coer } }; -},{"../../components/color/attributes":50,"../../lib":168,"tinycolor2":34}],228:[function(_dereq_,module,exports){ +},{"../../components/color/attributes":50,"../../lib":168,"tinycolor2":34}],227:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -56402,7 +56812,7 @@ module.exports = function handlePositionDefaults(containerIn, containerOut, coer return containerOut; }; -},{"../../lib":168,"fast-isnumeric":18}],229:[function(_dereq_,module,exports){ +},{"../../lib":168,"fast-isnumeric":18}],228:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -56430,7 +56840,7 @@ module.exports = function scaleZoom(ax, factor, centerFraction) { ]; }; -},{"../../constants/alignment":146}],230:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146}],229:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -56586,7 +56996,6 @@ function prepSelect(e, startX, startY, dragOptions, mode) { 'h-4v' + (2 * MINSELECT) + 'h4Z' + 'M' + (currentPolygon.xmax - 1) + ',' + (y0 - MINSELECT) + 'h4v' + (2 * MINSELECT) + 'h-4Z'); - } else if(direction === 'v') { // vertical motion: make a horizontal box @@ -57004,7 +57413,6 @@ function extractClickedPtInfo(hoverData, searchTraces) { for(i = 0; i < searchTraces.length; i++) { searchInfo = searchTraces[i]; if(hoverDatum.fullData._expandedIndex === searchInfo.cd[0].trace._expandedIndex) { - // Special case for box (and violin) if(hoverDatum.hoverOnBox === true) { break; @@ -57222,7 +57630,7 @@ module.exports = { selectOnClick: selectOnClick }; -},{"../../components/color":51,"../../components/fx":90,"../../components/fx/helpers":86,"../../lib/clear_gl_canvases":157,"../../lib/polygon":180,"../../lib/throttle":190,"../../plot_api/subroutines":203,"../../registry":257,"./axis_ids":215,"./constants":218,"polybooljs":25}],231:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/fx":90,"../../components/fx/helpers":86,"../../lib/clear_gl_canvases":157,"../../lib/polygon":180,"../../lib/throttle":190,"../../plot_api/subroutines":203,"../../registry":256,"./axis_ids":215,"./constants":218,"polybooljs":25}],230:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -57231,7 +57639,6 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var d3 = _dereq_('d3'); @@ -57288,7 +57695,8 @@ function isValidCategory(v) { module.exports = function setConvert(ax, fullLayout) { fullLayout = fullLayout || {}; - var axLetter = (ax._id || 'x').charAt(0); + var axId = (ax._id || 'x'); + var axLetter = axId.charAt(0); function toLog(v, clip) { if(v > 0) return Math.log(v) / Math.LN10; @@ -57532,10 +57940,25 @@ module.exports = function setConvert(ax, fullLayout) { var traceIndices = ax._traceIndices; var i, j; + var matchGroups = fullLayout._axisMatchGroups; + if(matchGroups && matchGroups.length && ax._categories.length === 0) { + for(i = 0; i < matchGroups.length; i++) { + var group = matchGroups[i]; + if(group[axId]) { + for(var axId2 in group) { + if(axId2 !== axId) { + var ax2 = fullLayout[axisIds.id2name(axId2)]; + traceIndices = traceIndices.concat(ax2._traceIndices); + } + } + } + } + } + // [ [cnt, {$cat: index}], for 1,2 ] - var seen = ax._multicatSeen = [[0, {}], [0, {}]]; + var seen = [[0, {}], [0, {}]]; // [ [arrayIn[0][i], arrayIn[1][i]], for i .. N ] - var list = ax._multicatList = []; + var list = []; for(i = 0; i < traceIndices.length; i++) { var trace = fullData[traceIndices[i]]; @@ -57694,15 +58117,14 @@ module.exports = function setConvert(ax, fullLayout) { ax._length = gs.h * (ax.domain[1] - ax.domain[0]); ax._m = ax._length / (rl0 - rl1); ax._b = -ax._m * rl1; - } - else { + } else { ax._offset = gs.l + ax.domain[0] * gs.w; ax._length = gs.w * (ax.domain[1] - ax.domain[0]); ax._m = ax._length / (rl1 - rl0); ax._b = -ax._m * rl0; } - if(!isFinite(ax._m) || !isFinite(ax._b)) { + if(!isFinite(ax._m) || !isFinite(ax._b) || ax._length < 0) { fullLayout._replotting = false; throw new Error('Something went wrong with axis scaling'); } @@ -57783,15 +58205,53 @@ module.exports = function setConvert(ax, fullLayout) { } }; + // should skip if not category nor multicategory ax.clearCalc = function() { - // initialize the category list, if there is one, so we start over - // to be filled in later by ax.d2c - ax._categories = (ax._initialCategories || []).slice(); + var emptyCategories = function() { + ax._categories = []; + ax._categoriesMap = {}; + }; - // Build the lookup map for initialized categories - ax._categoriesMap = {}; - for(var j = 0; j < ax._categories.length; j++) { - ax._categoriesMap[ax._categories[j]] = j; + var matchGroups = fullLayout._axisMatchGroups; + + if(matchGroups && matchGroups.length) { + var found = false; + + for(var i = 0; i < matchGroups.length; i++) { + var group = matchGroups[i]; + + if(group[axId]) { + found = true; + var categories = null; + var categoriesMap = null; + + for(var axId2 in group) { + var ax2 = fullLayout[axisIds.id2name(axId2)]; + if(ax2._categories) { + categories = ax2._categories; + categoriesMap = ax2._categoriesMap; + break; + } + } + + if(categories && categoriesMap) { + ax._categories = categories; + ax._categoriesMap = categoriesMap; + } else { + emptyCategories(); + } + break; + } + } + if(!found) emptyCategories(); + } else { + emptyCategories(); + } + + if(ax._initialCategories) { + for(var j = 0; j < ax._initialCategories.length; j++) { + setCategoryIndex(ax._initialCategories[j]); + } } }; @@ -57815,7 +58275,7 @@ module.exports = function setConvert(ax, fullLayout) { delete ax._forceTick0; }; -},{"../../constants/numerical":149,"../../lib":168,"./axis_ids":215,"./constants":218,"d3":16,"fast-isnumeric":18}],232:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"./axis_ids":215,"./constants":218,"d3":16,"fast-isnumeric":18}],231:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -57914,7 +58374,7 @@ function tickformatstopDefaults(valueIn, valueOut) { } } -},{"../../lib":168,"../array_container_defaults":208,"./layout_attributes":225}],233:[function(_dereq_,module,exports){ +},{"../../lib":168,"../array_container_defaults":208,"./layout_attributes":224}],232:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -57947,7 +58407,7 @@ module.exports = function handleTickDefaults(containerIn, containerOut, coerce, } }; -},{"../../lib":168,"./layout_attributes":225}],234:[function(_dereq_,module,exports){ +},{"../../lib":168,"./layout_attributes":224}],233:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -57989,7 +58449,7 @@ module.exports = function handleTickValueDefaults(containerIn, containerOut, coe } }; -},{"./clean_ticks":217}],235:[function(_dereq_,module,exports){ +},{"./clean_ticks":217}],234:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58199,7 +58659,7 @@ module.exports = function transitionAxes(gd, edits, transitionOpts, makeOnComple return Promise.resolve(); }; -},{"../../components/drawing":72,"../../registry":257,"./axes":212,"d3":16}],236:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../registry":256,"./axes":212,"d3":16}],235:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58337,7 +58797,7 @@ function isBoxWithoutPositionCoords(trace, axLetter) { ); } -},{"../../registry":257,"./axis_autotype":213}],237:[function(_dereq_,module,exports){ +},{"../../registry":256,"./axis_autotype":213}],236:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58398,8 +58858,6 @@ exports.manageCommandObserver = function(gd, container, commandList, onchange) { // table should have been updated and check is already attached, // so there's nothing to be done: return ret; - - } } @@ -58761,7 +59219,7 @@ function crawl(attrs, callback, path, depth) { }); } -},{"../lib":168,"../registry":257}],238:[function(_dereq_,module,exports){ +},{"../lib":168,"../registry":256}],237:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58869,7 +59327,7 @@ exports.defaults = function(containerOut, layout, coerce, dfltDomains) { coerce('domain.y', dfltY); }; -},{"../lib/extend":162}],239:[function(_dereq_,module,exports){ +},{"../lib/extend":162}],238:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58934,7 +59392,7 @@ module.exports = function(opts) { return attrs; }; -},{}],240:[function(_dereq_,module,exports){ +},{}],239:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58980,7 +59438,7 @@ module.exports = { } }; -},{}],241:[function(_dereq_,module,exports){ +},{}],240:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -59108,7 +59566,7 @@ exports.getSubplotData = function getSubplotData(data, type, subplotId) { return subplotData; }; -},{"../registry":257,"./cartesian/constants":218}],242:[function(_dereq_,module,exports){ +},{"../registry":256,"./cartesian/constants":218}],241:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -59142,7 +59600,7 @@ function project(camera, v) { module.exports = project; -},{}],243:[function(_dereq_,module,exports){ +},{}],242:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -59446,7 +59904,7 @@ module.exports = { } }; -},{"../components/color/attributes":50,"../components/colorscale/layout_attributes":64,"../lib/extend":162,"./animation_attributes":207,"./font_attributes":239,"./pad_attributes":244}],244:[function(_dereq_,module,exports){ +},{"../components/color/attributes":50,"../components/colorscale/layout_attributes":64,"../lib/extend":162,"./animation_attributes":207,"./font_attributes":238,"./pad_attributes":243}],243:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -59501,7 +59959,7 @@ module.exports = function(opts) { }; }; -},{}],245:[function(_dereq_,module,exports){ +},{}],244:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -59580,7 +60038,6 @@ plots.resize = function(gd) { gd = Lib.getGraphDiv(gd); return new Promise(function(resolve, reject) { - function isHidden(gd) { var display = window.getComputedStyle(gd).display; return !display || display === 'none'; @@ -59843,7 +60300,6 @@ plots.supplyDefaults = function(gd, opts) { // first fill in what we can of layout without looking at data // because fullData needs a few things from layout if(oldFullLayout._initialAutoSizeIsDone) { - // coerce the updated layout while preserving width and height var oldWidth = oldFullLayout.width; var oldHeight = oldFullLayout.height; @@ -59855,7 +60311,6 @@ plots.supplyDefaults = function(gd, opts) { plots.sanitizeMargins(newFullLayout); } else { - // coerce the updated layout and autosize if needed plots.supplyLayoutGlobalDefaults(newLayout, newFullLayout, formatObj); @@ -59898,6 +60353,8 @@ plots.supplyDefaults = function(gd, opts) { newFullLayout._scatterStackOpts = {}; // for the first scatter trace on each subplot (so it knows tonext->tozero) newFullLayout._firstScatter = {}; + // for grouped bar/box/violin trace to share config across traces + newFullLayout._alignmentOpts = {}; // for traces to request a default rangeslider on their x axes // eg set `_requestRangeslider.x2 = true` for xaxis2 @@ -61343,11 +61800,12 @@ plots.doAutoMargin = function(gd) { var mr = margin.r; var mt = margin.t; var mb = margin.b; + var width = fullLayout.width; + var height = fullLayout.height; var pushMargin = fullLayout._pushmargin; var pushMarginIds = fullLayout._pushmarginIds; if(fullLayout.margin.autoexpand !== false) { - for(var k in pushMargin) { if(!pushMarginIds[k]) delete pushMargin[k]; } @@ -61364,7 +61822,6 @@ plots.doAutoMargin = function(gd) { // (and t and b) to find the required margins for(var k1 in pushMargin) { - var pushleft = pushMargin[k1].l || {}; var pushbottom = pushMargin[k1].b || {}; var fl = pushleft.val; @@ -61378,13 +61835,11 @@ plots.doAutoMargin = function(gd) { var pr = pushMargin[k2].r.size; if(fr > fl) { - var newl = (pl * fr + - (pr - fullLayout.width) * fl) / (fr - fl); - var newr = (pr * (1 - fl) + - (pl - fullLayout.width) * (1 - fr)) / (fr - fl); - if(newl >= 0 && newr >= 0 && newl + newr > ml + mr) { - ml = newl; - mr = newr; + var newL = (pl * fr + (pr - width) * fl) / (fr - fl); + var newR = (pr * (1 - fl) + (pl - width) * (1 - fr)) / (fr - fl); + if(newL >= 0 && newR >= 0 && width - (newL + newR) > 0 && newL + newR > ml + mr) { + ml = newL; + mr = newR; } } } @@ -61394,13 +61849,11 @@ plots.doAutoMargin = function(gd) { var pt = pushMargin[k2].t.size; if(ft > fb) { - var newb = (pb * ft + - (pt - fullLayout.height) * fb) / (ft - fb); - var newt = (pt * (1 - fb) + - (pb - fullLayout.height) * (1 - ft)) / (ft - fb); - if(newb >= 0 && newt >= 0 && newb + newt > mb + mt) { - mb = newb; - mt = newt; + var newB = (pb * ft + (pt - height) * fb) / (ft - fb); + var newT = (pt * (1 - fb) + (pb - height) * (1 - ft)) / (ft - fb); + if(newB >= 0 && newT >= 0 && height - (newT + newB) > 0 && newB + newT > mb + mt) { + mb = newB; + mt = newT; } } } @@ -61413,8 +61866,8 @@ plots.doAutoMargin = function(gd) { gs.t = Math.round(mt); gs.b = Math.round(mb); gs.p = Math.round(margin.pad); - gs.w = Math.round(fullLayout.width) - gs.l - gs.r; - gs.h = Math.round(fullLayout.height) - gs.t - gs.b; + gs.w = Math.round(width) - gs.l - gs.r; + gs.h = Math.round(height) - gs.t - gs.b; // if things changed and we're not already redrawing, trigger a redraw if(!fullLayout._replotting && @@ -62227,8 +62680,9 @@ plots.doCalcdata = function(gd, traces) { gd._hmpixcount = 0; gd._hmlumcount = 0; - // for sharing colors across pies (and for legend) + // for sharing colors across pies / sunbursts (and for legend) fullLayout._piecolormap = {}; + fullLayout._sunburstcolormap = {}; // If traces were specified and this trace was not included, // then transfer it over from the old calcdata: @@ -62306,7 +62760,6 @@ plots.doCalcdata = function(gd, traces) { var cd = []; if(trace.visible === true) { - // clear existing ref in case it got relinked delete trace._indexToPoints; // keep ref of index-to-points map object of the *last* enabled transform, @@ -62459,7 +62912,7 @@ plots.generalUpdatePerTraceModule = function(gd, subplot, subplotCalcData, subpl subplot.traceHash = traceHash; }; -},{"../components/color":51,"../constants/numerical":149,"../lib":168,"../plot_api/plot_schema":201,"../plot_api/plot_template":202,"../plots/cartesian/axis_ids":215,"../registry":257,"./animation_attributes":207,"./attributes":209,"./command":237,"./font_attributes":239,"./frame_attributes":240,"./layout_attributes":243,"d3":16,"fast-isnumeric":18}],246:[function(_dereq_,module,exports){ +},{"../components/color":51,"../constants/numerical":149,"../lib":168,"../plot_api/plot_schema":201,"../plot_api/plot_template":202,"../plots/cartesian/axis_ids":215,"../registry":256,"./animation_attributes":207,"./attributes":209,"./command":236,"./font_attributes":238,"./frame_attributes":239,"./layout_attributes":242,"d3":16,"fast-isnumeric":18}],245:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -62503,7 +62956,7 @@ module.exports = { } }; -},{"../../../lib/extend":162,"../../../traces/scatter/attributes":367}],247:[function(_dereq_,module,exports){ +},{"../../../lib/extend":162,"../../../traces/scatter/attributes":366}],246:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -62625,7 +63078,7 @@ module.exports = overrideAll({ } }, 'plot', 'nested'); -},{"../../../lib/extend":162,"../../../plot_api/edit_types":195,"../../cartesian/layout_attributes":225}],248:[function(_dereq_,module,exports){ +},{"../../../lib/extend":162,"../../../plot_api/edit_types":195,"../../cartesian/layout_attributes":224}],247:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -62640,7 +63093,7 @@ var Polar = module.exports = _dereq_('./micropolar'); Polar.manager = _dereq_('./micropolar_manager'); -},{"./micropolar":249,"./micropolar_manager":250}],249:[function(_dereq_,module,exports){ +},{"./micropolar":248,"./micropolar_manager":249}],248:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64060,7 +64513,7 @@ var µ = module.exports = { version: '0.2.2' }; return exports; }; -},{"../../../constants/alignment":146,"../../../lib":168,"d3":16}],250:[function(_dereq_,module,exports){ +},{"../../../constants/alignment":146,"../../../lib":168,"d3":16}],249:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64146,7 +64599,7 @@ manager.fillLayout = function(_gd) { _gd._fullLayout = extendDeepAll(dflts, _gd.layout); }; -},{"../../../components/color":51,"../../../lib":168,"./micropolar":249,"./undo_manager":251,"d3":16}],251:[function(_dereq_,module,exports){ +},{"../../../components/color":51,"../../../lib":168,"./micropolar":248,"./undo_manager":250,"d3":16}],250:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64212,7 +64665,7 @@ module.exports = function UndoManager() { }; }; -},{}],252:[function(_dereq_,module,exports){ +},{}],251:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64297,7 +64750,7 @@ module.exports = function handleSubplotDefaults(layoutIn, layoutOut, fullData, o } }; -},{"../lib":168,"../plot_api/plot_template":202,"./domain":238}],253:[function(_dereq_,module,exports){ +},{"../lib":168,"../plot_api/plot_template":202,"./domain":237}],252:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64381,7 +64834,7 @@ exports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout) } }; -},{"../../lib":168,"../../plots/get_data":241,"./layout_attributes":254,"./layout_defaults":255,"./ternary":256}],254:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/get_data":240,"./layout_attributes":253,"./layout_defaults":254,"./ternary":255}],253:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64484,7 +64937,7 @@ attrs.aaxis.uirevision = attrs.baxis.uirevision = attrs.caxis.uirevision = { }; -},{"../../components/color/attributes":50,"../../lib/extend":162,"../../plot_api/edit_types":195,"../cartesian/layout_attributes":225,"../domain":238}],255:[function(_dereq_,module,exports){ +},{"../../components/color/attributes":50,"../../lib/extend":162,"../../plot_api/edit_types":195,"../cartesian/layout_attributes":224,"../domain":237}],254:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64616,7 +65069,7 @@ function handleAxisDefaults(containerIn, containerOut, options, ternaryLayoutOut coerce('layer'); } -},{"../../components/color":51,"../../lib":168,"../../plot_api/plot_template":202,"../cartesian/line_grid_defaults":227,"../cartesian/tick_label_defaults":232,"../cartesian/tick_mark_defaults":233,"../cartesian/tick_value_defaults":234,"../subplot_defaults":252,"./layout_attributes":254}],256:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../../plot_api/plot_template":202,"../cartesian/line_grid_defaults":226,"../cartesian/tick_label_defaults":231,"../cartesian/tick_mark_defaults":232,"../cartesian/tick_value_defaults":233,"../subplot_defaults":251,"./layout_attributes":253}],255:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -65078,15 +65531,11 @@ proto.drawAx = function(ax) { crisp: false }); - var labelFns = Axes.makeLabelFns(ax, 0, counterAngle); - Axes.drawLabels(gd, ax, { vals: vals, layer: axLayer, transFn: transFn, - labelXFn: labelFns.labelXFn, - labelYFn: labelFns.labelYFn, - labelAnchorFn: labelFns.labelAnchorFn + labelFns: Axes.makeLabelFns(ax, 0, counterAngle) }); }; @@ -65378,7 +65827,7 @@ function removeZoombox(gd) { .remove(); } -},{"../../components/color":51,"../../components/dragelement":69,"../../components/drawing":72,"../../components/fx":90,"../../components/titles":139,"../../lib":168,"../../lib/extend":162,"../../registry":257,"../cartesian/axes":212,"../cartesian/constants":218,"../cartesian/select":230,"../cartesian/set_convert":231,"../plots":245,"d3":16,"tinycolor2":34}],257:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/dragelement":69,"../../components/drawing":72,"../../components/fx":90,"../../components/titles":139,"../../lib":168,"../../lib/extend":162,"../../registry":256,"../cartesian/axes":212,"../cartesian/constants":218,"../cartesian/select":229,"../cartesian/set_convert":230,"../plots":244,"d3":16,"tinycolor2":34}],256:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -65823,7 +66272,7 @@ function getTraceType(traceType) { return traceType; } -},{"./lib/extend":162,"./lib/is_plain_object":169,"./lib/loggers":172,"./lib/noop":177,"./lib/push_unique":181,"./plots/attributes":209,"./plots/layout_attributes":243}],258:[function(_dereq_,module,exports){ +},{"./lib/extend":162,"./lib/is_plain_object":169,"./lib/loggers":172,"./lib/noop":177,"./lib/push_unique":181,"./plots/attributes":209,"./plots/layout_attributes":242}],257:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -65884,7 +66333,6 @@ function keyIsAxis(keyName) { module.exports = function clonePlot(graphObj, options) { - // Polar plot compatibility if(graphObj.framework && graphObj.framework.isPolar) { graphObj = graphObj.framework.getConfig(); @@ -65997,7 +66445,7 @@ module.exports = function clonePlot(graphObj, options) { return plotTile; }; -},{"../lib":168}],259:[function(_dereq_,module,exports){ +},{"../lib":168}],258:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66065,7 +66513,7 @@ function downloadImage(gd, opts) { module.exports = downloadImage; -},{"../lib":168,"../plot_api/to_image":205,"./filesaver":260}],260:[function(_dereq_,module,exports){ +},{"../lib":168,"../plot_api/to_image":205,"./filesaver":259}],259:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66137,7 +66585,7 @@ var fileSaver = function(url, name) { module.exports = fileSaver; -},{}],261:[function(_dereq_,module,exports){ +},{}],260:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66174,7 +66622,7 @@ exports.getRedrawFunc = function(gd) { }; }; -},{}],262:[function(_dereq_,module,exports){ +},{}],261:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66200,7 +66648,7 @@ var Snapshot = { module.exports = Snapshot; -},{"./cloneplot":258,"./download":259,"./helpers":261,"./svgtoimg":263,"./toimage":264,"./tosvg":265}],263:[function(_dereq_,module,exports){ +},{"./cloneplot":257,"./download":258,"./helpers":260,"./svgtoimg":262,"./toimage":263,"./tosvg":264}],262:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66316,7 +66764,7 @@ function svgToImg(opts) { module.exports = svgToImg; -},{"../lib":168,"events":15}],264:[function(_dereq_,module,exports){ +},{"../lib":168,"events":15}],263:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66343,7 +66791,6 @@ var svgToImg = _dereq_('./svgtoimg'); * @param opts.format 'jpeg' | 'png' | 'webp' | 'svg' */ function toImage(gd, opts) { - // first clone the GD so we can operate in a clean environment var ev = new EventEmitter(); @@ -66376,7 +66823,6 @@ function toImage(gd, opts) { ev.clean = function() { if(clonedGd) document.body.removeChild(clonedGd); }; - }, delay); } @@ -66395,7 +66841,7 @@ function toImage(gd, opts) { module.exports = toImage; -},{"../lib":168,"../registry":257,"./cloneplot":258,"./helpers":261,"./svgtoimg":263,"./tosvg":265,"events":15}],265:[function(_dereq_,module,exports){ +},{"../lib":168,"../registry":256,"./cloneplot":257,"./helpers":260,"./svgtoimg":262,"./tosvg":264,"events":15}],264:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66577,7 +67023,7 @@ module.exports = function toSVG(gd, format, scale) { return s; }; -},{"../components/color":51,"../components/drawing":72,"../constants/xmlns_namespaces":150,"../lib":168,"d3":16}],266:[function(_dereq_,module,exports){ +},{"../components/color":51,"../components/drawing":72,"../constants/xmlns_namespaces":150,"../lib":168,"d3":16}],265:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66586,12 +67032,10 @@ module.exports = function toSVG(gd, format, scale) { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var mergeArray = _dereq_('../../lib').mergeArray; - // arrayOk attributes, merge them into calcdata array module.exports = function arraysToCalcdata(cd, trace) { for(var i = 0; i < cd.length; i++) cd[i].i = i; @@ -66612,7 +67056,7 @@ module.exports = function arraysToCalcdata(cd, trace) { } }; -},{"../../lib":168}],267:[function(_dereq_,module,exports){ +},{"../../lib":168}],266:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66754,6 +67198,21 @@ module.exports = { marker: marker, + offsetgroup: { + valType: 'string', + + dflt: '', + editType: 'calc', + + }, + alignmentgroup: { + valType: 'string', + + dflt: '', + editType: 'calc', + + }, + selected: { marker: { opacity: scatterAttrs.selected.marker.opacity, @@ -66787,7 +67246,7 @@ module.exports = { } }; -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/font_attributes":239,"../scatter/attributes":367,"./constants.js":269}],268:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/font_attributes":238,"../scatter/attributes":366,"./constants.js":268}],267:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66852,7 +67311,7 @@ module.exports = function calc(gd, trace) { return cd; }; -},{"../../components/colorscale/calc":59,"../../components/colorscale/helpers":62,"../../plots/cartesian/axes":212,"../scatter/calc_selection":369,"./arrays_to_calcdata":266}],269:[function(_dereq_,module,exports){ +},{"../../components/colorscale/calc":59,"../../components/colorscale/helpers":62,"../../plots/cartesian/axes":212,"../scatter/calc_selection":368,"./arrays_to_calcdata":265}],268:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66868,7 +67327,7 @@ module.exports = { eventDataKeys: [] }; -},{}],270:[function(_dereq_,module,exports){ +},{}],269:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66885,6 +67344,7 @@ var BADNUM = _dereq_('../../constants/numerical').BADNUM; var Registry = _dereq_('../../registry'); var Axes = _dereq_('../../plots/cartesian/axes'); +var getAxisGroup = _dereq_('../../plots/cartesian/axis_ids').getAxisGroup; var Sieve = _dereq_('./sieve.js'); /* @@ -66927,52 +67387,57 @@ function setGroupPositions(gd, pa, sa, calcTraces) { if(!calcTraces.length) return; var barmode = gd._fullLayout.barmode; - var overlay = (barmode === 'overlay'); - var group = (barmode === 'group'); var excluded; var included; var i, calcTrace, fullTrace; initBase(gd, pa, sa, calcTraces); - if(overlay) { - setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces); - } else if(group) { - // exclude from the group those traces for which the user set an offset - excluded = []; - included = []; - for(i = 0; i < calcTraces.length; i++) { - calcTrace = calcTraces[i]; - fullTrace = calcTrace[0].trace; + switch(barmode) { + case 'overlay': + setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces); + break; - if(fullTrace.offset === undefined) included.push(calcTrace); - else excluded.push(calcTrace); - } + case 'group': + // exclude from the group those traces for which the user set an offset + excluded = []; + included = []; + for(i = 0; i < calcTraces.length; i++) { + calcTrace = calcTraces[i]; + fullTrace = calcTrace[0].trace; - if(included.length) { - setGroupPositionsInGroupMode(gd, pa, sa, included); - } - if(excluded.length) { - setGroupPositionsInOverlayMode(gd, pa, sa, excluded); - } - } else { - // exclude from the stack those traces for which the user set a base - excluded = []; - included = []; - for(i = 0; i < calcTraces.length; i++) { - calcTrace = calcTraces[i]; - fullTrace = calcTrace[0].trace; + if(fullTrace.offset === undefined) included.push(calcTrace); + else excluded.push(calcTrace); + } - if(fullTrace.base === undefined) included.push(calcTrace); - else excluded.push(calcTrace); - } + if(included.length) { + setGroupPositionsInGroupMode(gd, pa, sa, included); + } + if(excluded.length) { + setGroupPositionsInOverlayMode(gd, pa, sa, excluded); + } + break; - if(included.length) { - setGroupPositionsInStackOrRelativeMode(gd, pa, sa, included); - } - if(excluded.length) { - setGroupPositionsInOverlayMode(gd, pa, sa, excluded); - } + case 'stack': + case 'relative': + // exclude from the stack those traces for which the user set a base + excluded = []; + included = []; + for(i = 0; i < calcTraces.length; i++) { + calcTrace = calcTraces[i]; + fullTrace = calcTrace[0].trace; + + if(fullTrace.base === undefined) included.push(calcTrace); + else excluded.push(calcTrace); + } + + if(included.length) { + setGroupPositionsInStackOrRelativeMode(gd, pa, sa, included); + } + if(excluded.length) { + setGroupPositionsInOverlayMode(gd, pa, sa, excluded); + } + break; } collectExtents(calcTraces, pa); @@ -67024,13 +67489,15 @@ function initBase(gd, pa, sa, calcTraces) { function setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces) { var barnorm = gd._fullLayout.barnorm; - var separateNegativeValues = false; - var dontMergeOverlappingData = !barnorm; // update position axis and set bar offsets and widths for(var i = 0; i < calcTraces.length; i++) { var calcTrace = calcTraces[i]; - var sieve = new Sieve([calcTrace], separateNegativeValues, dontMergeOverlappingData); + + var sieve = new Sieve([calcTrace], { + sepNegVal: false, + overlapNoMerge: !barnorm + }); // set bar offsets and widths, and update position axis setOffsetAndWidth(gd, pa, sieve); @@ -67052,13 +67519,19 @@ function setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces) { function setGroupPositionsInGroupMode(gd, pa, sa, calcTraces) { var fullLayout = gd._fullLayout; var barnorm = fullLayout.barnorm; - var separateNegativeValues = false; - var dontMergeOverlappingData = !barnorm; - var sieve = new Sieve(calcTraces, separateNegativeValues, dontMergeOverlappingData); + + var sieve = new Sieve(calcTraces, { + sepNegVal: false, + overlapNoMerge: !barnorm + }); // set bar offsets and widths, and update position axis setOffsetAndWidthInGroupMode(gd, pa, sieve); + // relative-stack bars within the same trace that would otherwise + // be hidden + unhideBarsWithinTrace(gd, sa, sieve); + // set bar bases and sizes, and update size axis if(barnorm) { sieveBars(gd, sa, sieve); @@ -67071,12 +67544,12 @@ function setGroupPositionsInGroupMode(gd, pa, sa, calcTraces) { function setGroupPositionsInStackOrRelativeMode(gd, pa, sa, calcTraces) { var fullLayout = gd._fullLayout; var barmode = fullLayout.barmode; - var stack = barmode === 'stack'; - var relative = barmode === 'relative'; var barnorm = fullLayout.barnorm; - var separateNegativeValues = relative; - var dontMergeOverlappingData = !(barnorm || stack || relative); - var sieve = new Sieve(calcTraces, separateNegativeValues, dontMergeOverlappingData); + + var sieve = new Sieve(calcTraces, { + sepNegVal: barmode === 'relative', + overlapNoMerge: !(barnorm || barmode === 'stack' || barmode === 'relative') + }); // set bar offsets and widths, and update position axis setOffsetAndWidth(gd, pa, sieve); @@ -67107,6 +67580,7 @@ function setOffsetAndWidth(gd, pa, sieve) { var fullLayout = gd._fullLayout; var bargap = fullLayout.bargap; var bargroupgap = fullLayout.bargroupgap || 0; + var minDiff = sieve.minDiff; var calcTraces = sieve.traces; @@ -67150,26 +67624,42 @@ function setOffsetAndWidthInGroupMode(gd, pa, sieve) { var distinctPositions = sieve.distinctPositions; var minDiff = sieve.minDiff; var calcTraces = sieve.traces; + var nTraces = calcTraces.length; // if there aren't any overlapping positions, // let them have full width even if mode is group var overlap = (positions.length !== distinctPositions.length); - - var nTraces = calcTraces.length; var barGroupWidth = minDiff * (1 - bargap); - var barWidthPlusGap = (overlap) ? barGroupWidth / nTraces : barGroupWidth; - var barWidth = barWidthPlusGap * (1 - bargroupgap); + + var groupId = getAxisGroup(fullLayout, pa._id) + calcTraces[0][0].trace.orientation; + var alignmentGroups = fullLayout._alignmentOpts[groupId] || {}; for(var i = 0; i < nTraces; i++) { var calcTrace = calcTraces[i]; + var trace = calcTrace[0].trace; + + var alignmentGroupOpts = alignmentGroups[trace.alignmentgroup] || {}; + var nOffsetGroups = Object.keys(alignmentGroupOpts.offsetGroups || {}).length; + + var barWidthPlusGap; + if(nOffsetGroups) { + barWidthPlusGap = barGroupWidth / nOffsetGroups; + } else { + barWidthPlusGap = overlap ? barGroupWidth / nTraces : barGroupWidth; + } + + var barWidth = barWidthPlusGap * (1 - bargroupgap); + + var offsetFromCenter; + if(nOffsetGroups) { + offsetFromCenter = ((2 * trace._offsetIndex + 1 - nOffsetGroups) * barWidthPlusGap - barWidth) / 2; + } else { + offsetFromCenter = overlap ? + ((2 * i + 1 - nTraces) * barWidthPlusGap - barWidth) / 2 : + -barWidth / 2; + } + var t = calcTrace[0].t; - - // computer bar group center and bar offset - var offsetFromCenter = overlap ? - ((2 * i + 1 - nTraces) * barWidthPlusGap - barWidth) / 2 : - -barWidth / 2; - - // store bar width and offset for this trace t.barwidth = barWidth; t.poffset = offsetFromCenter; t.bargroupwidth = barGroupWidth; @@ -67416,7 +67906,39 @@ function sieveBars(gd, sa, sieve) { for(var j = 0; j < calcTrace.length; j++) { var bar = calcTrace[j]; - if(bar.s !== BADNUM) sieve.put(bar.p, bar.b + bar.s); + if(bar.s !== BADNUM) { + sieve.put(bar.p, bar.b + bar.s); + } + } + } +} + +function unhideBarsWithinTrace(gd, sa, sieve) { + var calcTraces = sieve.traces; + + for(var i = 0; i < calcTraces.length; i++) { + var calcTrace = calcTraces[i]; + var fullTrace = calcTrace[0].trace; + + if(fullTrace.base === undefined) { + var inTraceSieve = new Sieve([calcTrace], { + sepNegVal: true, + overlapNoMerge: true + }); + + for(var j = 0; j < calcTrace.length; j++) { + var bar = calcTrace[j]; + + if(bar.p !== BADNUM) { + // stack current bar and get previous sum + var barBase = inTraceSieve.put(bar.p, bar.b + bar.s); + + // if previous sum if non-zero, this means: + // multiple bars have same starting point are potentially hidden, + // shift them vertically so that all bars are visible by default + if(barBase) bar.b = barBase; + } + } } } } @@ -67551,7 +68073,7 @@ module.exports = { setGroupPositions: setGroupPositions }; -},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":257,"./sieve.js":279,"fast-isnumeric":18}],271:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"../../plots/cartesian/axis_ids":215,"../../registry":256,"./sieve.js":278,"fast-isnumeric":18}],270:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67560,7 +68082,6 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Lib = _dereq_('../../lib'); @@ -67568,16 +68089,17 @@ var Color = _dereq_('../../components/color'); var Registry = _dereq_('../../registry'); var handleXYDefaults = _dereq_('../scatter/xy_defaults'); -var handleStyleDefaults = _dereq_('../bar/style_defaults'); +var handleStyleDefaults = _dereq_('./style_defaults'); +var getAxisGroup = _dereq_('../../plots/cartesian/axis_ids').getAxisGroup; var attributes = _dereq_('./attributes'); -module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { +var coerceFont = Lib.coerceFont; + +function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); } - var coerceFont = Lib.coerceFont; - var len = handleXYDefaults(traceIn, traceOut, layout, coerce); if(!len) { traceOut.visible = false; @@ -67593,8 +68115,80 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('hovertext'); coerce('hovertemplate'); - var textPosition = coerce('textposition'); + handleText(traceIn, traceOut, layout, coerce, true); + handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout); + + var lineColor = (traceOut.marker.line || {}).color; + + // override defaultColor for error bars with defaultLine + var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults'); + errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'y'}); + errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'}); + + Lib.coerceSelectionMarkerOpacity(traceOut, coerce); +} + +function handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce) { + var orientation = traceOut.orientation; + // N.B. grouping is done across all trace trace types that support it + var posAxId = traceOut[{v: 'x', h: 'y'}[orientation] + 'axis']; + var groupId = getAxisGroup(fullLayout, posAxId) + orientation; + + var alignmentOpts = fullLayout._alignmentOpts || {}; + var alignmentgroup = coerce('alignmentgroup'); + + var alignmentGroups = alignmentOpts[groupId]; + if(!alignmentGroups) alignmentGroups = alignmentOpts[groupId] = {}; + + var alignmentGroupOpts = alignmentGroups[alignmentgroup]; + + if(alignmentGroupOpts) { + alignmentGroupOpts.traces.push(traceOut); + } else { + alignmentGroupOpts = alignmentGroups[alignmentgroup] = { + traces: [traceOut], + alignmentIndex: Object.keys(alignmentGroups).length, + offsetGroups: {} + }; + } + + var offsetgroup = coerce('offsetgroup'); + var offsetGroups = alignmentGroupOpts.offsetGroups; + var offsetGroupOpts = offsetGroups[offsetgroup]; + + if(offsetgroup) { + if(!offsetGroupOpts) { + offsetGroupOpts = offsetGroups[offsetgroup] = { + offsetIndex: Object.keys(offsetGroups).length + }; + } + + traceOut._offsetIndex = offsetGroupOpts.offsetIndex; + } +} + +function crossTraceDefaults(fullData, fullLayout) { + var traceIn, traceOut; + + function coerce(attr) { + return Lib.coerce(traceOut._input, traceOut, attributes, attr); + } + + if(fullLayout.barmode === 'group') { + for(var i = 0; i < fullData.length; i++) { + traceOut = fullData[i]; + + if(traceOut.type === 'bar') { + traceIn = traceOut._input; + handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce); + } + } + } +} + +function handleText(traceIn, traceOut, layout, coerce, moduleHasSelUnselected) { + var textPosition = coerce('textposition'); var hasBoth = Array.isArray(textPosition) || textPosition === 'auto'; var hasInside = hasBoth || textPosition === 'inside'; var hasOutside = hasBoth || textPosition === 'outside'; @@ -67617,24 +68211,24 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout if(hasOutside) coerceFont(coerce, 'outsidetextfont', textFont); coerce('constraintext'); - coerce('selected.textfont.color'); - coerce('unselected.textfont.color'); + + if(moduleHasSelUnselected) { + coerce('selected.textfont.color'); + coerce('unselected.textfont.color'); + } + coerce('cliponaxis'); } +} - handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout); - - var lineColor = (traceOut.marker.line || {}).color; - - // override defaultColor for error bars with defaultLine - var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults'); - errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'y'}); - errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'}); - - Lib.coerceSelectionMarkerOpacity(traceOut, coerce); +module.exports = { + supplyDefaults: supplyDefaults, + crossTraceDefaults: crossTraceDefaults, + handleGroupingDefaults: handleGroupingDefaults, + handleText: handleText }; -},{"../../components/color":51,"../../lib":168,"../../registry":257,"../bar/style_defaults":281,"../scatter/xy_defaults":393,"./attributes":267}],272:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../../plots/cartesian/axis_ids":215,"../../registry":256,"../scatter/xy_defaults":392,"./attributes":266,"./style_defaults":280}],271:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67702,7 +68296,7 @@ exports.getValue = function(arrayOrScalar, index) { return value; }; -},{"fast-isnumeric":18,"tinycolor2":34}],273:[function(_dereq_,module,exports){ +},{"fast-isnumeric":18,"tinycolor2":34}],272:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67720,6 +68314,21 @@ var Color = _dereq_('../../components/color'); var fillHoverText = _dereq_('../scatter/fill_hover_text'); function hoverPoints(pointData, xval, yval, hovermode) { + var barPointData = hoverOnBars(pointData, xval, yval, hovermode); + + if(barPointData) { + var cd = barPointData.cd; + var trace = cd[0].trace; + var di = cd[barPointData.index]; + + barPointData.color = getTraceColor(trace, di); + Registry.getComponentMethod('errorbars', 'hoverInfo')(di, trace, barPointData); + + return [barPointData]; + } +} + +function hoverOnBars(pointData, xval, yval, hovermode) { var cd = pointData.cd; var trace = cd[0].trace; var t = cd[0].t; @@ -67838,12 +68447,10 @@ function hoverPoints(pointData, xval, yval, hovermode) { // in case of bars shifted within groups pointData[posLetter + 'Spike'] = pa.c2p(di.p, true); - pointData.color = getTraceColor(trace, di); fillHoverText(di, trace, pointData); - Registry.getComponentMethod('errorbars', 'hoverInfo')(di, trace, pointData); - pointData.hovertemplate = trace.hovertemplate; - return [pointData]; + + return pointData; } function getTraceColor(trace, di) { @@ -67857,10 +68464,11 @@ function getTraceColor(trace, di) { module.exports = { hoverPoints: hoverPoints, + hoverOnBars: hoverOnBars, getTraceColor: getTraceColor }; -},{"../../components/color":51,"../../components/fx":90,"../../registry":257,"../scatter/fill_hover_text":375}],274:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/fx":90,"../../registry":256,"../scatter/fill_hover_text":374}],273:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67869,14 +68477,14 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Bar = {}; Bar.attributes = _dereq_('./attributes'); Bar.layoutAttributes = _dereq_('./layout_attributes'); -Bar.supplyDefaults = _dereq_('./defaults'); +Bar.supplyDefaults = _dereq_('./defaults').supplyDefaults; +Bar.crossTraceDefaults = _dereq_('./defaults').crossTraceDefaults; Bar.supplyLayoutDefaults = _dereq_('./layout_defaults'); Bar.calc = _dereq_('./calc'); Bar.crossTraceCalc = _dereq_('./cross_trace_calc').crossTraceCalc; @@ -67898,7 +68506,7 @@ Bar.meta = { module.exports = Bar; -},{"../../plots/cartesian":224,"../scatter/marker_colorbar":385,"./arrays_to_calcdata":266,"./attributes":267,"./calc":268,"./cross_trace_calc":270,"./defaults":271,"./hover":273,"./layout_attributes":275,"./layout_defaults":276,"./plot":277,"./select":278,"./style":280}],275:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"../scatter/marker_colorbar":384,"./arrays_to_calcdata":265,"./attributes":266,"./calc":267,"./cross_trace_calc":269,"./defaults":270,"./hover":272,"./layout_attributes":274,"./layout_defaults":275,"./plot":276,"./select":277,"./style":279}],274:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67946,7 +68554,7 @@ module.exports = { } }; -},{}],276:[function(_dereq_,module,exports){ +},{}],275:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67955,7 +68563,6 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Registry = _dereq_('../../registry'); @@ -67964,7 +68571,6 @@ var Lib = _dereq_('../../lib'); var layoutAttributes = _dereq_('./layout_attributes'); - module.exports = function(layoutIn, layoutOut, fullData) { function coerce(attr, dflt) { return Lib.coerce(layoutIn, layoutOut, layoutAttributes, attr, dflt); @@ -67975,6 +68581,8 @@ module.exports = function(layoutIn, layoutOut, fullData) { var gappedAnyway = false; var usedSubplots = {}; + var mode = coerce('barmode'); + for(var i = 0; i < fullData.length; i++) { var trace = fullData[i]; if(Registry.traceIs(trace, 'bar') && trace.visible) hasBars = true; @@ -67982,7 +68590,7 @@ module.exports = function(layoutIn, layoutOut, fullData) { // if we have at least 2 grouped bar traces on the same subplot, // we should default to a gap anyway, even if the data is histograms - if(layoutIn.barmode !== 'overlay' && layoutIn.barmode !== 'stack') { + if(mode === 'group') { var subploti = trace.xaxis + trace.yaxis; if(usedSubplots[subploti]) gappedAnyway = true; usedSubplots[subploti] = true; @@ -67995,16 +68603,18 @@ module.exports = function(layoutIn, layoutOut, fullData) { } } - if(!hasBars) return; + if(!hasBars) { + delete layoutOut.barmode; + return; + } - var mode = coerce('barmode'); if(mode !== 'overlay') coerce('barnorm'); coerce('bargap', (shouldBeGapless && !gappedAnyway) ? 0 : 0.2); coerce('bargroupgap'); }; -},{"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":257,"./layout_attributes":275}],277:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":256,"./layout_attributes":274}],276:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68035,16 +68645,24 @@ var style = _dereq_('./style'); // padding in pixels around text var TEXTPAD = 3; -module.exports = function plot(gd, plotinfo, cdbar, barLayer) { +module.exports = function plot(gd, plotinfo, cdModule, traceLayer) { var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; var fullLayout = gd._fullLayout; - var bartraces = Lib.makeTraceGroups(barLayer, cdbar, 'trace bars').each(function(cd) { + var bartraces = Lib.makeTraceGroups(traceLayer, cdModule, 'trace bars').each(function(cd) { var plotGroup = d3.select(this); var cd0 = cd[0]; var trace = cd0.trace; + var adjustDir; + var adjustPixel = 0; + if(trace.type === 'waterfall' && trace.connector.visible && trace.connector.mode === 'between') { + adjustPixel = trace.connector.line.width / 2; + } + + var isHorizontal = (trace.orientation === 'h'); + if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; var pointGroup = Lib.ensureSingle(plotGroup, 'g', 'points'); @@ -68064,7 +68682,7 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { // log values go off-screen by plotwidth // so you see them continue if you drag the plot var x0, x1, y0, y1; - if(trace.orientation === 'h') { + if(isHorizontal) { y0 = ya.c2p(di.p0, true); y1 = ya.c2p(di.p1, true); x0 = xa.c2p(di.s0, true); @@ -68072,8 +68690,7 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { // for selections di.ct = [x1, (y0 + y1) / 2]; - } - else { + } else { x0 = xa.c2p(di.p0, true); x1 = xa.c2p(di.p1, true); y0 = ya.c2p(di.s0, true); @@ -68083,21 +68700,49 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { di.ct = [(x0 + x1) / 2, y1]; } - if(!isNumeric(x0) || !isNumeric(x1) || - !isNumeric(y0) || !isNumeric(y1) || - x0 === x1 || y0 === y1) { - bar.remove(); - return; + var isBlank = di.isBlank = ( + !isNumeric(x0) || !isNumeric(x1) || + !isNumeric(y0) || !isNumeric(y1) || + x0 === x1 || y0 === y1 + ); + + // in waterfall mode `between` we need to adjust bar end points to match the connector width + if(adjustPixel) { + if(isHorizontal) { + adjustDir = (x1 < x0) ? -1 : 1; + x0 -= adjustDir * adjustPixel; + x1 += adjustDir * adjustPixel; + } else { + adjustDir = (y1 < y0) ? -1 : 1; + y0 -= adjustDir * adjustPixel; + y1 += adjustDir * adjustPixel; + } } - var lw = (di.mlw + 1 || trace.marker.line.width + 1 || + var lw; + var mc; + var prefix; + + if(trace.type === 'waterfall') { + var cont = trace[di.dir].marker; + lw = cont.line.width; + mc = cont.color; + prefix = 'waterfall'; + } else { + lw = (di.mlw + 1 || trace.marker.line.width + 1 || (di.trace ? di.trace.marker.line.width : 0) + 1) - 1; + mc = di.mc || trace.marker.color; + prefix = 'bar'; + } + var offset = d3.round((lw / 2) % 1, 2); + var bargap = fullLayout[prefix + 'gap']; + var bargroupgap = fullLayout[prefix + 'groupgap']; function roundWithLine(v) { // if there are explicit gaps, don't round, // it can make the gaps look crappy - return (fullLayout.bargap === 0 && fullLayout.bargroupgap === 0) ? + return (bargap === 0 && bargroupgap === 0) ? d3.round(Math.round(v) - offset, 2) : v; } @@ -68118,7 +68763,8 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { // pixelation. if the bars ARE fully opaque and have // no line, expand to a full pixel to make sure we // can see them - var op = Color.opacity(di.mc || trace.marker.color); + + var op = Color.opacity(mc); var fixpx = (op < 1 || lw > 0.01) ? roundWithLine : expandToVisible; x0 = fixpx(x0, x1); x1 = fixpx(x1, x0); @@ -68128,8 +68774,7 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { Lib.ensureSingle(bar, 'path') .style('vector-effect', 'non-scaling-stroke') - .attr('d', - 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z') + .attr('d', isBlank ? 'M0,0Z' : 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z') .call(Drawing.setClipUrl, plotinfo.layerClipId, gd); appendBarText(gd, bar, cd, i, x0, x1, y0, y1); @@ -68150,6 +68795,7 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { }; function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { + var fullLayout = gd._fullLayout; var textPosition; function appendTextNode(bar, text, textFont) { @@ -68176,27 +68822,28 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { var text = getText(trace, i); textPosition = getTextPosition(trace, i); - if(!text || textPosition === 'none') { - bar.select('text').remove(); - return; - } - - var layoutFont = gd._fullLayout.font; + var layoutFont = fullLayout.font; var barColor = style.getBarColor(calcTrace[i], trace); var insideTextFont = style.getInsideTextFont(trace, i, layoutFont, barColor); var outsideTextFont = style.getOutsideTextFont(trace, i, layoutFont); // compute text position - var barmode = gd._fullLayout.barmode; - var inStackMode = (barmode === 'stack'); - var inRelativeMode = (barmode === 'relative'); - var inStackOrRelativeMode = inStackMode || inRelativeMode; + var prefix = trace.type === 'waterfall' ? 'waterfall' : 'bar'; + var barmode = fullLayout[prefix + 'mode']; + var inStackOrRelativeMode = barmode === 'stack' || barmode === 'relative'; var calcBar = calcTrace[i]; var isOutmostBar = !inStackOrRelativeMode || calcBar._outmost; - var barWidth = Math.abs(x1 - x0) - 2 * TEXTPAD; // padding excluded - var barHeight = Math.abs(y1 - y0) - 2 * TEXTPAD; // padding excluded + // padding excluded + var barWidth = Math.abs(x1 - x0) - 2 * TEXTPAD; + var barHeight = Math.abs(y1 - y0) - 2 * TEXTPAD; + + if(!text || textPosition === 'none' || + (calcBar.isBlank && (textPosition === 'auto' || textPosition === 'inside'))) { + bar.select('text').remove(); + return; + } var textSelection; var textBB; @@ -68227,14 +68874,14 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { if(textHasSize && (fitsInside || fitsInsideIfRotated || fitsInsideIfShrunk)) { textPosition = 'inside'; - } - else { + } else { textPosition = 'outside'; textSelection.remove(); textSelection = null; } + } else { + textPosition = 'inside'; } - else textPosition = 'inside'; } if(!textSelection) { @@ -68258,8 +68905,7 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { constrained = trace.constraintext === 'both' || trace.constraintext === 'outside'; transform = getTransformToMoveOutsideBar(x0, x1, y0, y1, textBB, orientation, constrained); - } - else { + } else { constrained = trace.constraintext === 'both' || trace.constraintext === 'inside'; transform = getTransformToMoveInsideBar(x0, x1, y0, y1, textBB, orientation, constrained); @@ -68287,8 +68933,7 @@ function getTransformToMoveInsideBar(x0, x1, y0, y1, textBB, orientation, constr textpad = TEXTPAD; barWidth -= 2 * textpad; barHeight -= 2 * textpad; - } - else textpad = 0; + } else textpad = 0; // compute rotation and scale var rotate, @@ -68298,18 +68943,15 @@ function getTransformToMoveInsideBar(x0, x1, y0, y1, textBB, orientation, constr // no scale or rotation is required rotate = false; scale = 1; - } - else if(textWidth <= barHeight && textHeight <= barWidth) { + } else if(textWidth <= barHeight && textHeight <= barWidth) { // only rotation is required rotate = true; scale = 1; - } - else if((textWidth < textHeight) === (barWidth < barHeight)) { + } else if((textWidth < textHeight) === (barWidth < barHeight)) { // only scale is required rotate = false; scale = constrained ? Math.min(barWidth / textWidth, barHeight / textHeight) : 1; - } - else { + } else { // both scale and rotation are required rotate = true; scale = constrained ? Math.min(barHeight / textWidth, barWidth / textHeight) : 1; @@ -68321,8 +68963,7 @@ function getTransformToMoveInsideBar(x0, x1, y0, y1, textBB, orientation, constr if(rotate) { targetWidth = scale * textHeight; targetHeight = scale * textWidth; - } - else { + } else { targetWidth = scale * textWidth; targetHeight = scale * textHeight; } @@ -68332,19 +68973,16 @@ function getTransformToMoveInsideBar(x0, x1, y0, y1, textBB, orientation, constr // bar end is on the left hand side targetX = x1 + textpad + targetWidth / 2; targetY = (y0 + y1) / 2; - } - else { + } else { targetX = x1 - textpad - targetWidth / 2; targetY = (y0 + y1) / 2; } - } - else { + } else { if(y1 > y0) { // bar end is on the bottom targetX = (x0 + x1) / 2; targetY = y1 - textpad - targetHeight / 2; - } - else { + } else { targetX = (x0 + x1) / 2; targetY = y1 + textpad + targetHeight / 2; } @@ -68389,19 +69027,16 @@ function getTransformToMoveOutsideBar(x0, x1, y0, y1, textBB, orientation, const // bar end is on the left hand side targetX = x1 - textpad - targetWidth / 2; targetY = (y0 + y1) / 2; - } - else { + } else { targetX = x1 + textpad + targetWidth / 2; targetY = (y0 + y1) / 2; } - } - else { + } else { if(y1 > y0) { // bar end is on the bottom targetX = (x0 + x1) / 2; targetY = y1 + textpad + targetHeight / 2; - } - else { + } else { targetX = (x0 + x1) / 2; targetY = y1 - textpad - targetHeight / 2; } @@ -68442,7 +69077,7 @@ function getTextPosition(trace, index) { return helpers.coerceEnumerated(attributeTextPosition, value); } -},{"../../components/color":51,"../../components/drawing":72,"../../lib":168,"../../lib/svg_text_utils":189,"../../registry":257,"./attributes":267,"./helpers":272,"./style":280,"d3":16,"fast-isnumeric":18}],278:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/drawing":72,"../../lib":168,"../../lib/svg_text_utils":189,"../../registry":256,"./attributes":266,"./helpers":271,"./style":279,"d3":16,"fast-isnumeric":18}],277:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68485,7 +69120,7 @@ module.exports = function selectPoints(searchInfo, selectionTester) { return selection; }; -},{}],279:[function(_dereq_,module,exports){ +},{}],278:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68505,18 +69140,20 @@ var BADNUM = _dereq_('../../constants/numerical').BADNUM; * Helper class to sieve data from traces into bins * * @class - * @param {Array} traces - * Array of calculated traces - * @param {boolean} [separateNegativeValues] - * If true, then split data at the same position into a bar - * for positive values and another for negative values - * @param {boolean} [dontMergeOverlappingData] - * If true, then don't merge overlapping bars into a single bar + * + * @param {Array} traces +* Array of calculated traces + * @param {object} opts + * - @param {boolean} [sepNegVal] + * If true, then split data at the same position into a bar + * for positive values and another for negative values + * - @param {boolean} [overlapNoMerge] + * If true, then don't merge overlapping bars into a single bar */ -function Sieve(traces, separateNegativeValues, dontMergeOverlappingData) { +function Sieve(traces, opts) { this.traces = traces; - this.separateNegativeValues = separateNegativeValues; - this.dontMergeOverlappingData = dontMergeOverlappingData; + this.sepNegVal = opts.sepNegVal; + this.overlapNoMerge = opts.overlapNoMerge; // for single-bin histograms - see histogram/calc var width1 = Infinity; @@ -68567,7 +69204,7 @@ Sieve.prototype.put = function put(position, value) { * @method * @param {number} position Position of datum * @param {number} [value] Value of datum - * (required if this.separateNegativeValues is true) + * (required if this.sepNegVal is true) * @returns {number} Current bin value */ Sieve.prototype.get = function put(position, value) { @@ -68581,20 +69218,20 @@ Sieve.prototype.get = function put(position, value) { * @method * @param {number} position Position of datum * @param {number} [value] Value of datum - * (required if this.separateNegativeValues is true) + * (required if this.sepNegVal is true) * @returns {string} Bin label - * (prefixed with a 'v' if value is negative and this.separateNegativeValues is + * (prefixed with a 'v' if value is negative and this.sepNegVal is * true; otherwise prefixed with '^') */ Sieve.prototype.getLabel = function getLabel(position, value) { - var prefix = (value < 0 && this.separateNegativeValues) ? 'v' : '^'; - var label = (this.dontMergeOverlappingData) ? + var prefix = (value < 0 && this.sepNegVal) ? 'v' : '^'; + var label = (this.overlapNoMerge) ? position : Math.round(position / this.binWidth); return prefix + label; }; -},{"../../constants/numerical":149,"../../lib":168}],280:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168}],279:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68603,7 +69240,6 @@ Sieve.prototype.getLabel = function getLabel(position, value) { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var d3 = _dereq_('d3'); @@ -68619,7 +69255,7 @@ var attributeOutsideTextFont = attributes.outsidetextfont; var helpers = _dereq_('./helpers'); function style(gd, cd) { - var s = cd ? cd[0].node3 : d3.select(gd).selectAll('g.trace.bars'); + var s = cd ? cd[0].node3 : d3.select(gd).selectAll('g.barlayer').selectAll('g.trace'); var barcount = s.size(); var fullLayout = gd._fullLayout; @@ -68648,12 +69284,12 @@ function style(gd, cd) { } function stylePoints(sel, trace, gd) { - var pts = sel.selectAll('path'); - var txs = sel.selectAll('text'); + Drawing.pointStyle(sel.selectAll('path'), trace, gd); + styleTextPoints(sel, trace, gd); +} - Drawing.pointStyle(pts, trace, gd); - - txs.each(function(d) { +function styleTextPoints(sel, trace, gd) { + sel.selectAll('text').each(function(d) { var tx = d3.select(this); var font = determineFont(tx, d, trace, gd); Drawing.font(tx, font); @@ -68757,18 +69393,22 @@ function getFontValue(attributeDefinition, attributeValue, index, defaultValue) } function getBarColor(cd, trace) { + if(trace.type === 'waterfall') { + return trace[cd.dir].marker.color; + } return cd.mc || trace.marker.color; } module.exports = { style: style, + styleTextPoints: styleTextPoints, styleOnSelect: styleOnSelect, getInsideTextFont: getInsideTextFont, getOutsideTextFont: getOutsideTextFont, getBarColor: getBarColor }; -},{"../../components/color":51,"../../components/drawing":72,"../../lib":168,"../../registry":257,"./attributes":267,"./helpers":272,"d3":16}],281:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/drawing":72,"../../lib":168,"../../registry":256,"./attributes":266,"./helpers":271,"d3":16}],280:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68806,7 +69446,7 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, default coerce('unselected.marker.color'); }; -},{"../../components/color":51,"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62}],282:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62}],281:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68818,7 +69458,9 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, default 'use strict'; var scatterAttrs = _dereq_('../scatter/attributes'); +var barAttrs = _dereq_('../bar/attributes'); var colorAttrs = _dereq_('../../components/color/attributes'); +var hovertemplateAttrs = _dereq_('../../components/fx/hovertemplate_attributes'); var extendFlat = _dereq_('../../lib/extend').extendFlat; var scatterMarkerAttrs = scatterAttrs.marker; @@ -68855,6 +69497,12 @@ module.exports = { }, text: extendFlat({}, scatterAttrs.text, { + }), + hovertext: extendFlat({}, scatterAttrs.hovertext, { + + }), + hovertemplate: hovertemplateAttrs({ + }), whiskerwidth: { valType: 'number', @@ -68989,6 +69637,9 @@ module.exports = { }, fillcolor: scatterAttrs.fillcolor, + offsetgroup: barAttrs.offsetgroup, + alignmentgroup: barAttrs.alignmentgroup, + selected: { marker: scatterAttrs.selected.marker, editType: 'style' @@ -69007,7 +69658,7 @@ module.exports = { } }; -},{"../../components/color/attributes":50,"../../lib/extend":162,"../scatter/attributes":367}],283:[function(_dereq_,module,exports){ +},{"../../components/color/attributes":50,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../bar/attributes":266,"../scatter/attributes":366}],282:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69222,7 +69873,8 @@ function initNestedArray(len) { function arraysToCalcdata(pt, trace, i) { var trace2calc = { - text: 'tx' + text: 'tx', + hovertext: 'htx' }; for(var k in trace2calc) { @@ -69251,7 +69903,7 @@ function sortByVal(a, b) { return a.v - b.v; } function extractVal(o) { return o.v; } -},{"../../lib":168,"../../plots/cartesian/axes":212,"fast-isnumeric":18}],284:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"fast-isnumeric":18}],283:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69264,6 +69916,7 @@ function extractVal(o) { return o.v; } var Axes = _dereq_('../../plots/cartesian/axes'); var Lib = _dereq_('../../lib'); +var getAxisGroup = _dereq_('../../plots/cartesian/axis_ids').getAxisGroup; var orientations = ['v', 'h']; @@ -69305,9 +69958,6 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { var axId = posAxis._id; var axLetter = axId.charAt(0); - // N.B. reused in violin - var numKey = traceType === 'violin' ? '_numViolins' : '_numBoxes'; - var i, j, calcTrace; var pointList = []; var shownPts = 0; @@ -69330,8 +69980,9 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { // check for forced minimum dtick Axes.minDtick(posAxis, boxdv.minDiff, boxdv.vals[0], true); - var num = fullLayout[numKey]; - var group = (fullLayout[traceType + 'mode'] === 'group' && num > 1); + var numKey = traceType === 'violin' ? '_numViolins' : '_numBoxes'; + var numTotal = fullLayout[numKey]; + var group = fullLayout[traceType + 'mode'] === 'group' && numTotal > 1; var groupFraction = 1 - fullLayout[traceType + 'gap']; var groupGapFraction = 1 - fullLayout[traceType + 'groupgap']; @@ -69358,9 +70009,23 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { bPos = 0; } else { dPos = dPos0; - bdPos = dPos * groupFraction * groupGapFraction / (group ? num : 1); - bPos = group ? 2 * dPos * (-0.5 + (t.num + 0.5) / num) * groupFraction : 0; - wHover = dPos * (group ? groupFraction / num : 1); + + if(group) { + var groupId = getAxisGroup(fullLayout, posAxis._id) + trace.orientation; + var alignmentGroups = fullLayout._alignmentOpts[groupId] || {}; + var alignmentGroupOpts = alignmentGroups[trace.alignmentgroup] || {}; + var nOffsetGroups = Object.keys(alignmentGroupOpts.offsetGroups || {}).length; + var num = nOffsetGroups || numTotal; + var shift = nOffsetGroups ? trace._offsetIndex : t.num; + + bdPos = dPos * groupFraction * groupGapFraction / num; + bPos = 2 * dPos * (-0.5 + (shift + 0.5) / num) * groupFraction; + wHover = dPos * groupFraction / num; + } else { + bdPos = dPos * groupFraction * groupGapFraction; + bPos = 0; + wHover = dPos; + } } t.dPos = dPos; t.bPos = bPos; @@ -69446,11 +70111,12 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { vpadminus = pushminus; } - // calcdata[i][j] are in ascending order - var firstPos = calcTrace[0].pos; - var lastPos = calcTrace[calcTrace.length - 1].pos; + var pos = new Array(calcTrace.length); + for(j = 0; j < calcTrace.length; j++) { + pos[j] = calcTrace[j].pos; + } - trace._extremes[axId] = Axes.findExtremes(posAxis, [firstPos, lastPos], { + trace._extremes[axId] = Axes.findExtremes(posAxis, pos, { padded: padded, vpadminus: vpadminus, vpadplus: vpadplus, @@ -69466,7 +70132,7 @@ module.exports = { setPositionOffset: setPositionOffset }; -},{"../../lib":168,"../../plots/cartesian/axes":212}],285:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../../plots/cartesian/axis_ids":215}],284:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69480,7 +70146,7 @@ module.exports = { var Lib = _dereq_('../../lib'); var Registry = _dereq_('../../registry'); var Color = _dereq_('../../components/color'); - +var handleGroupingDefaults = _dereq_('../bar/defaults').handleGroupingDefaults; var attributes = _dereq_('./attributes'); function supplyDefaults(traceIn, traceOut, defaultColor, layout) { @@ -69569,22 +70235,48 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) { coerce('unselected.marker.size'); coerce('text'); + coerce('hovertext'); } else { delete traceOut.marker; } - coerce('hoveron'); + var hoveron = coerce('hoveron'); + if(hoveron === 'all' || hoveron.indexOf('points') !== -1) { + coerce('hovertemplate'); + } Lib.coerceSelectionMarkerOpacity(traceOut, coerce); } +function crossTraceDefaults(fullData, fullLayout) { + var traceIn, traceOut; + + function coerce(attr) { + return Lib.coerce(traceOut._input, traceOut, attributes, attr); + } + + for(var i = 0; i < fullData.length; i++) { + traceOut = fullData[i]; + var traceType = traceOut.type; + + if(traceType === 'box' || traceType === 'violin') { + traceIn = traceOut._input; + if(fullLayout[traceType + 'mode'] === 'group') { + handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce); + } + } + } +} + module.exports = { supplyDefaults: supplyDefaults, + crossTraceDefaults: crossTraceDefaults, + handleSampleDefaults: handleSampleDefaults, handlePointsDefaults: handlePointsDefaults }; -},{"../../components/color":51,"../../lib":168,"../../registry":257,"./attributes":282}],286:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../../registry":256,"../bar/defaults":270,"./attributes":281}],285:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69596,7 +70288,6 @@ module.exports = { 'use strict'; module.exports = function eventData(out, pt) { - // Note: hoverOnBox property is needed for click-to-select // to ignore when a box was clicked. This is the reason box // implements this custom eventData function. @@ -69610,7 +70301,7 @@ module.exports = function eventData(out, pt) { return out; }; -},{}],287:[function(_dereq_,module,exports){ +},{}],286:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69789,11 +70480,15 @@ function hoverOnBoxes(pointData, xval, yval, hovermode) { if(attr === 'mean' && ('sd' in di) && trace.boxmean === 'sd') { pointData2[vLetter + 'err'] = di.sd; } + // only keep name and spikes on the first item (median) pointData.name = ''; pointData.spikeDistance = undefined; pointData[spikePosAttr] = undefined; + // no hovertemplate support yet + pointData2.hovertemplate = false; + closeBoxData.push(pointData2); } @@ -69855,7 +70550,8 @@ function hoverOnPoints(pointData, xval, yval) { x1: xc + rad, y0: yc - rad, y1: yc + rad, - spikeDistance: pointData.distance + spikeDistance: pointData.distance, + hovertemplate: trace.hovertemplate }); var pa; @@ -69883,7 +70579,7 @@ module.exports = { hoverOnPoints: hoverOnPoints }; -},{"../../components/color":51,"../../components/fx":90,"../../lib":168,"../../plots/cartesian/axes":212,"../scatter/fill_hover_text":375}],288:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/fx":90,"../../lib":168,"../../plots/cartesian/axes":212,"../scatter/fill_hover_text":374}],287:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69899,6 +70595,7 @@ var Box = {}; Box.attributes = _dereq_('./attributes'); Box.layoutAttributes = _dereq_('./layout_attributes'); Box.supplyDefaults = _dereq_('./defaults').supplyDefaults; +Box.crossTraceDefaults = _dereq_('./defaults').crossTraceDefaults; Box.supplyLayoutDefaults = _dereq_('./layout_defaults').supplyLayoutDefaults; Box.calc = _dereq_('./calc'); Box.crossTraceCalc = _dereq_('./cross_trace_calc').crossTraceCalc; @@ -69919,7 +70616,7 @@ Box.meta = { module.exports = Box; -},{"../../plots/cartesian":224,"./attributes":282,"./calc":283,"./cross_trace_calc":284,"./defaults":285,"./event_data":286,"./hover":287,"./layout_attributes":289,"./layout_defaults":290,"./plot":291,"./select":292,"./style":293}],289:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"./attributes":281,"./calc":282,"./cross_trace_calc":283,"./defaults":284,"./event_data":285,"./hover":286,"./layout_attributes":288,"./layout_defaults":289,"./plot":290,"./select":291,"./style":292}],288:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69960,7 +70657,7 @@ module.exports = { } }; -},{}],290:[function(_dereq_,module,exports){ +},{}],289:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69976,10 +70673,13 @@ var Lib = _dereq_('../../lib'); var layoutAttributes = _dereq_('./layout_attributes'); function _supply(layoutIn, layoutOut, fullData, coerce, traceType) { - var hasTraceType; var category = traceType + 'Layout'; + var hasTraceType = false; + for(var i = 0; i < fullData.length; i++) { - if(Registry.traceIs(fullData[i], category)) { + var trace = fullData[i]; + + if(Registry.traceIs(trace, category)) { hasTraceType = true; break; } @@ -70003,7 +70703,7 @@ module.exports = { _supply: _supply }; -},{"../../lib":168,"../../registry":257,"./layout_attributes":289}],291:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"./layout_attributes":288}],290:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70327,7 +71027,7 @@ module.exports = { plotBoxMean: plotBoxMean }; -},{"../../components/drawing":72,"../../lib":168,"d3":16}],292:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../lib":168,"d3":16}],291:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70376,7 +71076,7 @@ module.exports = function selectPoints(searchInfo, selectionTester) { return selection; }; -},{}],293:[function(_dereq_,module,exports){ +},{}],292:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70451,7 +71151,7 @@ module.exports = { styleOnSelect: styleOnSelect }; -},{"../../components/color":51,"../../components/drawing":72,"d3":16}],294:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/drawing":72,"d3":16}],293:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70485,10 +71185,12 @@ module.exports = extendFlat({ y0: heatmapAttrs.y0, dy: heatmapAttrs.dy, text: heatmapAttrs.text, + hovertext: heatmapAttrs.hovertext, transpose: heatmapAttrs.transpose, xtype: heatmapAttrs.xtype, ytype: heatmapAttrs.ytype, zhoverformat: heatmapAttrs.zhoverformat, + hovertemplate: heatmapAttrs.hovertemplate, connectgaps: heatmapAttrs.connectgaps, @@ -70630,7 +71332,7 @@ module.exports = extendFlat({ { colorbar: colorbarAttrs } ); -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing/attributes":71,"../../constants/filter_ops":147,"../../lib/extend":162,"../../plots/font_attributes":239,"../heatmap/attributes":316,"../scatter/attributes":367}],295:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing/attributes":71,"../../constants/filter_ops":147,"../../lib/extend":162,"../../plots/font_attributes":238,"../heatmap/attributes":315,"../scatter/attributes":366}],294:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70654,7 +71356,7 @@ module.exports = function calc(gd, trace) { return cd; }; -},{"../heatmap/calc":317,"./set_contours":313}],296:[function(_dereq_,module,exports){ +},{"../heatmap/calc":316,"./set_contours":312}],295:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70721,7 +71423,7 @@ module.exports = function(pathinfo, operation, perimeter, trace) { } }; -},{}],297:[function(_dereq_,module,exports){ +},{}],296:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70772,7 +71474,7 @@ module.exports = function colorbar(gd, cd) { .options(trace.colorbar)(); }; -},{"../../components/colorbar/draw":56,"./end_plus":305,"./make_color_map":310}],298:[function(_dereq_,module,exports){ +},{"../../components/colorbar/draw":56,"./end_plus":304,"./make_color_map":309}],297:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70850,7 +71552,7 @@ module.exports = { } }; -},{}],299:[function(_dereq_,module,exports){ +},{}],298:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70945,7 +71647,7 @@ function handleConstraintValueDefaults(coerce, contours) { } } -},{"../../components/color":51,"../../constants/filter_ops":147,"./label_defaults":309,"fast-isnumeric":18}],300:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../constants/filter_ops":147,"./label_defaults":308,"fast-isnumeric":18}],299:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71024,7 +71726,7 @@ function makeInequalitySettings(operation) { }; } -},{"../../constants/filter_ops":147,"fast-isnumeric":18}],301:[function(_dereq_,module,exports){ +},{"../../constants/filter_ops":147,"fast-isnumeric":18}],300:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71053,7 +71755,7 @@ module.exports = function handleContourDefaults(traceIn, traceOut, coerce, coerc if(autoContour || !contourSize) coerce('ncontours'); }; -},{}],302:[function(_dereq_,module,exports){ +},{}],301:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71141,7 +71843,7 @@ function copyPathinfo(pi) { }); } -},{"../../lib":168}],303:[function(_dereq_,module,exports){ +},{"../../lib":168}],302:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71150,7 +71852,6 @@ function copyPathinfo(pi) { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Lib = _dereq_('../../lib'); @@ -71178,6 +71879,9 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } coerce('text'); + coerce('hovertext'); + coerce('hovertemplate'); + var isConstraint = (coerce('contours.type') === 'constraint'); coerce('connectgaps', Lib.isArray1D(traceOut.z)); @@ -71190,7 +71894,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } }; -},{"../../lib":168,"../heatmap/xyz_defaults":330,"./attributes":294,"./constraint_defaults":299,"./contours_defaults":301,"./style_defaults":315}],304:[function(_dereq_,module,exports){ +},{"../../lib":168,"../heatmap/xyz_defaults":329,"./attributes":293,"./constraint_defaults":298,"./contours_defaults":300,"./style_defaults":314}],303:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71254,7 +71958,7 @@ module.exports = function emptyPathinfo(contours, plotinfo, cd0) { return pathinfo; }; -},{"../../lib":168,"./constraint_mapping":300,"./end_plus":305}],305:[function(_dereq_,module,exports){ +},{"../../lib":168,"./constraint_mapping":299,"./end_plus":304}],304:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71274,7 +71978,7 @@ module.exports = function endPlus(contours) { return contours.end + contours.size / 1e6; }; -},{}],306:[function(_dereq_,module,exports){ +},{}],305:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71574,7 +72278,7 @@ function getInterpPx(pi, loc, step) { } } -},{"../../lib":168,"./constants":298}],307:[function(_dereq_,module,exports){ +},{"../../lib":168,"./constants":297}],306:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71610,7 +72314,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay return hoverData; }; -},{"../../components/color":51,"../heatmap/hover":323}],308:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../heatmap/hover":322}],307:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71642,7 +72346,7 @@ Contour.meta = { module.exports = Contour; -},{"../../plots/cartesian":224,"./attributes":294,"./calc":295,"./colorbar":297,"./defaults":303,"./hover":307,"./plot":312,"./style":314}],309:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"./attributes":293,"./calc":294,"./colorbar":296,"./defaults":302,"./hover":306,"./plot":311,"./style":313}],308:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71672,7 +72376,7 @@ module.exports = function handleLabelDefaults(coerce, layout, lineColor, opts) { if(opts.hasHover !== false) coerce('zhoverformat'); }; -},{"../../lib":168}],310:[function(_dereq_,module,exports){ +},{"../../lib":168}],309:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71762,7 +72466,7 @@ module.exports = function makeColorMap(trace) { }); }; -},{"../../components/colorscale":63,"./end_plus":305,"d3":16}],311:[function(_dereq_,module,exports){ +},{"../../components/colorscale":63,"./end_plus":304,"d3":16}],310:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71854,7 +72558,7 @@ function getMarchingIndex(val, corners) { return (mi === 15) ? 0 : mi; } -},{"./constants":298}],312:[function(_dereq_,module,exports){ +},{"./constants":297}],311:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72540,7 +73244,7 @@ function makeClipMask(cd0) { return z; } -},{"../../components/drawing":72,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../plots/cartesian/set_convert":231,"../heatmap/plot":327,"./close_boundaries":296,"./constants":298,"./convert_to_constraints":302,"./empty_pathinfo":304,"./find_all_paths":306,"./make_crossings":311,"d3":16}],313:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../plots/cartesian/set_convert":230,"../heatmap/plot":326,"./close_boundaries":295,"./constants":297,"./convert_to_constraints":301,"./empty_pathinfo":303,"./find_all_paths":305,"./make_crossings":310,"d3":16}],312:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72644,7 +73348,7 @@ function autoContours(start, end, ncontours) { return dummyAx; } -},{"../../lib":168,"../../plots/cartesian/axes":212}],314:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212}],313:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72726,7 +73430,7 @@ module.exports = function style(gd) { heatmapStyle(gd); }; -},{"../../components/drawing":72,"../heatmap/style":328,"./make_color_map":310,"d3":16}],315:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../heatmap/style":327,"./make_color_map":309,"d3":16}],314:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72771,7 +73475,7 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, layout, handleLabelDefaults(coerce, layout, lineColor, opts); }; -},{"../../components/colorscale/defaults":61,"./label_defaults":309}],316:[function(_dereq_,module,exports){ +},{"../../components/colorscale/defaults":61,"./label_defaults":308}],315:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72783,6 +73487,7 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, layout, 'use strict'; var scatterAttrs = _dereq_('../scatter/attributes'); +var hovertemplateAttrs = _dereq_('../../components/fx/hovertemplate_attributes'); var colorscaleAttrs = _dereq_('../../components/colorscale/attributes'); var colorbarAttrs = _dereq_('../../components/colorbar/attributes'); @@ -72805,6 +73510,11 @@ module.exports = extendFlat({ valType: 'data_array', editType: 'calc', + }, + hovertext: { + valType: 'data_array', + editType: 'calc', + }, transpose: { valType: 'boolean', @@ -72865,6 +73575,8 @@ module.exports = extendFlat({ editType: 'none', }, + hovertemplate: hovertemplateAttrs() +}, { transforms: undefined }, colorscaleAttrs('', { @@ -72874,7 +73586,7 @@ module.exports = extendFlat({ { colorbar: colorbarAttrs } ); -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../lib/extend":162,"../scatter/attributes":367}],317:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../scatter/attributes":366}],316:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72944,10 +73656,10 @@ module.exports = function calc(gd, trace) { y = trace.y ? ya.makeCalcdata(trace, 'y') : []; } - x0 = trace.x0 || 0; - dx = trace.dx || 1; - y0 = trace.y0 || 0; - dy = trace.dy || 1; + x0 = trace.x0; + dx = trace.dx; + y0 = trace.y0; + dy = trace.dy; z = clean2dArray(zIn, trace.transpose); @@ -73008,7 +73720,8 @@ module.exports = function calc(gd, trace) { x: xArray, y: yArray, z: z, - text: trace._text || trace.text + text: trace._text || trace.text, + hovertext: trace._hovertext || trace.hovertext }; if(xIn && xIn.length === xArray.length - 1) cd0.xCenter = xIn; @@ -73042,7 +73755,7 @@ module.exports = function calc(gd, trace) { return [cd0]; }; -},{"../../components/colorscale/calc":59,"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":257,"../histogram2d/calc":345,"./clean_2d_array":318,"./convert_column_xyz":320,"./find_empties":322,"./interp2d":325,"./make_bound_array":326}],318:[function(_dereq_,module,exports){ +},{"../../components/colorscale/calc":59,"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":256,"../histogram2d/calc":344,"./clean_2d_array":317,"./convert_column_xyz":319,"./find_empties":321,"./interp2d":324,"./make_bound_array":325}],317:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73087,7 +73800,7 @@ module.exports = function clean2dArray(zOld, transpose) { return zNew; }; -},{"fast-isnumeric":18}],319:[function(_dereq_,module,exports){ +},{"fast-isnumeric":18}],318:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73103,7 +73816,7 @@ module.exports = { max: 'zmax' }; -},{}],320:[function(_dereq_,module,exports){ +},{}],319:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73124,6 +73837,8 @@ module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, var col2 = ax2.makeCalcdata(trace, var2Name); var textCol = trace.text; var hasColumnText = (textCol !== undefined && Lib.isArray1D(textCol)); + var hoverTextCol = trace.hovertext; + var hasColumnHoverText = (hoverTextCol !== undefined && Lib.isArray1D(hoverTextCol)); var i, j; var col1dv = Lib.distinctVals(col1); @@ -73132,6 +73847,7 @@ module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, var col2vals = col2dv.vals; var newArrays = []; var text; + var hovertext; for(i = 0; i < arrayVarNames.length; i++) { newArrays[i] = Lib.init2dArray(col2vals.length, col1vals.length); @@ -73140,6 +73856,9 @@ module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, if(hasColumnText) { text = Lib.init2dArray(col2vals.length, col1vals.length); } + if(hasColumnHoverText) { + hovertext = Lib.init2dArray(col2vals.length, col1vals.length); + } for(i = 0; i < colLen; i++) { if(col1[i] !== BADNUM && col2[i] !== BADNUM) { @@ -73154,6 +73873,7 @@ module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, } if(hasColumnText) text[i2][i1] = textCol[i]; + if(hasColumnHoverText) hovertext[i2][i1] = hoverTextCol[i]; } } @@ -73163,9 +73883,10 @@ module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, trace['_' + arrayVarNames[j]] = newArrays[j]; } if(hasColumnText) trace._text = text; + if(hasColumnHoverText) trace._hovertext = hovertext; }; -},{"../../constants/numerical":149,"../../lib":168}],321:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168}],320:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73197,6 +73918,8 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } coerce('text'); + coerce('hovertext'); + coerce('hovertemplate'); handleStyleDefaults(traceIn, traceOut, coerce, layout); @@ -73205,7 +73928,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'}); }; -},{"../../components/colorscale/defaults":61,"../../lib":168,"./attributes":316,"./style_defaults":329,"./xyz_defaults":330}],322:[function(_dereq_,module,exports){ +},{"../../components/colorscale/defaults":61,"../../lib":168,"./attributes":315,"./style_defaults":328,"./xyz_defaults":329}],321:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73311,7 +74034,7 @@ module.exports = function findEmpties(z) { return empties.sort(function(a, b) { return b[2] - a[2]; }); }; -},{"../../lib":168}],323:[function(_dereq_,module,exports){ +},{"../../lib":168}],322:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73407,7 +74130,9 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay if(zmask && !zmask[ny][nx]) zVal = undefined; var text; - if(Array.isArray(cd0.text) && Array.isArray(cd0.text[ny])) { + if(Array.isArray(cd0.hovertext) && Array.isArray(cd0.hovertext[ny])) { + text = cd0.hovertext[ny][nx]; + } else if(Array.isArray(cd0.text) && Array.isArray(cd0.text[ny])) { text = cd0.text[ny][nx]; } @@ -73440,7 +74165,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay })]; }; -},{"../../components/fx":90,"../../lib":168,"../../plots/cartesian/axes":212}],324:[function(_dereq_,module,exports){ +},{"../../components/fx":90,"../../lib":168,"../../plots/cartesian/axes":212}],323:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73472,7 +74197,7 @@ Heatmap.meta = { module.exports = Heatmap; -},{"../../plots/cartesian":224,"./attributes":316,"./calc":317,"./colorbar":319,"./defaults":321,"./hover":323,"./plot":327,"./style":328}],325:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"./attributes":315,"./calc":316,"./colorbar":318,"./defaults":320,"./hover":322,"./plot":326,"./style":327}],324:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73607,7 +74332,7 @@ function iterateInterp2d(z, emptyPoints, overshoot) { return maxFractionalChange; } -},{"../../lib":168}],326:[function(_dereq_,module,exports){ +},{"../../lib":168}],325:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73673,20 +74398,20 @@ module.exports = function makeBoundArray(trace, arrayIn, v0In, dvIn, numbricks, } } else { - dv = dvIn || 1; - var calendar = trace[ax._id.charAt(0) + 'calendar']; - if(isHist || ax.type === 'category' || ax.type === 'multicategory') { - v0 = ax.r2c(v0In, 0, calendar) || 0; - } else if(isArrayOrTypedArray(arrayIn) && arrayIn.length === 1) { + if(isArrayOrTypedArray(arrayIn) && arrayIn.length === 1) { v0 = arrayIn[0]; } else if(v0In === undefined) { v0 = 0; + } else if(isHist || ax.type === 'category' || ax.type === 'multicategory') { + v0 = ax.r2c(v0In, 0, calendar); } else { v0 = ax.d2c(v0In, 0, calendar); } + dv = dvIn || 1; + for(i = (isContour || isGL2D) ? 0 : -0.5; i < numbricks; i++) { arrayOut.push(v0 + dv * i); } @@ -73695,7 +74420,7 @@ module.exports = function makeBoundArray(trace, arrayIn, v0In, dvIn, numbricks, return arrayOut; }; -},{"../../lib":168,"../../registry":257}],327:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],326:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73990,7 +74715,6 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { context.putImageData(imageData, 0, 0); } else { // zsmooth = false -> filling potentially large bricks works fastest with fillRect - // gaps do not need to be exact integers, but if they *are* we will get // cleaner edges by rounding at least one edge var xGap = trace.xgap; @@ -74108,7 +74832,7 @@ function putColor(pixels, pxIndex, c) { pixels[pxIndex + 3] = Math.round(c[3] * 255); } -},{"../../components/colorscale":63,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../registry":257,"d3":16,"tinycolor2":34}],328:[function(_dereq_,module,exports){ +},{"../../components/colorscale":63,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../registry":256,"d3":16,"tinycolor2":34}],327:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74129,7 +74853,7 @@ module.exports = function style(gd) { }); }; -},{"d3":16}],329:[function(_dereq_,module,exports){ +},{"d3":16}],328:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74152,7 +74876,7 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce) { coerce('zhoverformat'); }; -},{}],330:[function(_dereq_,module,exports){ +},{}],329:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74250,7 +74974,7 @@ function isValidZ(z) { return (allRowsAreArrays && oneRowIsFilled && hasOneNumber); } -},{"../../lib":168,"../../registry":257,"fast-isnumeric":18}],331:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"fast-isnumeric":18}],330:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74265,6 +74989,7 @@ var barAttrs = _dereq_('../bar/attributes'); var hovertemplateAttrs = _dereq_('../../components/fx/hovertemplate_attributes'); var makeBinAttrs = _dereq_('./bin_attributes'); var constants = _dereq_('./constants'); +var extendFlat = _dereq_('../../lib/extend').extendFlat; module.exports = { x: { @@ -74278,7 +75003,12 @@ module.exports = { }, - text: barAttrs.text, + text: extendFlat({}, barAttrs.text, { + + }), + hovertext: extendFlat({}, barAttrs.hovertext, { + + }), orientation: barAttrs.orientation, histfunc: { @@ -74366,6 +75096,9 @@ module.exports = { marker: barAttrs.marker, + offsetgroup: barAttrs.offsetgroup, + alignmentgroup: barAttrs.alignmentgroup, + selected: barAttrs.selected, unselected: barAttrs.unselected, @@ -74374,7 +75107,7 @@ module.exports = { } }; -},{"../../components/fx/hovertemplate_attributes":89,"../bar/attributes":267,"./bin_attributes":333,"./constants":337}],332:[function(_dereq_,module,exports){ +},{"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../bar/attributes":266,"./bin_attributes":332,"./constants":336}],331:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74400,7 +75133,7 @@ module.exports = function doAvg(size, counts) { return total; }; -},{}],333:[function(_dereq_,module,exports){ +},{}],332:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74435,7 +75168,7 @@ module.exports = function makeBinAttrs(axLetter, match) { }; }; -},{}],334:[function(_dereq_,module,exports){ +},{}],333:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74511,7 +75244,7 @@ module.exports = { } }; -},{"fast-isnumeric":18}],335:[function(_dereq_,module,exports){ +},{"fast-isnumeric":18}],334:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74675,7 +75408,6 @@ function didDigitChange(digit, v1, v2, isDate, pa, calendar) { var dateParts2 = dateParts(v2, pa, calendar); var parti = (digit === oneYear) ? 0 : 1; return dateParts1[parti] !== dateParts2[parti]; - } return Math.floor(v2 / digit) - Math.floor(v1 / digit) > 0.1; } @@ -74689,7 +75421,7 @@ function dateParts(v, pa, calendar) { return parts; } -},{"../../constants/numerical":149,"../../plots/cartesian/axes":212}],336:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../plots/cartesian/axes":212}],335:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75185,7 +75917,6 @@ function cdf(size, direction, currentBin) { } if(currentBin === 'half') { - if(direction === 'increasing') { firstHalfPoint(0); for(i = 1; i < size.length; i++) { @@ -75222,7 +75953,7 @@ function cdf(size, direction, currentBin) { } } -},{"../../lib":168,"../../plots/cartesian/axes":212,"../bar/arrays_to_calcdata":266,"./average":332,"./bin_functions":334,"./bin_label_vals":335,"./norm_functions":343,"fast-isnumeric":18}],337:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../bar/arrays_to_calcdata":265,"./average":331,"./bin_functions":333,"./bin_label_vals":334,"./norm_functions":342,"fast-isnumeric":18}],336:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75238,7 +75969,7 @@ module.exports = { eventDataKeys: ['binNumber'] }; -},{}],338:[function(_dereq_,module,exports){ +},{}],337:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75247,12 +75978,13 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Lib = _dereq_('../../lib'); var nestedProperty = Lib.nestedProperty; +var handleGroupingDefaults = _dereq_('../bar/defaults').handleGroupingDefaults; +var getAxisGroup = _dereq_('../../plots/cartesian/axis_ids').getAxisGroup; var attributes = _dereq_('./attributes'); var BINATTRS = { @@ -75291,20 +76023,23 @@ module.exports = function crossTraceDefaults(fullData, fullLayout) { binDirection = traceOut.orientation === 'v' ? 'x' : 'y'; // in overlay mode make a separate group for each trace // otherwise collect all traces of the same subplot & orientation - group = isOverlay ? traceOut.uid : (traceOut.xaxis + traceOut.yaxis + binDirection); - traceOut._groupName = group; - + group = traceOut._groupName = isOverlay ? traceOut.uid : ( + getAxisGroup(fullLayout, traceOut.xaxis) + + getAxisGroup(fullLayout, traceOut.yaxis) + + binDirection + ); binOpts = allBinOpts[group]; if(binOpts) { binOpts.traces.push(traceOut); - } - else { + } else { binOpts = allBinOpts[group] = { traces: [traceOut], direction: binDirection }; } + + handleGroupingDefaults(traceOut._input, traceOut, fullLayout, coerce); } for(group in allBinOpts) { @@ -75352,7 +76087,7 @@ module.exports = function crossTraceDefaults(fullData, fullLayout) { } }; -},{"../../lib":168,"./attributes":331}],339:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axis_ids":215,"../bar/defaults":270,"./attributes":330}],338:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75361,7 +76096,6 @@ module.exports = function crossTraceDefaults(fullData, fullLayout) { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Registry = _dereq_('../../registry'); @@ -75386,6 +76120,8 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } coerce('text'); + coerce('hovertext'); + coerce('hovertemplate'); var orientation = coerce('orientation', (y && !x) ? 'h' : 'v'); var sampleLetter = orientation === 'v' ? 'x' : 'y'; @@ -75413,8 +76149,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // autobin(x|y) are only included here to appease Plotly.validate coerce('autobin' + sampleLetter); - coerce('hovertemplate'); - handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout); Lib.coerceSelectionMarkerOpacity(traceOut, coerce); @@ -75427,7 +76161,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'}); }; -},{"../../components/color":51,"../../lib":168,"../../registry":257,"../bar/style_defaults":281,"./attributes":331}],340:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../../registry":256,"../bar/style_defaults":280,"./attributes":330}],339:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75443,6 +76177,9 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { out.x = 'xVal' in pt ? pt.xVal : pt.x; out.y = 'yVal' in pt ? pt.yVal : pt.y; + // for 2d histograms + if('zLabelVal' in pt) out.z = pt.zLabelVal; + if(pt.xa) out.xaxis = pt.xa; if(pt.ya) out.yaxis = pt.ya; @@ -75473,7 +76210,7 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { return out; }; -},{}],341:[function(_dereq_,module,exports){ +},{}],340:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75508,7 +76245,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { return pts; }; -},{"../../plots/cartesian/axes":212,"../bar/hover":273}],342:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/axes":212,"../bar/hover":272}],341:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75562,7 +76299,7 @@ Histogram.meta = { module.exports = Histogram; -},{"../../plots/cartesian":224,"../bar/cross_trace_calc":270,"../bar/layout_attributes":275,"../bar/layout_defaults":276,"../bar/plot":277,"../bar/select":278,"../bar/style":280,"../scatter/marker_colorbar":385,"./attributes":331,"./calc":336,"./cross_trace_defaults":338,"./defaults":339,"./event_data":340,"./hover":341}],343:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"../bar/cross_trace_calc":269,"../bar/layout_attributes":274,"../bar/layout_defaults":275,"../bar/plot":276,"../bar/select":277,"../bar/style":279,"../scatter/marker_colorbar":384,"./attributes":330,"./calc":335,"./cross_trace_defaults":337,"./defaults":338,"./event_data":339,"./hover":340}],342:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75597,7 +76334,7 @@ module.exports = { } }; -},{}],344:[function(_dereq_,module,exports){ +},{}],343:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75611,6 +76348,7 @@ module.exports = { var histogramAttrs = _dereq_('../histogram/attributes'); var makeBinAttrs = _dereq_('../histogram/bin_attributes'); var heatmapAttrs = _dereq_('../heatmap/attributes'); +var hovertemplateAttrs = _dereq_('../../components/fx/hovertemplate_attributes'); var colorscaleAttrs = _dereq_('../../components/colorscale/attributes'); var colorbarAttrs = _dereq_('../../components/colorbar/attributes'); @@ -75647,7 +76385,8 @@ module.exports = extendFlat( xgap: heatmapAttrs.xgap, ygap: heatmapAttrs.ygap, zsmooth: heatmapAttrs.zsmooth, - zhoverformat: heatmapAttrs.zhoverformat + zhoverformat: heatmapAttrs.zhoverformat, + hovertemplate: hovertemplateAttrs({}, {keys: 'z'}) }, colorscaleAttrs('', { cLetter: 'z', @@ -75656,7 +76395,7 @@ module.exports = extendFlat( { colorbar: colorbarAttrs } ); -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../lib/extend":162,"../heatmap/attributes":316,"../histogram/attributes":331,"../histogram/bin_attributes":333}],345:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../heatmap/attributes":315,"../histogram/attributes":330,"../histogram/bin_attributes":332}],344:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75921,7 +76660,7 @@ function getRanges(edges, uniqueVals, gapLow, gapHigh, ax, calendar) { return out; } -},{"../../lib":168,"../../plots/cartesian/axes":212,"../histogram/average":332,"../histogram/bin_functions":334,"../histogram/bin_label_vals":335,"../histogram/norm_functions":343}],346:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../histogram/average":331,"../histogram/bin_functions":333,"../histogram/bin_label_vals":334,"../histogram/norm_functions":342}],345:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76016,7 +76755,7 @@ function cleanBins(trace, binDirection, fullLayout, autoBins) { } } -},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axis_ids":215,"./attributes":344,"fast-isnumeric":18}],347:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axis_ids":215,"./attributes":343,"fast-isnumeric":18}],346:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76048,9 +76787,10 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout colorscaleDefaults( traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'} ); + coerce('hovertemplate'); }; -},{"../../components/colorscale/defaults":61,"../../lib":168,"../heatmap/style_defaults":329,"./attributes":344,"./sample_defaults":350}],348:[function(_dereq_,module,exports){ +},{"../../components/colorscale/defaults":61,"../../lib":168,"../heatmap/style_defaults":328,"./attributes":343,"./sample_defaults":349}],347:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76084,7 +76824,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay return pts; }; -},{"../../plots/cartesian/axes":212,"../heatmap/hover":323}],349:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/axes":212,"../heatmap/hover":322}],348:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76120,7 +76860,7 @@ Histogram2D.meta = { module.exports = Histogram2D; -},{"../../plots/cartesian":224,"../heatmap/calc":317,"../heatmap/colorbar":319,"../heatmap/plot":327,"../heatmap/style":328,"../histogram/event_data":340,"./attributes":344,"./cross_trace_defaults":346,"./defaults":347,"./hover":348}],350:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"../heatmap/calc":316,"../heatmap/colorbar":318,"../heatmap/plot":326,"../heatmap/style":327,"../histogram/event_data":339,"./attributes":343,"./cross_trace_defaults":345,"./defaults":346,"./hover":347}],349:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76165,7 +76905,7 @@ module.exports = function handleSampleDefaults(traceIn, traceOut, coerce, layout coerce('autobiny'); }; -},{"../../lib":168,"../../registry":257}],351:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],350:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76202,7 +76942,8 @@ module.exports = extendFlat({ ncontours: contourAttrs.ncontours, contours: contourAttrs.contours, line: contourAttrs.line, - zhoverformat: histogram2dAttrs.zhoverformat + zhoverformat: histogram2dAttrs.zhoverformat, + hovertemplate: histogram2dAttrs.hovertemplate }, colorscaleAttrs('', { cLetter: 'z', @@ -76211,7 +76952,7 @@ module.exports = extendFlat({ { colorbar: colorbarAttrs } ); -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../lib/extend":162,"../contour/attributes":294,"../histogram2d/attributes":344}],352:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../lib/extend":162,"../contour/attributes":293,"../histogram2d/attributes":343}],351:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76245,9 +76986,10 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout handleContoursDefaults(traceIn, traceOut, coerce, coerce2); handleStyleDefaults(traceIn, traceOut, coerce, layout); + coerce('hovertemplate'); }; -},{"../../lib":168,"../contour/contours_defaults":301,"../contour/style_defaults":315,"../histogram2d/sample_defaults":350,"./attributes":351}],353:[function(_dereq_,module,exports){ +},{"../../lib":168,"../contour/contours_defaults":300,"../contour/style_defaults":314,"../histogram2d/sample_defaults":349,"./attributes":350}],352:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76282,7 +77024,7 @@ Histogram2dContour.meta = { module.exports = Histogram2dContour; -},{"../../plots/cartesian":224,"../contour/calc":295,"../contour/colorbar":297,"../contour/hover":307,"../contour/plot":312,"../contour/style":314,"../histogram2d/cross_trace_defaults":346,"./attributes":351,"./defaults":352}],354:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"../contour/calc":294,"../contour/colorbar":296,"../contour/hover":306,"../contour/plot":311,"../contour/style":313,"../histogram2d/cross_trace_defaults":345,"./attributes":350,"./defaults":351}],353:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76534,7 +77276,7 @@ module.exports = { } }; -},{"../../components/color/attributes":50,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/attributes":209,"../../plots/domain":238,"../../plots/font_attributes":239}],355:[function(_dereq_,module,exports){ +},{"../../components/color/attributes":50,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/attributes":209,"../../plots/domain":237,"../../plots/font_attributes":238}],354:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76553,8 +77295,7 @@ exports.name = 'pie'; exports.plot = function(gd) { var Pie = Registry.getModule('pie'); var cdPie = getModuleCalcData(gd.calcdata, Pie)[0]; - - if(cdPie.length) Pie.plot(gd, cdPie); + Pie.plot(gd, cdPie); }; exports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout) { @@ -76566,7 +77307,7 @@ exports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout) } }; -},{"../../plots/get_data":241,"../../registry":257}],356:[function(_dereq_,module,exports){ +},{"../../plots/get_data":240,"../../registry":256}],355:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76584,14 +77325,15 @@ var tinycolor = _dereq_('tinycolor2'); var Color = _dereq_('../../components/color'); var helpers = _dereq_('./helpers'); -exports.calc = function calc(gd, trace) { +var pieExtendedColorWays = {}; + +function calc(gd, trace) { var vals = trace.values; var hasVals = isArrayOrTypedArray(vals) && vals.length; var labels = trace.labels; var colors = trace.marker.colors || []; var cd = []; var fullLayout = gd._fullLayout; - var colorMap = fullLayout._piecolormap; var allThisTraceLabels = {}; var vTotal = 0; var hiddenLabels = fullLayout.hiddenlabels || []; @@ -76605,18 +77347,7 @@ exports.calc = function calc(gd, trace) { } } - function pullColor(color, label) { - if(!color) return false; - - color = tinycolor(color); - if(!color.isValid()) return false; - - color = Color.addOpacity(color, color.getAlpha()); - if(!colorMap[label]) colorMap[label] = color; - - return color; - } - + var pullColor = makePullColorFn(fullLayout._piecolormap); var seriesLen = (hasVals ? vals : labels).length; for(i = 0; i < seriesLen; i++) { @@ -76690,7 +77421,21 @@ exports.calc = function calc(gd, trace) { } return cd; -}; +} + +function makePullColorFn(colorMap) { + return function pullColor(color, id) { + if(!color) return false; + + color = tinycolor(color); + if(!color.isValid()) return false; + + color = Color.addOpacity(color, color.getAlpha()); + if(!colorMap[id]) colorMap[id] = color; + + return color; + }; +} /* * `calc` filled in (and collated) explicit colors. @@ -76699,45 +77444,41 @@ exports.calc = function calc(gd, trace) { * This is done after sorting, so we pick defaults * in the order slices will be displayed */ -exports.crossTraceCalc = function(gd) { +function crossTraceCalc(gd) { var fullLayout = gd._fullLayout; var calcdata = gd.calcdata; var pieColorWay = fullLayout.piecolorway; var colorMap = fullLayout._piecolormap; if(fullLayout.extendpiecolors) { - pieColorWay = generateExtendedColors(pieColorWay); + pieColorWay = generateExtendedColors(pieColorWay, pieExtendedColorWays); } var dfltColorCount = 0; - var i, j, cd, pt; - for(i = 0; i < calcdata.length; i++) { - cd = calcdata[i]; + for(var i = 0; i < calcdata.length; i++) { + var cd = calcdata[i]; if(cd[0].trace.type !== 'pie') continue; - for(j = 0; j < cd.length; j++) { - pt = cd[j]; + for(var j = 0; j < cd.length; j++) { + var pt = cd[j]; if(pt.color === false) { // have we seen this label and assigned a color to it in a previous trace? if(colorMap[pt.label]) { pt.color = colorMap[pt.label]; - } - else { + } else { colorMap[pt.label] = pt.color = pieColorWay[dfltColorCount % pieColorWay.length]; dfltColorCount++; } } } } -}; +} /** * pick a default color from the main default set, augmented by * itself lighter then darker before repeating */ -var extendedColorWays = {}; - -function generateExtendedColors(colorList) { +function generateExtendedColors(colorList, extendedColorWays) { var i; var colorString = JSON.stringify(colorList); var pieColors = extendedColorWays[colorString]; @@ -76757,7 +77498,15 @@ function generateExtendedColors(colorList) { return pieColors; } -},{"../../components/color":51,"../../lib":168,"./helpers":359,"fast-isnumeric":18,"tinycolor2":34}],357:[function(_dereq_,module,exports){ +module.exports = { + calc: calc, + crossTraceCalc: crossTraceCalc, + + makePullColorFn: makePullColorFn, + generateExtendedColors: generateExtendedColors +}; + +},{"../../components/color":51,"../../lib":168,"./helpers":358,"fast-isnumeric":18,"tinycolor2":34}],356:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76851,7 +77600,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('pull'); }; -},{"../../lib":168,"../../plots/domain":238,"./attributes":354}],358:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/domain":237,"./attributes":353}],357:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76896,7 +77645,7 @@ module.exports = function eventData(pt, trace) { return out; }; -},{"../../components/fx/helpers":86}],359:[function(_dereq_,module,exports){ +},{"../../components/fx/helpers":86}],358:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76938,7 +77687,7 @@ exports.castOption = function castOption(item, indices) { else if(item) return item; }; -},{"../../lib":168}],360:[function(_dereq_,module,exports){ +},{"../../lib":168}],359:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76960,7 +77709,7 @@ var calcModule = _dereq_('./calc'); Pie.calc = calcModule.calc; Pie.crossTraceCalc = calcModule.crossTraceCalc; -Pie.plot = _dereq_('./plot'); +Pie.plot = _dereq_('./plot').plot; Pie.style = _dereq_('./style'); Pie.styleOne = _dereq_('./style_one'); @@ -76974,7 +77723,7 @@ Pie.meta = { module.exports = Pie; -},{"./attributes":354,"./base_plot":355,"./calc":356,"./defaults":357,"./layout_attributes":361,"./layout_defaults":362,"./plot":363,"./style":364,"./style_one":365}],361:[function(_dereq_,module,exports){ +},{"./attributes":353,"./base_plot":354,"./calc":355,"./defaults":356,"./layout_attributes":360,"./layout_defaults":361,"./plot":362,"./style":363,"./style_one":364}],360:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77010,7 +77759,7 @@ module.exports = { } }; -},{}],362:[function(_dereq_,module,exports){ +},{}],361:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77034,7 +77783,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) { coerce('extendpiecolors'); }; -},{"../../lib":168,"./layout_attributes":361}],363:[function(_dereq_,module,exports){ +},{"../../lib":168,"./layout_attributes":360}],362:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77056,7 +77805,7 @@ var svgTextUtils = _dereq_('../../lib/svg_text_utils'); var helpers = _dereq_('./helpers'); var eventData = _dereq_('./event_data'); -module.exports = function plot(gd, cdpie) { +function plot(gd, cdpie) { var fullLayout = gd._fullLayout; prerenderTitles(cdpie, gd); @@ -77103,139 +77852,11 @@ module.exports = function plot(gd, cdpie) { var sliceTop = d3.select(this); var slicePath = sliceTop.selectAll('path.surface').data([pt]); - // hover state vars - // have we drawn a hover label, so it should be cleared later - var hasHoverLabel = false; - // have we emitted a hover event, so later an unhover event should be emitted - // note that click events do not depend on this - you can still get them - // with hovermode: false or if you were earlier dragging, then clicked - // in the same slice that you moused up in - var hasHoverEvent = false; - - function handleMouseOver() { - // in case fullLayout or fullData has changed without a replot - var fullLayout2 = gd._fullLayout; - var trace2 = gd._fullData[trace.index]; - - if(gd._dragging || fullLayout2.hovermode === false) return; - - var hoverinfo = trace2.hoverinfo; - if(Array.isArray(hoverinfo)) { - // super hacky: we need to pull out the *first* hoverinfo from - // pt.pts, then put it back into an array in a dummy trace - // and call castHoverinfo on that. - // TODO: do we want to have Fx.castHoverinfo somehow handle this? - // it already takes an array for index, for 2D, so this seems tricky. - hoverinfo = Fx.castHoverinfo({ - hoverinfo: [helpers.castOption(hoverinfo, pt.pts)], - _module: trace._module - }, fullLayout2, 0); - } - - if(hoverinfo === 'all') hoverinfo = 'label+text+value+percent+name'; - - // in case we dragged over the pie from another subplot, - // or if hover is turned off - if(trace2.hovertemplate || (hoverinfo !== 'none' && hoverinfo !== 'skip' && hoverinfo)) { - var rInscribed = getInscribedRadiusFraction(pt, cd0); - var hoverCenterX = cx + pt.pxmid[0] * (1 - rInscribed); - var hoverCenterY = cy + pt.pxmid[1] * (1 - rInscribed); - var separators = fullLayout.separators; - var thisText = []; - - if(hoverinfo && hoverinfo.indexOf('label') !== -1) thisText.push(pt.label); - pt.text = helpers.castOption(trace2.hovertext || trace2.text, pt.pts); - if(hoverinfo && hoverinfo.indexOf('text') !== -1) { - var texti = pt.text; - if(texti) thisText.push(texti); - } - pt.value = pt.v; - pt.valueLabel = helpers.formatPieValue(pt.v, separators); - if(hoverinfo && hoverinfo.indexOf('value') !== -1) thisText.push(pt.valueLabel); - pt.percent = pt.v / cd0.vTotal; - pt.percentLabel = helpers.formatPiePercent(pt.percent, separators); - if(hoverinfo && hoverinfo.indexOf('percent') !== -1) thisText.push(pt.percentLabel); - - var hoverLabel = trace.hoverlabel; - var hoverFont = hoverLabel.font; - - Fx.loneHover({ - x0: hoverCenterX - rInscribed * cd0.r, - x1: hoverCenterX + rInscribed * cd0.r, - y: hoverCenterY, - text: thisText.join('
'), - name: (trace2.hovertemplate || hoverinfo.indexOf('name') !== -1) ? trace2.name : undefined, - idealAlign: pt.pxmid[0] < 0 ? 'left' : 'right', - color: helpers.castOption(hoverLabel.bgcolor, pt.pts) || pt.color, - borderColor: helpers.castOption(hoverLabel.bordercolor, pt.pts), - fontFamily: helpers.castOption(hoverFont.family, pt.pts), - fontSize: helpers.castOption(hoverFont.size, pt.pts), - fontColor: helpers.castOption(hoverFont.color, pt.pts), - - trace: trace2, - hovertemplate: helpers.castOption(trace2.hovertemplate, pt.pts), - hovertemplateLabels: pt, - eventData: [eventData(pt, trace2)] - }, { - container: fullLayout2._hoverlayer.node(), - outerContainer: fullLayout2._paper.node(), - gd: gd - }); - - hasHoverLabel = true; - } - - gd.emit('plotly_hover', { - points: [eventData(pt, trace2)], - event: d3.event - }); - hasHoverEvent = true; - } - - function handleMouseOut(evt) { - var fullLayout2 = gd._fullLayout; - var trace2 = gd._fullData[trace.index]; - - if(hasHoverEvent) { - evt.originalEvent = d3.event; - gd.emit('plotly_unhover', { - points: [eventData(pt, trace2)], - event: d3.event - }); - hasHoverEvent = false; - } - - if(hasHoverLabel) { - Fx.loneUnhover(fullLayout2._hoverlayer.node()); - hasHoverLabel = false; - } - } - - function handleClick() { - // TODO: this does not support right-click. If we want to support it, we - // would likely need to change pie to use dragElement instead of straight - // mapbox event binding. Or perhaps better, make a simple wrapper with the - // right mousedown, mousemove, and mouseup handlers just for a left/right click - // mapbox would use this too. - var fullLayout2 = gd._fullLayout; - var trace2 = gd._fullData[trace.index]; - - if(gd._dragging || fullLayout2.hovermode === false) return; - - gd._hoverdata = [eventData(pt, trace2)]; - Fx.click(gd, d3.event); - } - slicePath.enter().append('path') .classed('surface', true) .style({'pointer-events': 'all'}); - sliceTop.select('path.textline').remove(); - - sliceTop - .on('mouseover', handleMouseOver) - .on('mouseout', handleMouseOut) - .on('click', handleClick); + sliceTop.call(attachFxHandlers, gd, cd); if(trace.pull) { var pull = +helpers.castOption(trace.pull, pt.pts) || 0; @@ -77268,7 +77889,6 @@ module.exports = function plot(gd, cdpie) { } else slicePath.attr('d', outerCircle); } else { - var outerArc = arc(pt.px0, pt.px1, true, 1); if(hole) { @@ -77400,50 +78020,8 @@ module.exports = function plot(gd, cdpie) { // now make sure no labels overlap (at least within one pie) if(hasOutsideText) scootLabels(quadrants, trace); - slices.each(function(pt) { - if(pt.labelExtraX || pt.labelExtraY) { - // first move the text to its new location - var sliceTop = d3.select(this); - var sliceText = sliceTop.select('g.slicetext text'); - sliceText.attr('transform', 'translate(' + pt.labelExtraX + ',' + pt.labelExtraY + ')' + - sliceText.attr('transform')); - - // then add a line to the new location - var lineStartX = pt.cxFinal + pt.pxmid[0]; - var lineStartY = pt.cyFinal + pt.pxmid[1]; - var textLinePath = 'M' + lineStartX + ',' + lineStartY; - var finalX = (pt.yLabelMax - pt.yLabelMin) * (pt.pxmid[0] < 0 ? -1 : 1) / 4; - - if(pt.labelExtraX) { - var yFromX = pt.labelExtraX * pt.pxmid[1] / pt.pxmid[0]; - var yNet = pt.yLabelMid + pt.labelExtraY - (pt.cyFinal + pt.pxmid[1]); - - if(Math.abs(yFromX) > Math.abs(yNet)) { - textLinePath += - 'l' + (yNet * pt.pxmid[0] / pt.pxmid[1]) + ',' + yNet + - 'H' + (lineStartX + pt.labelExtraX + finalX); - } else { - textLinePath += 'l' + pt.labelExtraX + ',' + yFromX + - 'v' + (yNet - yFromX) + - 'h' + finalX; - } - } else { - textLinePath += - 'V' + (pt.yLabelMid + pt.labelExtraY) + - 'h' + finalX; - } - - sliceTop.append('path') - .classed('textline', true) - .call(Color.stroke, trace.outsidetextfont.color) - .attr({ - 'stroke-width': Math.min(2, trace.outsidetextfont.size / 8), - d: textLinePath, - fill: 'none' - }); - } - }); + plotTextLines(slices, trace); }); }); @@ -77459,7 +78037,189 @@ module.exports = function plot(gd, cdpie) { if(s.attr('dy')) s.attr('dy', s.attr('dy')); }); }, 0); -}; +} + +// TODO add support for transition +function plotTextLines(slices, trace) { + slices.each(function(pt) { + var sliceTop = d3.select(this); + + if(!pt.labelExtraX && !pt.labelExtraY) { + sliceTop.select('path.textline').remove(); + return; + } + + // first move the text to its new location + var sliceText = sliceTop.select('g.slicetext text'); + + sliceText.attr('transform', 'translate(' + pt.labelExtraX + ',' + pt.labelExtraY + ')' + + sliceText.attr('transform')); + + // then add a line to the new location + var lineStartX = pt.cxFinal + pt.pxmid[0]; + var lineStartY = pt.cyFinal + pt.pxmid[1]; + var textLinePath = 'M' + lineStartX + ',' + lineStartY; + var finalX = (pt.yLabelMax - pt.yLabelMin) * (pt.pxmid[0] < 0 ? -1 : 1) / 4; + + if(pt.labelExtraX) { + var yFromX = pt.labelExtraX * pt.pxmid[1] / pt.pxmid[0]; + var yNet = pt.yLabelMid + pt.labelExtraY - (pt.cyFinal + pt.pxmid[1]); + + if(Math.abs(yFromX) > Math.abs(yNet)) { + textLinePath += + 'l' + (yNet * pt.pxmid[0] / pt.pxmid[1]) + ',' + yNet + + 'H' + (lineStartX + pt.labelExtraX + finalX); + } else { + textLinePath += 'l' + pt.labelExtraX + ',' + yFromX + + 'v' + (yNet - yFromX) + + 'h' + finalX; + } + } else { + textLinePath += + 'V' + (pt.yLabelMid + pt.labelExtraY) + + 'h' + finalX; + } + + Lib.ensureSingle(sliceTop, 'path', 'textline') + .call(Color.stroke, trace.outsidetextfont.color) + .attr({ + 'stroke-width': Math.min(2, trace.outsidetextfont.size / 8), + d: textLinePath, + fill: 'none' + }); + }); +} + +function attachFxHandlers(sliceTop, gd, cd) { + var cd0 = cd[0]; + var trace = cd0.trace; + var cx = cd0.cx; + var cy = cd0.cy; + + // hover state vars + // have we drawn a hover label, so it should be cleared later + if(!('_hasHoverLabel' in trace)) trace._hasHoverLabel = false; + // have we emitted a hover event, so later an unhover event should be emitted + // note that click events do not depend on this - you can still get them + // with hovermode: false or if you were earlier dragging, then clicked + // in the same slice that you moused up in + if(!('_hasHoverEvent' in trace)) trace._hasHoverEvent = false; + + sliceTop.on('mouseover', function(pt) { + // in case fullLayout or fullData has changed without a replot + var fullLayout2 = gd._fullLayout; + var trace2 = gd._fullData[trace.index]; + + if(gd._dragging || fullLayout2.hovermode === false) return; + + var hoverinfo = trace2.hoverinfo; + if(Array.isArray(hoverinfo)) { + // super hacky: we need to pull out the *first* hoverinfo from + // pt.pts, then put it back into an array in a dummy trace + // and call castHoverinfo on that. + // TODO: do we want to have Fx.castHoverinfo somehow handle this? + // it already takes an array for index, for 2D, so this seems tricky. + hoverinfo = Fx.castHoverinfo({ + hoverinfo: [helpers.castOption(hoverinfo, pt.pts)], + _module: trace._module + }, fullLayout2, 0); + } + + if(hoverinfo === 'all') hoverinfo = 'label+text+value+percent+name'; + + // in case we dragged over the pie from another subplot, + // or if hover is turned off + if(trace2.hovertemplate || (hoverinfo !== 'none' && hoverinfo !== 'skip' && hoverinfo)) { + var rInscribed = pt.rInscribed; + var hoverCenterX = cx + pt.pxmid[0] * (1 - rInscribed); + var hoverCenterY = cy + pt.pxmid[1] * (1 - rInscribed); + var separators = fullLayout2.separators; + var thisText = []; + + if(hoverinfo && hoverinfo.indexOf('label') !== -1) thisText.push(pt.label); + pt.text = helpers.castOption(trace2.hovertext || trace2.text, pt.pts); + if(hoverinfo && hoverinfo.indexOf('text') !== -1) { + var texti = pt.text; + if(texti) thisText.push(texti); + } + pt.value = pt.v; + pt.valueLabel = helpers.formatPieValue(pt.v, separators); + if(hoverinfo && hoverinfo.indexOf('value') !== -1) thisText.push(pt.valueLabel); + pt.percent = pt.v / cd0.vTotal; + pt.percentLabel = helpers.formatPiePercent(pt.percent, separators); + if(hoverinfo && hoverinfo.indexOf('percent') !== -1) thisText.push(pt.percentLabel); + + var hoverLabel = trace.hoverlabel; + var hoverFont = hoverLabel.font; + + Fx.loneHover({ + x0: hoverCenterX - rInscribed * cd0.r, + x1: hoverCenterX + rInscribed * cd0.r, + y: hoverCenterY, + text: thisText.join('
'), + name: (trace2.hovertemplate || hoverinfo.indexOf('name') !== -1) ? trace2.name : undefined, + idealAlign: pt.pxmid[0] < 0 ? 'left' : 'right', + color: helpers.castOption(hoverLabel.bgcolor, pt.pts) || pt.color, + borderColor: helpers.castOption(hoverLabel.bordercolor, pt.pts), + fontFamily: helpers.castOption(hoverFont.family, pt.pts), + fontSize: helpers.castOption(hoverFont.size, pt.pts), + fontColor: helpers.castOption(hoverFont.color, pt.pts), + + trace: trace2, + hovertemplate: helpers.castOption(trace2.hovertemplate, pt.pts), + hovertemplateLabels: pt, + eventData: [eventData(pt, trace2)] + }, { + container: fullLayout2._hoverlayer.node(), + outerContainer: fullLayout2._paper.node(), + gd: gd + }); + + trace._hasHoverLabel = true; + } + + trace._hasHoverEvent = true; + gd.emit('plotly_hover', { + points: [eventData(pt, trace2)], + event: d3.event + }); + }); + + sliceTop.on('mouseout', function(evt) { + var fullLayout2 = gd._fullLayout; + var trace2 = gd._fullData[trace.index]; + var pt = d3.select(this).datum(); + + if(trace._hasHoverEvent) { + evt.originalEvent = d3.event; + gd.emit('plotly_unhover', { + points: [eventData(pt, trace2)], + event: d3.event + }); + trace._hasHoverEvent = false; + } + + if(trace._hasHoverLabel) { + Fx.loneUnhover(fullLayout2._hoverlayer.node()); + trace._hasHoverLabel = false; + } + }); + + sliceTop.on('click', function(pt) { + // TODO: this does not support right-click. If we want to support it, we + // would likely need to change pie to use dragElement instead of straight + // mapbox event binding. Or perhaps better, make a simple wrapper with the + // right mousedown, mousemove, and mouseup handlers just for a left/right click + // mapbox would use this too. + var fullLayout2 = gd._fullLayout; + var trace2 = gd._fullData[trace.index]; + + if(gd._dragging || fullLayout2.hovermode === false) return; + + gd._hoverdata = [eventData(pt, trace2)]; + Fx.click(gd, d3.event); + }); +} function determineOutsideTextFont(trace, pt, layoutFont) { var color = helpers.castOption(trace.outsidetextfont.color, pt.pts) || @@ -77484,7 +78244,6 @@ function determineOutsideTextFont(trace, pt, layoutFont) { function determineInsideTextFont(trace, pt, layoutFont) { var customColor = helpers.castOption(trace.insidetextfont.color, pt.pts); if(!customColor && trace._input.textfont) { - // Why not simply using trace.textfont? Because if not set, it // defaults to layout.font which has a default color. But if // textfont.color and insidetextfont.color don't supply a value, @@ -77539,16 +78298,17 @@ function prerenderTitles(cdpie, gd) { function transformInsideText(textBB, pt, cd0) { var textDiameter = Math.sqrt(textBB.width * textBB.width + textBB.height * textBB.height); var textAspect = textBB.width / textBB.height; - var halfAngle = Math.PI * Math.min(pt.v / cd0.vTotal, 0.5); - var ring = 1 - cd0.trace.hole; - var rInscribed = getInscribedRadiusFraction(pt, cd0); + var halfAngle = pt.halfangle; + var ring = pt.ring; + var rInscribed = pt.rInscribed; + var r = cd0.r || pt.rpx1; // max size text can be inserted inside without rotating it // this inscribes the text rectangle in a circle, which is then inscribed // in the slice, so it will be an underestimate, which some day we may want // to improve so this case can get more use var transform = { - scale: rInscribed * cd0.r * 2 / textDiameter, + scale: rInscribed * r * 2 / textDiameter, // and the center position and rotation in this case rCenter: 1 - rInscribed, @@ -77557,30 +78317,30 @@ function transformInsideText(textBB, pt, cd0) { if(transform.scale >= 1) return transform; - // max size if text is rotated radially + // max size if text is rotated radially var Qr = textAspect + 1 / (2 * Math.tan(halfAngle)); - var maxHalfHeightRotRadial = cd0.r * Math.min( + var maxHalfHeightRotRadial = r * Math.min( 1 / (Math.sqrt(Qr * Qr + 0.5) + Qr), ring / (Math.sqrt(textAspect * textAspect + ring / 2) + textAspect) ); var radialTransform = { scale: maxHalfHeightRotRadial * 2 / textBB.height, - rCenter: Math.cos(maxHalfHeightRotRadial / cd0.r) - - maxHalfHeightRotRadial * textAspect / cd0.r, + rCenter: Math.cos(maxHalfHeightRotRadial / r) - + maxHalfHeightRotRadial * textAspect / r, rotate: (180 / Math.PI * pt.midangle + 720) % 180 - 90 }; - // max size if text is rotated tangentially + // max size if text is rotated tangentially var aspectInv = 1 / textAspect; var Qt = aspectInv + 1 / (2 * Math.tan(halfAngle)); - var maxHalfWidthTangential = cd0.r * Math.min( + var maxHalfWidthTangential = r * Math.min( 1 / (Math.sqrt(Qt * Qt + 0.5) + Qt), ring / (Math.sqrt(aspectInv * aspectInv + ring / 2) + aspectInv) ); var tangentialTransform = { scale: maxHalfWidthTangential * 2 / textBB.width, - rCenter: Math.cos(maxHalfWidthTangential / cd0.r) - - maxHalfWidthTangential / textAspect / cd0.r, + rCenter: Math.cos(maxHalfWidthTangential / r) - + maxHalfWidthTangential / textAspect / r, rotate: (180 / Math.PI * pt.midangle + 810) % 180 - 90 }; // if we need a rotated transform, pick the biggest one @@ -77595,8 +78355,7 @@ function transformInsideText(textBB, pt, cd0) { function getInscribedRadiusFraction(pt, cd0) { if(pt.v === cd0.vTotal && !cd0.trace.hole) return 1;// special case of 100% with no hole - var halfAngle = Math.PI * Math.min(pt.v / cd0.vTotal, 0.5); - return Math.min(1 / (1 + 1 / Math.sin(halfAngle)), (1 - cd0.trace.hole) / 2); + return Math.min(1 / (1 + 1 / Math.sin(pt.halfangle)), pt.ring / 2); } function transformOutsideText(textBB, pt) { @@ -77749,7 +78508,6 @@ function scootLabels(quadrants, trace) { newExtraY = otherOuterY - thisInnerY - thisPt.labelExtraY; if(newExtraY * yDiffSign > 0) thisPt.labelExtraY += newExtraY; - } else if((thisOuterY + thisPt.labelExtraY - thisSliceOuterY) * yDiffSign > 0) { // farther from the equator - happens after we've done all the // vertical moving we're going to do @@ -77864,7 +78622,6 @@ function scalePies(cdpie, plotSize) { } } } - } function setCoords(cd) { @@ -77911,10 +78668,19 @@ function setCoords(cd) { cdi[lastPt] = currentCoords; cdi.largeArc = (cdi.v > cd0.vTotal / 2) ? 1 : 0; + + cdi.halfangle = Math.PI * Math.min(cdi.v / cd0.vTotal, 0.5); + cdi.ring = 1 - trace.hole; + cdi.rInscribed = getInscribedRadiusFraction(cdi, cd0); } } -},{"../../components/color":51,"../../components/drawing":72,"../../components/fx":90,"../../lib":168,"../../lib/svg_text_utils":189,"./event_data":358,"./helpers":359,"d3":16}],364:[function(_dereq_,module,exports){ +module.exports = { + plot: plot, + transformInsideText: transformInsideText +}; + +},{"../../components/color":51,"../../components/drawing":72,"../../components/fx":90,"../../lib":168,"../../lib/svg_text_utils":189,"./event_data":357,"./helpers":358,"d3":16}],363:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77943,7 +78709,7 @@ module.exports = function style(gd) { }); }; -},{"./style_one":365,"d3":16}],365:[function(_dereq_,module,exports){ +},{"./style_one":364,"d3":16}],364:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77967,7 +78733,7 @@ module.exports = function styleOne(s, pt, trace) { .call(Color.stroke, lineColor); }; -},{"../../components/color":51,"./helpers":359}],366:[function(_dereq_,module,exports){ +},{"../../components/color":51,"./helpers":358}],365:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77984,7 +78750,6 @@ var Lib = _dereq_('../../lib'); // arrayOk attributes, merge them into calcdata array module.exports = function arraysToCalcdata(cd, trace) { - // so each point knows which index it originally came from for(var i = 0; i < cd.length; i++) cd[i].i = i; @@ -78019,7 +78784,7 @@ module.exports = function arraysToCalcdata(cd, trace) { } }; -},{"../../lib":168}],367:[function(_dereq_,module,exports){ +},{"../../lib":168}],366:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78431,7 +79196,7 @@ module.exports = { } }; -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing":72,"../../components/drawing/attributes":71,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/font_attributes":239,"./constants":371}],368:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing":72,"../../components/drawing/attributes":71,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/font_attributes":238,"./constants":370}],367:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78472,8 +79237,9 @@ function calc(gd, trace) { var yAttr = 'y'; var posAttr; if(stackGroupOpts) { - stackGroupOpts.traceIndices.push(trace.index); + Lib.pushUnique(stackGroupOpts.traceIndices, trace._expandedIndex); isV = stackGroupOpts.orientation === 'v'; + // size, like we use for bar if(isV) { yAttr = 's'; @@ -78677,7 +79443,6 @@ function calcMarkerSize(trace, serieslen) { sizeOut[i] = markerTrans(s[i]); } return sizeOut; - } else { return markerTrans(marker.size); } @@ -78721,7 +79486,7 @@ module.exports = { getStackOpts: getStackOpts }; -},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"./arrays_to_calcdata":366,"./calc_selection":369,"./colorscale_calc":370,"./subtypes":391,"fast-isnumeric":18}],369:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"./arrays_to_calcdata":365,"./calc_selection":368,"./colorscale_calc":369,"./subtypes":390,"fast-isnumeric":18}],368:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78740,7 +79505,7 @@ module.exports = function calcSelection(cd, trace) { } }; -},{"../../lib":168}],370:[function(_dereq_,module,exports){ +},{"../../lib":168}],369:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78783,7 +79548,7 @@ module.exports = function calcMarkerColorscale(gd, trace) { } }; -},{"../../components/colorscale/calc":59,"../../components/colorscale/helpers":62,"./subtypes":391}],371:[function(_dereq_,module,exports){ +},{"../../components/colorscale/calc":59,"../../components/colorscale/helpers":62,"./subtypes":390}],370:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78812,7 +79577,7 @@ module.exports = { eventDataKeys: [] }; -},{}],372:[function(_dereq_,module,exports){ +},{}],371:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78995,7 +79760,7 @@ function getInterp(calcTrace, index, position, posAttr) { return pt0.s + (pt1.s - pt0.s) * (position - pt0[posAttr]) / (pt1[posAttr] - pt0[posAttr]); } -},{"./calc":368}],373:[function(_dereq_,module,exports){ +},{"./calc":367}],372:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79034,7 +79799,7 @@ module.exports = function crossTraceDefaults(fullData) { } }; -},{}],374:[function(_dereq_,module,exports){ +},{}],373:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79123,7 +79888,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; -},{"../../lib":168,"../../registry":257,"./attributes":367,"./constants":371,"./fillcolor_defaults":376,"./line_defaults":380,"./line_shape_defaults":382,"./marker_defaults":386,"./stack_defaults":389,"./subtypes":391,"./text_defaults":392,"./xy_defaults":393}],375:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"./attributes":366,"./constants":370,"./fillcolor_defaults":375,"./line_defaults":379,"./line_shape_defaults":381,"./marker_defaults":385,"./stack_defaults":388,"./subtypes":390,"./text_defaults":391,"./xy_defaults":392}],374:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79166,7 +79931,7 @@ function isValid(v) { return v || v === 0; } -},{"../../lib":168}],376:[function(_dereq_,module,exports){ +},{"../../lib":168}],375:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79204,7 +79969,7 @@ module.exports = function fillColorDefaults(traceIn, traceOut, defaultColor, coe )); }; -},{"../../components/color":51,"../../lib":168}],377:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168}],376:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79257,7 +80022,7 @@ module.exports = function getTraceColor(trace, di) { } }; -},{"../../components/color":51,"./subtypes":391}],378:[function(_dereq_,module,exports){ +},{"../../components/color":51,"./subtypes":390}],377:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79321,7 +80086,6 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { // skip the rest (for this trace) if we didn't find a close point if(pointData.index !== false) { - // the closest data point var di = cd[pointData.index]; var xc = xa.c2p(di.x, true); @@ -79439,7 +80203,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { y0: yAvg, y1: yAvg, color: color, - hovertemplate: '%{name}' + hovertemplate: false }); delete pointData.index; @@ -79454,7 +80218,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { } }; -},{"../../components/color":51,"../../components/fx":90,"../../lib":168,"../../registry":257,"./fill_hover_text":375,"./get_trace_color":377}],379:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/fx":90,"../../lib":168,"../../registry":256,"./fill_hover_text":374,"./get_trace_color":376}],378:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79501,7 +80265,7 @@ Scatter.meta = { module.exports = Scatter; -},{"../../plots/cartesian":224,"./arrays_to_calcdata":366,"./attributes":367,"./calc":368,"./cross_trace_calc":372,"./cross_trace_defaults":373,"./defaults":374,"./hover":378,"./marker_colorbar":385,"./plot":387,"./select":388,"./style":390,"./subtypes":391}],380:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"./arrays_to_calcdata":365,"./attributes":366,"./calc":367,"./cross_trace_calc":371,"./cross_trace_defaults":372,"./defaults":373,"./hover":377,"./marker_colorbar":384,"./plot":386,"./select":387,"./style":389,"./subtypes":390}],379:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79532,7 +80296,7 @@ module.exports = function lineDefaults(traceIn, traceOut, defaultColor, layout, if(!(opts || {}).noDash) coerce('line.dash'); }; -},{"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62,"../../lib":168}],381:[function(_dereq_,module,exports){ +},{"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62,"../../lib":168}],380:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79566,9 +80330,11 @@ module.exports = function linePoints(d, opts) { var baseTolerance = opts.baseTolerance; var shape = opts.shape; var linear = shape === 'linear'; + var fill = opts.fill && opts.fill !== 'none'; var segments = []; var minTolerance = constants.minTolerance; - var pts = new Array(d.length); + var len = d.length; + var pts = new Array(len); var pti = 0; var i; @@ -79695,8 +80461,10 @@ module.exports = function linePoints(d, opts) { var ptCount = 0; for(var i = 0; i < 4; i++) { var edge = edges[i]; - var ptInt = segmentsIntersect(pt1[0], pt1[1], pt2[0], pt2[1], - edge[0], edge[1], edge[2], edge[3]); + var ptInt = segmentsIntersect( + pt1[0], pt1[1], pt2[0], pt2[1], + edge[0], edge[1], edge[2], edge[3] + ); if(ptInt && (!ptCount || Math.abs(ptInt.x - out[0][0]) > 1 || Math.abs(ptInt.y - out[0][1]) > 1 @@ -79894,7 +80662,7 @@ module.exports = function linePoints(d, opts) { } // loop over ALL points in this trace - for(i = 0; i < d.length; i++) { + for(i = 0; i < len; i++) { clusterStartPt = getPt(i); if(!clusterStartPt) continue; @@ -79903,7 +80671,7 @@ module.exports = function linePoints(d, opts) { addPt(clusterStartPt); // loop over one segment of the trace - for(i++; i < d.length; i++) { + for(i++; i < len; i++) { clusterHighPt = getPt(i); if(!clusterHighPt) { if(connectGaps) continue; @@ -79922,7 +80690,9 @@ module.exports = function linePoints(d, opts) { clusterRefDist = ptDist(clusterHighPt, clusterStartPt); - if(clusterRefDist < getTolerance(clusterHighPt, nextPt) * minTolerance) continue; + // #3147 - always include the very first and last points for fills + if(!(fill && (pti === 0 || pti === len - 1)) && + clusterRefDist < getTolerance(clusterHighPt, nextPt) * minTolerance) continue; clusterUnitVector = [ (clusterHighPt[0] - clusterStartPt[0]) / clusterRefDist, @@ -79997,7 +80767,7 @@ module.exports = function linePoints(d, opts) { return segments; }; -},{"../../constants/numerical":149,"../../lib":168,"./constants":371}],382:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"./constants":370}],381:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80016,7 +80786,7 @@ module.exports = function handleLineShapeDefaults(traceIn, traceOut, coerce) { if(shape === 'spline') coerce('line.smoothing'); }; -},{}],383:[function(_dereq_,module,exports){ +},{}],382:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80109,7 +80879,7 @@ module.exports = function linkTraces(gd, plotinfo, cdscatter) { return cdscatterSorted; }; -},{}],384:[function(_dereq_,module,exports){ +},{}],383:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80151,7 +80921,7 @@ module.exports = function makeBubbleSizeFn(trace) { }; }; -},{"fast-isnumeric":18}],385:[function(_dereq_,module,exports){ +},{"fast-isnumeric":18}],384:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80169,7 +80939,7 @@ module.exports = { max: 'cmax' }; -},{}],386:[function(_dereq_,module,exports){ +},{}],385:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80251,7 +81021,7 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout } }; -},{"../../components/color":51,"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62,"./subtypes":391}],387:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62,"./subtypes":390}],386:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80437,7 +81207,6 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition ownFillEl3 = trace._ownFill; if(subTypes.hasLines(trace) || trace.fill !== 'none') { - if(tonext) { // This tells .style which trace to use for fill information: tonext.datum(cdscatter); @@ -80479,7 +81248,8 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition connectGaps: trace.connectgaps, baseTolerance: Math.max(line.width || 1, 3) / 4, shape: line.shape, - simplify: line.simplify + simplify: line.simplify, + fill: trace.fill }); // since we already have the pixel segments here, use them to make @@ -80823,7 +81593,7 @@ function selectMarkers(gd, idx, plotinfo, cdscatter, cdscatterAll) { }); } -},{"../../components/drawing":72,"../../lib":168,"../../lib/polygon":180,"../../registry":257,"./line_points":381,"./link_traces":383,"./subtypes":391,"d3":16}],388:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../lib":168,"../../lib/polygon":180,"../../registry":256,"./line_points":380,"./link_traces":382,"./subtypes":390,"d3":16}],387:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80878,7 +81648,7 @@ module.exports = function selectPoints(searchInfo, selectionTester) { return selection; }; -},{"./subtypes":391}],389:[function(_dereq_,module,exports){ +},{"./subtypes":390}],388:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80984,7 +81754,7 @@ module.exports = function handleStackDefaults(traceIn, traceOut, layout, coerce) } }; -},{}],390:[function(_dereq_,module,exports){ +},{}],389:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81056,7 +81826,7 @@ module.exports = { styleOnSelect: styleOnSelect }; -},{"../../components/drawing":72,"../../registry":257,"d3":16}],391:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../registry":256,"d3":16}],390:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81095,7 +81865,7 @@ module.exports = { } }; -},{"../../lib":168}],392:[function(_dereq_,module,exports){ +},{"../../lib":168}],391:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81125,7 +81895,7 @@ module.exports = function(traceIn, traceOut, layout, coerce, opts) { } }; -},{"../../lib":168}],393:[function(_dereq_,module,exports){ +},{"../../lib":168}],392:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81169,7 +81939,7 @@ module.exports = function handleXYDefaults(traceIn, traceOut, layout, coerce) { return len; }; -},{"../../lib":168,"../../registry":257}],394:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],393:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81274,7 +82044,7 @@ module.exports = { hovertemplate: hovertemplateAttrs(), }; -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing/attributes":71,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/attributes":209,"../scatter/attributes":367}],395:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing/attributes":71,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/attributes":209,"../scatter/attributes":366}],394:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81356,7 +82126,7 @@ module.exports = function calc(gd, trace) { return cd; }; -},{"../scatter/arrays_to_calcdata":366,"../scatter/calc":368,"../scatter/calc_selection":369,"../scatter/colorscale_calc":370,"fast-isnumeric":18}],396:[function(_dereq_,module,exports){ +},{"../scatter/arrays_to_calcdata":365,"../scatter/calc":367,"../scatter/calc_selection":368,"../scatter/colorscale_calc":369,"fast-isnumeric":18}],395:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81461,7 +82231,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; -},{"../../lib":168,"../scatter/constants":371,"../scatter/fillcolor_defaults":376,"../scatter/line_defaults":380,"../scatter/line_shape_defaults":382,"../scatter/marker_defaults":386,"../scatter/subtypes":391,"../scatter/text_defaults":392,"./attributes":394}],397:[function(_dereq_,module,exports){ +},{"../../lib":168,"../scatter/constants":370,"../scatter/fillcolor_defaults":375,"../scatter/line_defaults":379,"../scatter/line_shape_defaults":381,"../scatter/marker_defaults":385,"../scatter/subtypes":390,"../scatter/text_defaults":391,"./attributes":393}],396:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81493,7 +82263,7 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { return out; }; -},{}],398:[function(_dereq_,module,exports){ +},{}],397:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81564,7 +82334,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { return scatterPointData; }; -},{"../../plots/cartesian/axes":212,"../scatter/hover":378}],399:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/axes":212,"../scatter/hover":377}],398:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81599,7 +82369,7 @@ ScatterTernary.meta = { module.exports = ScatterTernary; -},{"../../plots/ternary":253,"../scatter/marker_colorbar":385,"../scatter/select":388,"../scatter/style":390,"./attributes":394,"./calc":395,"./defaults":396,"./event_data":397,"./hover":398,"./plot":400}],400:[function(_dereq_,module,exports){ +},{"../../plots/ternary":252,"../scatter/marker_colorbar":384,"../scatter/select":387,"../scatter/style":389,"./attributes":393,"./calc":394,"./defaults":395,"./event_data":396,"./hover":397,"./plot":399}],399:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81632,7 +82402,7 @@ module.exports = function plot(gd, ternary, moduleCalcData) { scatterPlot(gd, plotinfo, moduleCalcData, scatterLayer); }; -},{"../scatter/plot":387}],401:[function(_dereq_,module,exports){ +},{"../scatter/plot":386}],400:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81651,7 +82421,9 @@ module.exports = { x: boxAttrs.x, x0: boxAttrs.x0, y0: boxAttrs.y0, - name: boxAttrs.name, + name: extendFlat({}, boxAttrs.name, { + + }), orientation: extendFlat({}, boxAttrs.orientation, { }), @@ -81734,6 +82506,8 @@ module.exports = { marker: boxAttrs.marker, text: boxAttrs.text, + hovertext: boxAttrs.hovertext, + hovertemplate: boxAttrs.hovertemplate, box: { visible: { @@ -81810,6 +82584,9 @@ module.exports = { }, + offsetgroup: boxAttrs.offsetgroup, + alignmentgroup: boxAttrs.alignmentgroup, + selected: boxAttrs.selected, unselected: boxAttrs.unselected, @@ -81824,7 +82601,7 @@ module.exports = { } }; -},{"../../lib/extend":162,"../box/attributes":282}],402:[function(_dereq_,module,exports){ +},{"../../lib/extend":162,"../box/attributes":281}],401:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81864,24 +82641,32 @@ module.exports = function calc(gd, trace) { var bandwidth = cdi.bandwidth = calcBandwidth(trace, cdi, vals); var span = cdi.span = calcSpan(trace, cdi, valAxis, bandwidth); - // step that well covers the bandwidth and is multiple of span distance - var dist = span[1] - span[0]; - var n = Math.ceil(dist / (bandwidth / 3)); - var step = dist / n; + if(cdi.min === cdi.max && bandwidth === 0) { + // if span is zero and bandwidth is zero, we want a violin with zero width + span = cdi.span = [cdi.min, cdi.max]; + cdi.density = [{v: 1, t: span[0]}]; + cdi.bandwidth = bandwidth; + maxKDE = Math.max(maxKDE, 1); + } else { + // step that well covers the bandwidth and is multiple of span distance + var dist = span[1] - span[0]; + var n = Math.ceil(dist / (bandwidth / 3)); + var step = dist / n; - if(!isFinite(step) || !isFinite(n)) { - Lib.error('Something went wrong with computing the violin span'); - cd[0].t.empty = true; - return cd; - } + if(!isFinite(step) || !isFinite(n)) { + Lib.error('Something went wrong with computing the violin span'); + cd[0].t.empty = true; + return cd; + } - var kde = helpers.makeKDE(cdi, trace, vals); - cdi.density = new Array(n); + var kde = helpers.makeKDE(cdi, trace, vals); + cdi.density = new Array(n); - for(var k = 0, t = span[0]; t < (span[1] + step / 2); k++, t += step) { - var v = kde(t); - cdi.density[k] = {v: v, t: t}; - maxKDE = Math.max(maxKDE, v); + for(var k = 0, t = span[0]; t < (span[1] + step / 2); k++, t += step) { + var v = kde(t); + cdi.density[k] = {v: v, t: t}; + maxKDE = Math.max(maxKDE, v); + } } maxCount = Math.max(maxCount, vals.length); @@ -81927,8 +82712,16 @@ function silvermanRule(len, ssd, iqr) { function calcBandwidth(trace, cdi, vals) { var span = cdi.max - cdi.min; - // plot single-value violin with bandwidth of 1 - if(!span) return 1; + // If span is zero + if(!span) { + if(trace.bandwidth) { + return trace.bandwidth; + } else { + // if span is zero and no bandwidth is specified + // it returns zero bandwidth which is a special case + return 0; + } + } // Limit how small the bandwidth can be. // @@ -81984,7 +82777,7 @@ function calcSpan(trace, cdi, valAxis, bandwidth) { return spanOut; } -},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"../box/calc":283,"./helpers":405}],403:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"../box/calc":282,"./helpers":404}],402:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82027,7 +82820,7 @@ module.exports = function crossTraceCalc(gd, plotinfo) { } }; -},{"../box/cross_trace_calc":284}],404:[function(_dereq_,module,exports){ +},{"../box/cross_trace_calc":283}],403:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82088,7 +82881,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout if(!meanLineVisible) traceOut.meanline = {visible: false}; }; -},{"../../components/color":51,"../../lib":168,"../box/defaults":285,"./attributes":401}],405:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../box/defaults":284,"./attributes":400}],404:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82161,7 +82954,7 @@ exports.getKdeValue = function(calcItem, trace, valueDist) { exports.extractVal = function(o) { return o.v; }; -},{"../../lib":168}],406:[function(_dereq_,module,exports){ +},{"../../lib":168}],405:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82235,6 +83028,9 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay closeBoxData[0].spikeDistance = undefined; closeBoxData[0][spikePosAttr] = undefined; + // no hovertemplate support yet + kdePointData.hovertemplate = false; + closeData.push(kdePointData); violinLineAttrs = {stroke: pointData.color}; @@ -82270,7 +83066,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay return closeData; }; -},{"../../lib":168,"../../plots/cartesian/axes":212,"../box/hover":287,"./helpers":405}],407:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../box/hover":286,"./helpers":404}],406:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82285,6 +83081,7 @@ module.exports = { attributes: _dereq_('./attributes'), layoutAttributes: _dereq_('./layout_attributes'), supplyDefaults: _dereq_('./defaults'), + crossTraceDefaults: _dereq_('../box/defaults').crossTraceDefaults, supplyLayoutDefaults: _dereq_('./layout_defaults'), calc: _dereq_('./calc'), crossTraceCalc: _dereq_('./cross_trace_calc'), @@ -82303,7 +83100,7 @@ module.exports = { } }; -},{"../../plots/cartesian":224,"../box/select":292,"../scatter/style":390,"./attributes":401,"./calc":402,"./cross_trace_calc":403,"./defaults":404,"./hover":406,"./layout_attributes":408,"./layout_defaults":409,"./plot":410,"./style":411}],408:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"../box/defaults":284,"../box/select":291,"../scatter/style":389,"./attributes":400,"./calc":401,"./cross_trace_calc":402,"./defaults":403,"./hover":405,"./layout_attributes":407,"./layout_defaults":408,"./plot":409,"./style":410}],407:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82329,7 +83126,7 @@ module.exports = { }) }; -},{"../../lib":168,"../box/layout_attributes":289}],409:[function(_dereq_,module,exports){ +},{"../../lib":168,"../box/layout_attributes":288}],408:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82351,7 +83148,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { boxLayoutDefaults._supply(layoutIn, layoutOut, fullData, coerce, 'violin'); }; -},{"../../lib":168,"../box/layout_defaults":290,"./layout_attributes":408}],410:[function(_dereq_,module,exports){ +},{"../../lib":168,"../box/layout_defaults":289,"./layout_attributes":407}],409:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82542,7 +83339,7 @@ module.exports = function plot(gd, plotinfo, cdViolins, violinLayer) { }); }; -},{"../../components/drawing":72,"../../lib":168,"../box/plot":291,"../scatter/line_points":381,"./helpers":405,"d3":16}],411:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../lib":168,"../box/plot":290,"../scatter/line_points":380,"./helpers":404,"d3":16}],410:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82597,5 +83394,5 @@ module.exports = function style(gd, cd) { }); }; -},{"../../components/color":51,"../scatter/style":390,"d3":16}]},{},[11])(11) +},{"../../components/color":51,"../scatter/style":389,"d3":16}]},{},[11])(11) }); diff --git a/static/babybuddy/js/graph.531e69c82303.js.gz b/static/babybuddy/js/graph.531e69c82303.js.gz new file mode 100644 index 00000000..dcdde0a7 Binary files /dev/null and b/static/babybuddy/js/graph.531e69c82303.js.gz differ diff --git a/static/babybuddy/js/graph.9d17ed9a2576.js.gz b/static/babybuddy/js/graph.9d17ed9a2576.js.gz deleted file mode 100644 index cb6f2e06..00000000 Binary files a/static/babybuddy/js/graph.9d17ed9a2576.js.gz and /dev/null differ diff --git a/static/babybuddy/js/graph.js b/static/babybuddy/js/graph.js index 6e74d25a..6b0e54e8 100644 --- a/static/babybuddy/js/graph.js +++ b/static/babybuddy/js/graph.js @@ -1,5 +1,5 @@ /** -* plotly.js (cartesian) v1.44.4 +* plotly.js (cartesian) v1.46.0 * Copyright 2012-2019, Plotly, Inc. * All rights reserved. * Licensed under the MIT license @@ -38,16 +38,16 @@ var rules = { "X .cursor-n-resize": "cursor:n-resize;", "X .cursor-ne-resize": "cursor:ne-resize;", "X .cursor-grab": "cursor:-webkit-grab;cursor:grab;", - "X .modebar": "position:absolute;top:2px;right:2px;z-index:1001;", + "X .modebar": "position:absolute;top:2px;right:2px;", "X .ease-bg": "-webkit-transition:background-color 0.3s ease 0s;-moz-transition:background-color 0.3s ease 0s;-ms-transition:background-color 0.3s ease 0s;-o-transition:background-color 0.3s ease 0s;transition:background-color 0.3s ease 0s;", "X .modebar--hover>:not(.watermark)": "opacity:0;-webkit-transition:opacity 0.3s ease 0s;-moz-transition:opacity 0.3s ease 0s;-ms-transition:opacity 0.3s ease 0s;-o-transition:opacity 0.3s ease 0s;transition:opacity 0.3s ease 0s;", "X:hover .modebar--hover .modebar-group": "opacity:1;", - "X .modebar-group": "float:left;display:inline-block;box-sizing:border-box;margin-left:8px;position:relative;vertical-align:middle;white-space:nowrap;", + "X .modebar-group": "float:left;display:inline-block;box-sizing:border-box;padding-left:8px;position:relative;vertical-align:middle;white-space:nowrap;", "X .modebar-btn": "position:relative;font-size:16px;padding:3px 4px;height:22px;cursor:pointer;line-height:normal;box-sizing:border-box;", "X .modebar-btn svg": "position:relative;top:2px;", "X .modebar.vertical": "display:flex;flex-direction:column;flex-wrap:wrap;align-content:flex-end;max-height:100%;", "X .modebar.vertical svg": "top:-1px;", - "X .modebar.vertical .modebar-group": "display:block;float:none;margin-left:0px;margin-bottom:8px;", + "X .modebar.vertical .modebar-group": "display:block;float:none;padding-left:0px;padding-bottom:8px;", "X .modebar.vertical .modebar-group .modebar-btn": "display:block;text-align:center;", "X [data-title]:before,X [data-title]:after": "position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;", "X [data-title]:hover:before,X [data-title]:hover:after": "display:block;opacity:1;", @@ -215,7 +215,7 @@ module.exports = { module.exports = _dereq_('../src/traces/bar'); -},{"../src/traces/bar":274}],4:[function(_dereq_,module,exports){ +},{"../src/traces/bar":273}],4:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -228,7 +228,7 @@ module.exports = _dereq_('../src/traces/bar'); module.exports = _dereq_('../src/traces/box'); -},{"../src/traces/box":288}],5:[function(_dereq_,module,exports){ +},{"../src/traces/box":287}],5:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -241,7 +241,7 @@ module.exports = _dereq_('../src/traces/box'); module.exports = _dereq_('../src/traces/contour'); -},{"../src/traces/contour":308}],6:[function(_dereq_,module,exports){ +},{"../src/traces/contour":307}],6:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -267,7 +267,7 @@ module.exports = _dereq_('../src/core'); module.exports = _dereq_('../src/traces/heatmap'); -},{"../src/traces/heatmap":324}],8:[function(_dereq_,module,exports){ +},{"../src/traces/heatmap":323}],8:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -280,7 +280,7 @@ module.exports = _dereq_('../src/traces/heatmap'); module.exports = _dereq_('../src/traces/histogram'); -},{"../src/traces/histogram":342}],9:[function(_dereq_,module,exports){ +},{"../src/traces/histogram":341}],9:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -293,7 +293,7 @@ module.exports = _dereq_('../src/traces/histogram'); module.exports = _dereq_('../src/traces/histogram2d'); -},{"../src/traces/histogram2d":349}],10:[function(_dereq_,module,exports){ +},{"../src/traces/histogram2d":348}],10:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -306,7 +306,7 @@ module.exports = _dereq_('../src/traces/histogram2d'); module.exports = _dereq_('../src/traces/histogram2dcontour'); -},{"../src/traces/histogram2dcontour":353}],11:[function(_dereq_,module,exports){ +},{"../src/traces/histogram2dcontour":352}],11:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -347,7 +347,7 @@ module.exports = Plotly; module.exports = _dereq_('../src/traces/pie'); -},{"../src/traces/pie":360}],13:[function(_dereq_,module,exports){ +},{"../src/traces/pie":359}],13:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -360,7 +360,7 @@ module.exports = _dereq_('../src/traces/pie'); module.exports = _dereq_('../src/traces/scatterternary'); -},{"../src/traces/scatterternary":399}],14:[function(_dereq_,module,exports){ +},{"../src/traces/scatterternary":398}],14:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -373,7 +373,7 @@ module.exports = _dereq_('../src/traces/scatterternary'); module.exports = _dereq_('../src/traces/violin'); -},{"../src/traces/violin":407}],15:[function(_dereq_,module,exports){ +},{"../src/traces/violin":406}],15:[function(_dereq_,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -15219,7 +15219,7 @@ module.exports = templatedArray('annotation', { } }); -},{"../../plot_api/plot_template":202,"../../plots/cartesian/constants":218,"../../plots/font_attributes":239,"./arrow_paths":35}],37:[function(_dereq_,module,exports){ +},{"../../plot_api/plot_template":202,"../../plots/cartesian/constants":218,"../../plots/font_attributes":238,"./arrow_paths":35}],37:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -15447,7 +15447,7 @@ function clickData2r(d, ax) { return ax.type === 'log' ? ax.l2r(d) : ax.d2r(d); } -},{"../../lib":168,"../../plot_api/plot_template":202,"../../registry":257}],39:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plot_api/plot_template":202,"../../registry":256}],39:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -15502,7 +15502,6 @@ module.exports = function handleAnnotationCommonDefaults(annIn, annOut, fullLayo coerce('arrowwidth', ((borderOpacity && borderWidth) || 1) * 2); coerce('standoff'); coerce('startstandoff'); - } var hoverText = coerce('hovertext'); @@ -16334,7 +16333,6 @@ function drawRaw(gd, options, index, subplotId, xa, ya) { var xUpdate, yUpdate; if(xa) { xUpdate = xa.p2r(xa.r2p(options.x) + dx); - } else { var widthFraction = options._xsize / gs.w; var xLeft = options.x + (options._xshift - options.xshift) / gs.w - widthFraction / 2; @@ -16403,7 +16401,7 @@ function drawRaw(gd, options, index, subplotId, xa, ya) { else annText.call(textLayout); } -},{"../../lib":168,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/cartesian/axes":212,"../../plots/plots":245,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"../fx":90,"./draw_arrow_head":43,"d3":16}],43:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/cartesian/axes":212,"../../plots/plots":244,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"../fx":90,"./draw_arrow_head":43,"d3":16}],43:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -16481,7 +16479,6 @@ module.exports = function drawArrowHead(el3, ends, options) { end.x += backOffX; end.y += backOffY; el3.attr({x2: end.x, y2: end.y}); - } if(startBackOff) { @@ -16495,7 +16492,6 @@ module.exports = function drawArrowHead(el3, ends, options) { start.x -= startBackOffX; start.y -= startbackOffY; el3.attr({x1: start.x, y1: start.y}); - } } else if(el.nodeName === 'path') { @@ -16591,7 +16587,7 @@ module.exports = { convertCoords: _dereq_('./convert_coords') }; -},{"../../plots/cartesian/include_components":223,"./attributes":36,"./calc_autorange":37,"./click":38,"./convert_coords":40,"./defaults":41,"./draw":42}],45:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/include_components":222,"./attributes":36,"./calc_autorange":37,"./click":38,"./convert_coords":40,"./defaults":41,"./draw":42}],45:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -16872,7 +16868,7 @@ module.exports = function draw(scene) { } }; -},{"../../plots/gl3d/project":242,"../annotations/draw":42}],49:[function(_dereq_,module,exports){ +},{"../../plots/gl3d/project":241,"../annotations/draw":42}],49:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -16920,7 +16916,7 @@ function includeGL3D(layoutIn, layoutOut) { } } -},{"../../lib":168,"../../registry":257,"./attributes":45,"./convert":46,"./defaults":47,"./draw":48}],50:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"./attributes":45,"./convert":46,"./defaults":47,"./draw":48}],50:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -17307,7 +17303,7 @@ module.exports = overrideAll({ } }, 'colorbars', 'from-root'); -},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plots/cartesian/layout_attributes":225,"../../plots/font_attributes":239}],53:[function(_dereq_,module,exports){ +},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plots/cartesian/layout_attributes":224,"../../plots/font_attributes":238}],53:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -17469,7 +17465,7 @@ module.exports = function colorbarDefaults(containerIn, containerOut, layout) { coerce('title.side'); }; -},{"../../lib":168,"../../plot_api/plot_template":202,"../../plots/cartesian/tick_label_defaults":232,"../../plots/cartesian/tick_mark_defaults":233,"../../plots/cartesian/tick_value_defaults":234,"./attributes":52}],56:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plot_api/plot_template":202,"../../plots/cartesian/tick_label_defaults":231,"../../plots/cartesian/tick_mark_defaults":232,"../../plots/cartesian/tick_value_defaults":233,"./attributes":52}],56:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -17906,7 +17902,6 @@ module.exports = function draw(gd, id) { var vals = Axes.calcTicks(cbAxisOut); var transFn = Axes.makeTransFn(cbAxisOut); - var labelFns = Axes.makeLabelFns(cbAxisOut, shift); var tickSign = Axes.getTickSigns(cbAxisOut)[2]; Axes.drawTicks(gd, cbAxisOut, { @@ -17920,9 +17915,7 @@ module.exports = function draw(gd, id) { vals: vals, layer: axisLayer, transFn: transFn, - labelXFn: labelFns.labelXFn, - labelYFn: labelFns.labelYFn, - labelAnchorFn: labelFns.labelAnchorFn + labelFns: Axes.makeLabelFns(cbAxisOut, shift) }); }, function() { @@ -18167,7 +18160,7 @@ module.exports = function draw(gd, id) { return component; }; -},{"../../constants/alignment":146,"../../lib":168,"../../lib/extend":162,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../plots/cartesian/axis_defaults":214,"../../plots/cartesian/layout_attributes":225,"../../plots/cartesian/position_defaults":228,"../../plots/plots":245,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"../titles":139,"./attributes":52,"./constants":54,"d3":16,"tinycolor2":34}],57:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../lib":168,"../../lib/extend":162,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../plots/cartesian/axis_defaults":214,"../../plots/cartesian/layout_attributes":224,"../../plots/cartesian/position_defaults":227,"../../plots/plots":244,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"../titles":139,"./attributes":52,"./constants":54,"d3":16,"tinycolor2":34}],57:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -18276,6 +18269,8 @@ module.exports = function colorScaleAttrs(context, opts) { var auto = cLetter + 'auto'; var min = cLetter + 'min'; var max = cLetter + 'max'; + var mid = cLetter + 'mid'; + var autoFull = code(contextHead + auto); var minFull = code(contextHead + min); var maxFull = code(contextHead + max); var minmaxFull = minFull + ' and ' + maxFull; @@ -18327,6 +18322,15 @@ module.exports = function colorScaleAttrs(context, opts) { }; + attrs[mid] = { + valType: 'number', + + dflt: null, + editType: 'calc', + impliedEdits: autoImpliedEdits, + + }; + attrs.colorscale = { valType: 'colorscale', @@ -18393,9 +18397,11 @@ module.exports = function calc(gd, trace, opts) { var autoAttr = cLetter + 'auto'; var minAttr = cLetter + 'min'; var maxAttr = cLetter + 'max'; + var midAttr = cLetter + 'mid'; var auto = container[autoAttr]; var min = container[minAttr]; var max = container[maxAttr]; + var mid = container[midAttr]; var scl = container.colorscale; if(auto !== false || min === undefined) { @@ -18406,6 +18412,15 @@ module.exports = function calc(gd, trace, opts) { max = Lib.aggNums(Math.max, null, vals); } + if(auto !== false && mid !== undefined) { + if(max - mid > mid - min) { + min = mid - (max - mid); + } + else if(max - mid < mid - min) { + max = mid + (mid - min); + } + } + if(min === max) { min -= 0.5; max += 0.5; @@ -18469,10 +18484,16 @@ module.exports = function crossTraceDefaults(fullData) { for(var i = 0; i < fullData.length; i++) { var trace = fullData[i]; - var _module = trace._module; + var colorbar = trace._module.colorbar; - if(_module.colorbar) { - relinkColorAtts(trace, _module.colorbar); + if(colorbar) { + if(Array.isArray(colorbar)) { + for(var j = 0; j < colorbar.length; j++) { + relinkColorAtts(trace, colorbar[j]); + } + } else { + relinkColorAtts(trace, colorbar); + } } // TODO could generalize _module.colorscale and use it here? @@ -18531,9 +18552,14 @@ module.exports = function colorScaleDefaults(traceIn, traceOut, layout, coerce, var minIn = containerIn[cLetter + 'min']; var maxIn = containerIn[cLetter + 'max']; var validMinMax = isNumeric(minIn) && isNumeric(maxIn) && (minIn < maxIn); - coerce(prefix + cLetter + 'auto', !validMinMax); - coerce(prefix + cLetter + 'min'); - coerce(prefix + cLetter + 'max'); + var auto = coerce(prefix + cLetter + 'auto', !validMinMax); + + if(auto) { + coerce(prefix + cLetter + 'mid'); + } else { + coerce(prefix + cLetter + 'min'); + coerce(prefix + cLetter + 'max'); + } // handles both the trace case (autocolorscale is false by default) and // the marker and marker.line case (autocolorscale is true by default) @@ -19427,7 +19453,7 @@ function pointerOffset(e) { ); } -},{"../../constants/interactions":148,"../../lib":168,"../../plots/cartesian/constants":218,"../../registry":257,"./align":67,"./cursor":68,"./unhover":70,"has-hover":20,"has-passive-events":21,"mouse-event-offset":24}],70:[function(_dereq_,module,exports){ +},{"../../constants/interactions":148,"../../lib":168,"../../plots/cartesian/constants":218,"../../registry":256,"./align":67,"./cursor":68,"./unhover":70,"has-hover":20,"has-passive-events":21,"mouse-event-offset":24}],70:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -19623,7 +19649,9 @@ drawing.hideOutsideRangePoints = function(traceGroups, subplot) { var trace = d[0].trace; var xcalendar = trace.xcalendar; var ycalendar = trace.ycalendar; - var selector = trace.type === 'bar' ? '.bartext' : '.point,.textpoint'; + var selector = trace.type === 'bar' ? '.bartext' : + trace.type === 'waterfall' ? '.bartext,.line' : + '.point,.textpoint'; traceGroups.selectAll(selector).each(function(d) { drawing.hideOutsideRangePoint(d, d3.select(this), xa, ya, xcalendar, ycalendar); @@ -20668,7 +20696,7 @@ drawing.setTextPointsScale = function(selection, xScale, yScale) { }); }; -},{"../../constants/alignment":146,"../../constants/interactions":148,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../lib/svg_text_utils":189,"../../registry":257,"../../traces/scatter/make_bubble_size_func":384,"../../traces/scatter/subtypes":391,"../color":51,"../colorscale":63,"./symbol_defs":73,"d3":16,"fast-isnumeric":18,"tinycolor2":34}],73:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../constants/interactions":148,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../lib/svg_text_utils":189,"../../registry":256,"../../traces/scatter/make_bubble_size_func":383,"../../traces/scatter/subtypes":390,"../color":51,"../colorscale":63,"./symbol_defs":73,"d3":16,"fast-isnumeric":18,"tinycolor2":34}],73:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21357,7 +21385,7 @@ function calcOneAxis(calcTrace, trace, axis, coord) { baseExtremes.max = baseExtremes.max.concat(extremes.max); } -},{"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":257,"./compute_error":76,"fast-isnumeric":18}],76:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":256,"./compute_error":76,"fast-isnumeric":18}],76:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21537,7 +21565,7 @@ module.exports = function(traceIn, traceOut, defaultColor, opts) { } }; -},{"../../lib":168,"../../plot_api/plot_template":202,"../../registry":257,"./attributes":74,"fast-isnumeric":18}],78:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plot_api/plot_template":202,"../../registry":256,"./attributes":74,"fast-isnumeric":18}],78:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21780,7 +21808,7 @@ function errorCoords(d, xa, ya) { return out; } -},{"../../traces/scatter/subtypes":391,"../drawing":72,"d3":16,"fast-isnumeric":18}],80:[function(_dereq_,module,exports){ +},{"../../traces/scatter/subtypes":390,"../drawing":72,"d3":16,"fast-isnumeric":18}],80:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21863,7 +21891,7 @@ module.exports = { } }; -},{"../../plots/font_attributes":239}],82:[function(_dereq_,module,exports){ +},{"../../plots/font_attributes":238}],82:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21921,7 +21949,7 @@ function paste(traceAttr, cd, cdAttr, fn) { } } -},{"../../lib":168,"../../registry":257}],83:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],83:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -21959,7 +21987,7 @@ module.exports = function click(gd, evt, subplot) { } }; -},{"../../registry":257,"./hover":87}],84:[function(_dereq_,module,exports){ +},{"../../registry":256,"./hover":87}],84:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -22240,7 +22268,8 @@ var pointKeyMap = { locations: 'location', labels: 'label', values: 'value', - 'marker.colors': 'color' + 'marker.colors': 'color', + parents: 'parent' }; function getPointKey(astr) { @@ -22417,7 +22446,6 @@ exports.loneHover = function loneHover(hoverItem, opts) { }; exports.multiHovers = function multiHovers(hoverItems, opts) { - if(!Array.isArray(hoverItems)) { hoverItems = [hoverItems]; } @@ -22932,11 +22960,15 @@ function _hover(gd, evt, subplot, noHoverEvent) { var pt = hoverData[itemnum]; var eventData = helpers.makeEventData(pt, pt.trace, pt.cd); - var ht = false; - if(pt.cd[pt.index] && pt.cd[pt.index].ht) ht = pt.cd[pt.index].ht; - hoverData[itemnum].hovertemplate = ht || pt.trace.hovertemplate || false; - hoverData[itemnum].eventData = [eventData]; + if(pt.hovertemplate !== false) { + var ht = false; + if(pt.cd[pt.index] && pt.cd[pt.index].ht) { + ht = pt.cd[pt.index].ht; + } + pt.hovertemplate = ht || pt.trace.hovertemplate || false; + } + pt.eventData = [eventData]; newhoverdata.push(eventData); } @@ -22964,7 +22996,7 @@ function _hover(gd, evt, subplot, noHoverEvent) { var hoverLabels = createHoverText(hoverData, labelOpts, gd); - hoverAvoidOverlaps(hoverData, rotateLabels ? 'xa' : 'ya', fullLayout); + hoverAvoidOverlaps(hoverLabels, rotateLabels ? 'xa' : 'ya', fullLayout); alignHoverText(hoverLabels, rotateLabels); @@ -22998,6 +23030,7 @@ function _hover(gd, evt, subplot, noHoverEvent) { var EXTRA_STRING_REGEX = /([\s\S]*)<\/extra>/; function createHoverText(hoverData, opts, gd) { + var fullLayout = gd._fullLayout; var hovermode = opts.hovermode; var rotateLabels = opts.rotateLabels; var bgColor = opts.bgColor; @@ -23138,6 +23171,7 @@ function createHoverText(hoverData, opts, gd) { // show all the individual labels + // first create the objects var hoverLabels = container.selectAll('g.hovertext') .data(hoverData, function(d) { @@ -23185,6 +23219,10 @@ function createHoverText(hoverData, opts, gd) { if(d.nameOverride !== undefined) d.name = d.nameOverride; if(d.name) { + if(fullLayout.meta) { + d.name = Lib.templateString(d.name, {meta: fullLayout.meta}); + } + name = svgTextUtils.plainText(d.name || '', { len: d.nameLength, allowedTags: ['br', 'sub', 'sup', 'b', 'i', 'em'] @@ -23200,7 +23238,7 @@ function createHoverText(hoverData, opts, gd) { text = d[(hovermode === 'x' ? 'y' : 'x') + 'Label'] || ''; } else if(d.xLabel === undefined) { - if(d.yLabel !== undefined) text = d.yLabel; + if(d.yLabel !== undefined && d.trace.type !== 'scattercarpet') text = d.yLabel; } else if(d.yLabel === undefined) text = d.xLabel; else text = '(' + d.xLabel + ', ' + d.yLabel + ')'; @@ -23226,11 +23264,18 @@ function createHoverText(hoverData, opts, gd) { } // hovertemplate + var d3locale = gd._fullLayout._d3locale; var hovertemplate = d.hovertemplate || false; var hovertemplateLabels = d.hovertemplateLabels || d; var eventData = d.eventData[0] || {}; if(hovertemplate) { - text = Lib.hovertemplateString(hovertemplate, hovertemplateLabels, eventData); + text = Lib.hovertemplateString( + hovertemplate, + hovertemplateLabels, + d3locale, + eventData, + {meta: fullLayout.meta} + ); text = text.replace(EXTRA_STRING_REGEX, function(match, extra) { name = extra; // Assign name for secondary text label @@ -23309,13 +23354,22 @@ function createHoverText(hoverData, opts, gd) { d.pos = hty; anchorStartOK = htx + dx / 2 + txTotalWidth <= outerWidth; anchorEndOK = htx - dx / 2 - txTotalWidth >= 0; + if((d.idealAlign === 'left' || !anchorStartOK) && anchorEndOK) { htx -= dx / 2; d.anchor = 'end'; } else if(anchorStartOK) { htx += dx / 2; d.anchor = 'start'; - } else d.anchor = 'middle'; + } else { + d.anchor = 'middle'; + + var txHalfWidth = txTotalWidth / 2; + var overflowR = htx + txHalfWidth - outerWidth; + var overflowL = htx - txHalfWidth; + if(overflowR > 0) htx -= overflowR; + if(overflowL < 0) htx += -overflowL; + } } tx.attr('text-anchor', d.anchor); @@ -23339,17 +23393,21 @@ function createHoverText(hoverData, opts, gd) { // know what happens if the group spans all the way from one edge to // the other, though it hardly matters - there's just too much // information then. -function hoverAvoidOverlaps(hoverData, ax, fullLayout) { +function hoverAvoidOverlaps(hoverLabels, ax, fullLayout) { var nummoves = 0; var axSign = 1; + var nLabels = hoverLabels.size(); // make groups of touching points - var pointgroups = hoverData.map(function(d, i) { + var pointgroups = new Array(nLabels); + + hoverLabels.each(function(d, i) { var axis = d[ax]; var axIsX = axis._id.charAt(0) === 'x'; var rng = axis.range; if(!i && rng && ((rng[0] > rng[1]) !== axIsX)) axSign = -1; - return [{ + pointgroups[i] = [{ + datum: d, i: i, traceIndex: d.trace.index, dp: 0, @@ -23359,8 +23417,9 @@ function hoverAvoidOverlaps(hoverData, ax, fullLayout) { pmin: 0, pmax: (axIsX ? fullLayout.width : fullLayout.height) }]; - }) - .sort(function(a, b) { + }); + + pointgroups.sort(function(a, b) { return (a[0].posref - b[0].posref) || // for equal positions, sort trace indices increasing or decreasing // depending on whether the axis is reversed or not... so stacked @@ -23446,7 +23505,7 @@ function hoverAvoidOverlaps(hoverData, ax, fullLayout) { // loop through groups, combining them if they overlap, // until nothing moves - while(!donepositioning && nummoves <= hoverData.length) { + while(!donepositioning && nummoves <= nLabels) { // to avoid infinite loops, don't move more times // than there are traces nummoves++; @@ -23494,7 +23553,7 @@ function hoverAvoidOverlaps(hoverData, ax, fullLayout) { var grp = pointgroups[i]; for(j = grp.length - 1; j >= 0; j--) { var pt = grp[j]; - var hoverPt = hoverData[pt.i]; + var hoverPt = pt.datum; hoverPt.offset = pt.dp; hoverPt.del = pt.del; } @@ -23844,7 +23903,7 @@ function spikesChanged(gd, oldspikepoints) { return false; } -},{"../../lib":168,"../../lib/events":161,"../../lib/override_cursor":179,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"./constants":84,"./helpers":86,"d3":16,"fast-isnumeric":18,"tinycolor2":34}],88:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../lib/events":161,"../../lib/override_cursor":179,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"./constants":84,"./helpers":86,"d3":16,"fast-isnumeric":18,"tinycolor2":34}],88:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -23900,11 +23959,14 @@ module.exports = function(opts, extra) { valType: 'string', dflt: '', - arrayOk: true, - editType: 'none', + editType: opts.editType || 'none', }; + if(opts.arrayOk !== false) { + hovertemplate.arrayOk = true; + } + return hovertemplate; }; @@ -24083,7 +24145,7 @@ module.exports = { } }; -},{"../../plots/font_attributes":239,"./constants":84}],92:[function(_dereq_,module,exports){ +},{"../../plots/font_attributes":238,"./constants":84}],92:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -24114,7 +24176,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { } else { // flag for 'horizontal' plots: // determines the state of the mode bar 'compare' hovermode button - layoutOut._isHoriz = isHoriz(fullData); + layoutOut._isHoriz = isHoriz(fullData, layoutOut); hovermodeDflt = layoutOut._isHoriz ? 'y' : 'x'; } } @@ -24141,19 +24203,21 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { } }; -function isHoriz(fullData) { - var out = true; +function isHoriz(fullData, fullLayout) { + var stackOpts = fullLayout._scatterStackOpts || {}; for(var i = 0; i < fullData.length; i++) { var trace = fullData[i]; + var subplot = trace.xaxis + trace.yaxis; + var subplotStackOpts = stackOpts[subplot] || {}; + var groupOpts = subplotStackOpts[trace.stackgroup] || {}; - if(trace.orientation !== 'h') { - out = false; - break; + if(trace.orientation !== 'h' && groupOpts.orientation !== 'h') { + return false; } } - return out; + return true; } },{"../../lib":168,"./layout_attributes":91}],93:[function(_dereq_,module,exports){ @@ -24564,7 +24628,7 @@ module.exports = { contentDefaults: contentDefaults }; -},{"../../lib":168,"../../lib/regex":183,"../../plot_api/plot_template":202,"../../plots/cartesian/constants":218,"../../plots/domain":238}],95:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../lib/regex":183,"../../plot_api/plot_template":202,"../../plots/cartesian/constants":218,"../../plots/domain":237}],95:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -24811,7 +24875,6 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) { function imageDefaults(imageIn, imageOut, fullLayout) { - function coerce(attr, dflt) { return Lib.coerce(imageIn, imageOut, attributes, attr, dflt); } @@ -24932,7 +24995,6 @@ module.exports = function draw(gd) { thisImage.attr('xmlns', xmlnsNamespaces.svg); var imagePromise = new Promise(function(resolve) { - var img = new Image(); this.img = img; @@ -25093,7 +25155,7 @@ module.exports = { convertCoords: _dereq_('./convert_coords') }; -},{"../../plots/cartesian/include_components":223,"./attributes":95,"./convert_coords":96,"./defaults":97,"./draw":98}],100:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/include_components":222,"./attributes":95,"./convert_coords":96,"./defaults":97,"./draw":98}],100:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -25209,7 +25271,7 @@ module.exports = { editType: 'legend' }; -},{"../../plots/font_attributes":239,"../color/attributes":50}],101:[function(_dereq_,module,exports){ +},{"../../plots/font_attributes":238,"../color/attributes":50}],101:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -25342,7 +25404,7 @@ module.exports = function legendDefaults(layoutIn, layoutOut, fullData) { Lib.noneOrAll(containerIn, containerOut, ['x', 'y']); }; -},{"../../lib":168,"../../plot_api/plot_template":202,"../../plots/layout_attributes":243,"../../registry":257,"./attributes":100,"./helpers":106}],103:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plot_api/plot_template":202,"../../plots/layout_attributes":242,"../../registry":256,"./attributes":100,"./helpers":106}],103:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -25463,10 +25525,13 @@ module.exports = function draw(gd) { }) .each(function() { d3.select(this) - .call(drawTexts, gd, maxLength) - .call(setupTraceToggle, gd); + .call(drawTexts, gd, maxLength); }) - .call(style, gd); + .call(style, gd) + .each(function() { + d3.select(this) + .call(setupTraceToggle, gd); + }); Lib.syncOrAsync([Plots.previousPromises, function() { @@ -25749,9 +25814,13 @@ function drawTexts(g, gd, maxLength) { var trace = legendItem.trace; var isPie = Registry.traceIs(trace, 'pie'); var traceIndex = trace.index; - var name = isPie ? legendItem.label : trace.name; var isEditable = gd._context.edits.legendText && !isPie; + var name = isPie ? legendItem.label : trace.name; + if(fullLayout.meta) { + name = Lib.templateString(name, {meta: fullLayout.meta}); + } + var textEl = Lib.ensureSingle(g, 'text', 'legendtext'); textEl.attr('text-anchor', 'start') @@ -25894,6 +25963,8 @@ function computeLegendDimensions(gd, groups, traces) { var extraWidth = 0; + var traceGap = 5; + opts._width = 0; opts._height = 0; @@ -25927,23 +25998,53 @@ function computeLegendDimensions(gd, groups, traces) { extraWidth = 40; } else if(isGrouped) { - var groupXOffsets = [opts._width]; + var maxHeight = 0; + var maxWidth = 0; var groupData = groups.data(); - for(var i = 0, n = groupData.length; i < n; i++) { - var textWidths = groupData[i].map(function(legendItemArray) { + var maxItems = 0; + + var i; + for(i = 0; i < groupData.length; i++) { + var group = groupData[i]; + var groupWidths = group.map(function(legendItemArray) { return legendItemArray[0].width; }); - var groupWidth = 40 + Math.max.apply(null, textWidths); + var groupWidth = Lib.aggNums(Math.max, null, groupWidths); + var groupHeight = group.reduce(function(a, b) { + return a + b[0].height; + }, 0); - opts._width += opts.tracegroupgap + groupWidth; + maxWidth = Math.max(maxWidth, groupWidth); + maxHeight = Math.max(maxHeight, groupHeight); + maxItems = Math.max(maxItems, group.length); + } + maxWidth += traceGap; + maxWidth += 40; + + var groupXOffsets = [opts._width]; + var groupYOffsets = []; + var rowNum = 0; + for(i = 0; i < groupData.length; i++) { + if(fullLayout._size.w < (borderwidth + opts._width + traceGap + maxWidth)) { + groupXOffsets[groupXOffsets.length - 1] = groupXOffsets[0]; + opts._width = maxWidth; + rowNum++; + } else { + opts._width += maxWidth + borderwidth; + } + + var rowYOffset = (rowNum * maxHeight); + rowYOffset += rowNum > 0 ? opts.tracegroupgap : 0; + + groupYOffsets.push(rowYOffset); groupXOffsets.push(opts._width); } groups.each(function(d, i) { - Drawing.setTranslate(this, groupXOffsets[i], 0); + Drawing.setTranslate(this, groupXOffsets[i], groupYOffsets[i]); }); groups.each(function() { @@ -25961,11 +26062,13 @@ function computeLegendDimensions(gd, groups, traces) { groupHeight += textHeight; }); - - opts._height = Math.max(opts._height, groupHeight); }); - opts._height += 10 + borderwidth * 2; + var maxYLegend = groupYOffsets[groupYOffsets.length - 1] + maxHeight; + opts._height = 10 + (borderwidth * 2) + maxYLegend; + + var maxOffset = Math.max.apply(null, groupXOffsets); + opts._width = maxOffset + maxWidth + 40; opts._width += borderwidth * 2; } else { @@ -25974,7 +26077,6 @@ function computeLegendDimensions(gd, groups, traces) { var maxTraceWidth = 0; var offsetX = 0; var fullTracesWidth = 0; - var traceGap = opts.tracegroupgap || 5; // calculate largest width for traces and use for width of all legend items traces.each(function(d) { @@ -26094,7 +26196,7 @@ function expandHorizontalMargin(gd) { }); } -},{"../../constants/alignment":146,"../../constants/interactions":148,"../../lib":168,"../../lib/events":161,"../../lib/svg_text_utils":189,"../../plots/plots":245,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"./constants":101,"./get_legend_data":104,"./handle_click":105,"./helpers":106,"./style":108,"d3":16}],104:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../constants/interactions":148,"../../lib":168,"../../lib/events":161,"../../lib/svg_text_utils":189,"../../plots/plots":244,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"./constants":101,"./get_legend_data":104,"./handle_click":105,"./helpers":106,"./style":108,"d3":16}],104:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -26199,7 +26301,7 @@ module.exports = function getLegendData(calcdata, opts) { return legendData; }; -},{"../../registry":257,"./helpers":106}],105:[function(_dereq_,module,exports){ +},{"../../registry":256,"./helpers":106}],105:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -26423,7 +26525,7 @@ module.exports = function handleClick(g, gd, numClicks) { } }; -},{"../../lib":168,"../../registry":257}],106:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],106:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -26535,6 +26637,7 @@ module.exports = function style(s, gd) { .enter().append('g') .classed('legendpoints', true); }) + .each(styleWaterfalls) .each(styleBars) .each(styleBoxes) .each(stylePies) @@ -26619,7 +26722,6 @@ module.exports = function style(s, gd) { trace.colorscale, 'stroke'); } } - } function stylePoints(d) { @@ -26715,6 +26817,38 @@ module.exports = function style(s, gd) { txt.selectAll('text').call(Drawing.textPointStyle, tMod, gd); } + function styleWaterfalls(d) { + var trace = d[0].trace; + + var ptsData = []; + if(trace.type === 'waterfall' && trace.visible) { + ptsData = d[0].hasTotals ? + [['increasing', 'M-6,-6V6H0Z'], ['totals', 'M6,6H0L-6,-6H-0Z'], ['decreasing', 'M6,6V-6H0Z']] : + [['increasing', 'M-6,-6V6H6Z'], ['decreasing', 'M6,6V-6H-6Z']]; + } + + var pts = d3.select(this).select('g.legendpoints') + .selectAll('path.legendwaterfall') + .data(ptsData); + pts.enter().append('path').classed('legendwaterfall', true) + .attr('transform', 'translate(20,0)') + .style('stroke-miterlimit', 1); + pts.exit().remove(); + + pts.each(function(dd) { + var pt = d3.select(this); + var cont = trace[dd[0]].marker; + + pt.attr('d', dd[1]) + .style('stroke-width', cont.line.width + 'px') + .call(Color.fill, cont.color); + + if(cont.line.width) { + pt.call(Color.stroke, cont.line.color); + } + }); + } + function styleBars(d) { var trace = d[0].trace; var marker = trace.marker || {}; @@ -26840,7 +26974,7 @@ module.exports = function style(s, gd) { } }; -},{"../../lib":168,"../../registry":257,"../../traces/pie/style_one":365,"../../traces/scatter/subtypes":391,"../color":51,"../drawing":72,"d3":16}],109:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"../../traces/pie/style_one":364,"../../traces/scatter/subtypes":390,"../color":51,"../drawing":72,"d3":16}],109:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -27190,11 +27324,14 @@ function handleCamera3d(gd, ev) { var key = sceneId + '.camera'; var scene = fullLayout[sceneId]._scene; - if(attr === 'resetDefault') { - aobj[key] = null; - } - else if(attr === 'resetLastSave') { - aobj[key] = Lib.extendDeep({}, scene.cameraInitial); + if(attr === 'resetLastSave') { + aobj[key + '.up'] = scene.viewInitial.up; + aobj[key + '.eye'] = scene.viewInitial.eye; + aobj[key + '.center'] = scene.viewInitial.center; + } else if(attr === 'resetDefault') { + aobj[key + '.up'] = null; + aobj[key + '.eye'] = null; + aobj[key + '.center'] = null; } } @@ -27453,7 +27590,7 @@ function resetView(gd, subplotType) { Registry.call('_guiRelayout', gd, aObj); } -},{"../../../build/ploticon":2,"../../lib":168,"../../plots/cartesian/axis_ids":215,"../../plots/plots":245,"../../registry":257}],110:[function(_dereq_,module,exports){ +},{"../../../build/ploticon":2,"../../lib":168,"../../plots/cartesian/axis_ids":215,"../../plots/plots":244,"../../registry":256}],110:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -27728,7 +27865,7 @@ function fillCustomButton(customButtons) { return customButtons; } -},{"../../plots/cartesian/axis_ids":215,"../../registry":257,"../../traces/scatter/subtypes":391,"./buttons":109,"./modebar":112}],112:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/axis_ids":215,"../../registry":256,"../../traces/scatter/subtypes":390,"./buttons":109,"./modebar":112}],112:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -27795,7 +27932,7 @@ proto.update = function(graphInfo, buttons) { var bgSelector = context.displayModeBar === 'hover' ? '.js-plotly-plot .plotly:hover ' : ''; Lib.deleteRelatedStyleRule(modeBarId); - Lib.addRelatedStyleRule(modeBarId, bgSelector + '#' + modeBarId, 'background-color: ' + style.bgcolor); + Lib.addRelatedStyleRule(modeBarId, bgSelector + '#' + modeBarId + ' .modebar-group', 'background-color: ' + style.bgcolor); Lib.addRelatedStyleRule(modeBarId, '#' + modeBarId + ' .modebar-btn .icon path', 'fill: ' + style.color); Lib.addRelatedStyleRule(modeBarId, '#' + modeBarId + ' .modebar-btn:hover .icon path', 'fill: ' + style.activecolor); Lib.addRelatedStyleRule(modeBarId, '#' + modeBarId + ' .modebar-btn.active .icon path', 'fill: ' + style.activecolor); @@ -28001,7 +28138,6 @@ proto.updateActiveButton = function(buttonClicked) { button3.classed('active', val === thisval); } - }); }; @@ -28064,7 +28200,7 @@ function createModeBar(gd, buttons) { var modeBar = new ModeBar({ graphInfo: gd, - container: fullLayout._paperdiv.node(), + container: fullLayout._modebardiv.node(), buttons: buttons }); @@ -28215,7 +28351,7 @@ module.exports = { editType: 'plot' }; -},{"../../plot_api/plot_template":202,"../../plots/font_attributes":239,"../color/attributes":50}],114:[function(_dereq_,module,exports){ +},{"../../plot_api/plot_template":202,"../../plots/font_attributes":238,"../color/attributes":50}],114:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -28366,7 +28502,6 @@ var FROM_BR = alignmentConstants.FROM_BR; var constants = _dereq_('./constants'); var getUpdateObject = _dereq_('./get_update_object'); - module.exports = function draw(gd) { var fullLayout = gd._fullLayout; @@ -28424,7 +28559,6 @@ module.exports = function draw(gd) { reposition(gd, buttons, selectorLayout, axisLayout._name, selector); }); - }; function makeSelectorData(gd) { @@ -28492,12 +28626,16 @@ function drawButtonText(button, selectorLayout, d, gd) { }); text.call(Drawing.font, selectorLayout.font) - .text(getLabel(d)) + .text(getLabel(d, gd._fullLayout.meta)) .call(textLayout); } -function getLabel(opts) { - if(opts.label) return opts.label; +function getLabel(opts, meta) { + if(opts.label) { + return meta ? + Lib.templateString(opts.label, {meta: meta}) : + opts.label; + } if(opts.step === 'all') return 'all'; @@ -28593,7 +28731,7 @@ function reposition(gd, buttons, opts, axName, selector) { selector.attr('transform', 'translate(' + lx + ',' + ly + ')'); } -},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/cartesian/axis_ids":215,"../../plots/plots":245,"../../registry":257,"../color":51,"../drawing":72,"./constants":114,"./get_update_object":117,"d3":16}],117:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/cartesian/axis_ids":215,"../../plots/plots":244,"../../registry":256,"../color":51,"../drawing":72,"./constants":114,"./get_update_object":117,"d3":16}],117:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -29182,7 +29320,6 @@ function setupDragElement(rangeSlider, gd, axisOpts, opts) { } function setDataRange(rangeSlider, gd, axisOpts, opts) { - function clamp(v) { return axisOpts.l2r(Lib.constrain(v, opts._rl[0], opts._rl[1])); } @@ -29506,7 +29643,7 @@ function drawGrabbers(rangeSlider, gd, axisOpts, opts) { grabAreaMax.attr('height', opts._height); } -},{"../../lib":168,"../../lib/setcursor":187,"../../plots/cartesian":224,"../../plots/cartesian/axis_ids":215,"../../plots/plots":245,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"../titles":139,"./constants":121,"d3":16}],124:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../lib/setcursor":187,"../../plots/cartesian":223,"../../plots/cartesian/axis_ids":215,"../../plots/plots":244,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"../titles":139,"./constants":121,"d3":16}],124:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -29789,7 +29926,7 @@ module.exports = templatedArray('shape', { editType: 'arraydraw' }); -},{"../../lib/extend":162,"../../plot_api/plot_template":202,"../../traces/scatter/attributes":367,"../annotations/attributes":36,"../drawing/attributes":71}],128:[function(_dereq_,module,exports){ +},{"../../lib/extend":162,"../../plot_api/plot_template":202,"../../traces/scatter/attributes":366,"../annotations/attributes":36,"../drawing/attributes":71}],128:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -30726,7 +30863,7 @@ function movePath(pathIn, moveX, moveY) { }); } -},{"../../lib":168,"../../lib/setcursor":187,"../../plot_api/plot_template":202,"../../plots/cartesian/axes":212,"../../registry":257,"../color":51,"../dragelement":69,"../drawing":72,"./constants":129,"./helpers":132}],132:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../lib/setcursor":187,"../../plot_api/plot_template":202,"../../plots/cartesian/axes":212,"../../registry":256,"../color":51,"../dragelement":69,"../drawing":72,"./constants":129,"./helpers":132}],132:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -30878,7 +31015,7 @@ module.exports = { drawOne: drawModule.drawOne }; -},{"../../plots/cartesian/include_components":223,"./attributes":127,"./calc_autorange":128,"./defaults":130,"./draw":131}],134:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/include_components":222,"./attributes":127,"./calc_autorange":128,"./defaults":130,"./draw":131}],134:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -31121,7 +31258,7 @@ module.exports = overrideAll(templatedArray('slider', { } }), 'arraydraw', 'from-root'); -},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plot_api/plot_template":202,"../../plots/animation_attributes":207,"../../plots/font_attributes":239,"../../plots/pad_attributes":244,"./constants":135}],135:[function(_dereq_,module,exports){ +},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plot_api/plot_template":202,"../../plots/animation_attributes":207,"../../plots/font_attributes":238,"../../plots/pad_attributes":243,"./constants":135}],135:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -31244,7 +31381,6 @@ module.exports = function slidersDefaults(layoutIn, layoutOut) { }; function sliderDefaults(sliderIn, sliderOut, layoutOut) { - function coerce(attr, dflt) { return Lib.coerce(sliderIn, sliderOut, attributes, attr, dflt); } @@ -31612,7 +31748,6 @@ function drawSlider(gd, sliderGroup, sliderOpts) { sliderGroup.call(setGripPosition, sliderOpts, false); sliderGroup.call(drawCurrentValue, sliderOpts); - } function drawCurrentValue(sliderGroup, sliderOpts, valueOverride) { @@ -31652,6 +31787,10 @@ function drawCurrentValue(sliderGroup, sliderOpts, valueOverride) { str += valueOverride; } else { var curVal = sliderOpts.steps[sliderOpts.active].label; + var meta = sliderOpts._gd._fullLayout.meta; + if(meta) { + curVal = Lib.templateString(curVal, {meta: meta}); + } str += curVal; } @@ -31699,8 +31838,14 @@ function drawLabel(item, data, sliderOpts) { }); }); + var tx = data.step.label; + var meta = sliderOpts._gd._fullLayout.meta; + if(meta) { + tx = Lib.templateString(tx, {meta: meta}); + } + text.call(Drawing.font, sliderOpts.font) - .text(data.step.label) + .text(tx) .call(svgTextUtils.convertToTspans, sliderOpts._gd); return text; @@ -31734,7 +31879,6 @@ function drawLabelGroup(sliderGroup, sliderOpts) { dims.currentValueTotalHeight ); }); - } function handleInput(gd, sliderGroup, sliderOpts, normalizedPosition, doTransition) { @@ -31865,7 +32009,6 @@ function drawTicks(sliderGroup, sliderOpts) { (isMajor ? constants.tickOffset : constants.minorTickOffset) + dims.currentValueTotalHeight ); }); - } function computeLabelSteps(sliderOpts) { @@ -31962,7 +32105,7 @@ function drawRail(sliderGroup, sliderOpts) { ); } -},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/plots":245,"../color":51,"../drawing":72,"./constants":135,"d3":16}],138:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/plots":244,"../color":51,"../drawing":72,"./constants":135,"d3":16}],138:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -32250,7 +32393,7 @@ function draw(gd, titleClass, options) { return group; } -},{"../../constants/interactions":148,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/plots":245,"../../registry":257,"../color":51,"../drawing":72,"d3":16,"fast-isnumeric":18}],140:[function(_dereq_,module,exports){ +},{"../../constants/interactions":148,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/plots":244,"../../registry":256,"../color":51,"../drawing":72,"d3":16,"fast-isnumeric":18}],140:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -32408,7 +32551,7 @@ module.exports = overrideAll(templatedArray('updatemenu', { } }), 'arraydraw', 'from-root'); -},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plot_api/plot_template":202,"../../plots/font_attributes":239,"../../plots/pad_attributes":244,"../color/attributes":50}],141:[function(_dereq_,module,exports){ +},{"../../lib/extend":162,"../../plot_api/edit_types":195,"../../plot_api/plot_template":202,"../../plots/font_attributes":238,"../../plots/pad_attributes":243,"../color/attributes":50}],141:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -32520,7 +32663,6 @@ module.exports = function updateMenusDefaults(layoutIn, layoutOut) { }; function menuDefaults(menuIn, menuOut, layoutOut) { - function coerce(attr, dflt) { return Lib.coerce(menuIn, menuOut, attributes, attr, dflt); } @@ -32708,7 +32850,6 @@ module.exports = function draw(gd) { } else { drawButtons(gd, gHeader, null, null, menuOpts); } - }); }; @@ -33017,8 +33158,14 @@ function drawItemText(item, menuOpts, itemOpts, gd) { }); }); + var tx = itemOpts.label; + var meta = gd._fullLayout.meta; + if(meta) { + tx = Lib.templateString(tx, {meta: meta}); + } + text.call(Drawing.font, menuOpts.font) - .text(itemOpts.label) + .text(tx) .call(svgTextUtils.convertToTspans, gd); } @@ -33221,7 +33368,7 @@ function removeAllButtons(gButton, newMenuIndexAttr) { .selectAll('g.' + constants.dropdownButtonClassName).remove(); } -},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/plots":245,"../color":51,"../drawing":72,"./constants":141,"./scrollbox":145,"d3":16}],144:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../lib":168,"../../lib/svg_text_utils":189,"../../plot_api/plot_template":202,"../../plots/plots":244,"../color":51,"../drawing":72,"./constants":141,"./scrollbox":145,"d3":16}],144:[function(_dereq_,module,exports){ arguments[4][138][0].apply(exports,arguments) },{"./attributes":140,"./constants":141,"./defaults":142,"./draw":143,"dup":138}],145:[function(_dereq_,module,exports){ /** @@ -33925,7 +34072,7 @@ exports.svgAttrs = { 'use strict'; // package version injected by `npm run preprocess` -exports.version = '1.44.4'; +exports.version = '1.46.0'; // inject promise polyfill _dereq_('es6-promise').polyfill(); @@ -33993,7 +34140,7 @@ exports.Queue = _dereq_('./lib/queue'); // export d3 used in the bundle exports.d3 = _dereq_('d3'); -},{"../build/plotcss":1,"../build/ploticon":2,"./components/annotations":44,"./components/annotations3d":49,"./components/colorscale":63,"./components/errorbars":78,"./components/fx":90,"./components/grid":94,"./components/images":99,"./components/legend":107,"./components/rangeselector":118,"./components/rangeslider":125,"./components/shapes":133,"./components/sliders":138,"./components/updatemenus":144,"./fonts/mathjax_config":152,"./lib/queue":182,"./locale-en":193,"./locale-en-us":192,"./plot_api":197,"./plot_api/plot_schema":201,"./plots/plots":245,"./registry":257,"./snapshot":262,"./traces/scatter":379,"d3":16,"es6-promise":17}],152:[function(_dereq_,module,exports){ +},{"../build/plotcss":1,"../build/ploticon":2,"./components/annotations":44,"./components/annotations3d":49,"./components/colorscale":63,"./components/errorbars":78,"./components/fx":90,"./components/grid":94,"./components/images":99,"./components/legend":107,"./components/rangeselector":118,"./components/rangeslider":125,"./components/shapes":133,"./components/sliders":138,"./components/updatemenus":144,"./fonts/mathjax_config":152,"./lib/queue":182,"./locale-en":193,"./locale-en-us":192,"./plot_api":197,"./plot_api/plot_schema":201,"./plots/plots":244,"./registry":256,"./snapshot":261,"./traces/scatter":378,"d3":16,"es6-promise":17}],152:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -34120,7 +34267,7 @@ function rad2deg(rad) { return rad / PI * 180; } * @return {boolean} */ function isFullCircle(aBnds) { - return Math.abs(aBnds[1] - aBnds[0]) > twoPI - 1e-15; + return Math.abs(aBnds[1] - aBnds[0]) > twoPI - 1e-14; } /** @@ -34789,7 +34936,6 @@ exports.valObjectMeta = { // either be a matching 1D array or an array of such matching 1D arrays coerceFunction: function(v, propOut, dflt, opts) { - // simplified coerce function just for array items function coercePart(v, opts, dflt) { var out; @@ -35423,7 +35569,6 @@ exports.cleanDate = function(v, dflt, calendar) { */ var fracMatch = /%\d?f/g; function modDateFormat(fmt, x, formatter, calendar) { - fmt = fmt.replace(fracMatch, function(match) { var digits = Math.min(+(match.charAt(1)) || 6, 6); var fracSecs = ((x / 1000 % 1) + 2) @@ -35643,7 +35788,7 @@ exports.findExactDates = function(data, calendar) { }; }; -},{"../constants/numerical":149,"../registry":257,"./loggers":172,"./mod":175,"d3":16,"fast-isnumeric":18}],161:[function(_dereq_,module,exports){ +},{"../constants/numerical":149,"../registry":256,"./loggers":172,"./mod":175,"d3":16,"fast-isnumeric":18}],161:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -35662,7 +35807,6 @@ var EventEmitter = _dereq_('events').EventEmitter; var Events = { init: function(plotObj) { - /* * If we have already instantiated an emitter for this plot * return early. @@ -35888,7 +36032,6 @@ function _extend(inputs, isDeep, keepAllKeys, noArrayCopies) { // TODO does this do the right thing for typed arrays? if(length === 2 && isArray(target) && isArray(inputs[1]) && target.length === 0) { - allPrimitives = primitivesLoopSplice(inputs[1], target); if(allPrimitives) { @@ -37177,7 +37320,6 @@ lib.objectFromPath = function(path, value) { tmpObj = tmpObj[el]; } else { - if(i === keys.length - 1) { tmpObj[key] = value; } else { @@ -37328,7 +37470,7 @@ lib.numSeparate = function(value, separators, separatethousands) { return x1 + x2; }; -var TEMPLATE_STRING_REGEX = /%{([^\s%{}:]*)(:[^}]*)?}/g; +lib.TEMPLATE_STRING_REGEX = /%{([^\s%{}:]*)(:[^}]*)?}/g; var SIMPLE_PROPERTY_REGEX = /^\w*$/; /** @@ -37348,7 +37490,7 @@ lib.templateString = function(string, obj) { // just in case it speeds things up *slightly*: var getterCache = {}; - return string.replace(TEMPLATE_STRING_REGEX, function(dummy, key) { + return string.replace(lib.TEMPLATE_STRING_REGEX, function(dummy, key) { if(SIMPLE_PROPERTY_REGEX.test(key)) { return obj[key] || ''; } @@ -37365,25 +37507,26 @@ var maximumNumberOfHoverTemplateWarnings = 10; * or fallback to associated labels. * * Examples: - * Lib.templateString('name: %{trace}', {trace: 'asdf'}) --> 'name: asdf' - * Lib.templateString('name: %{trace[0].name}', {trace: [{name: 'asdf'}]}) --> 'name: asdf' - * Lib.templateString('price: %{y:$.2f}', {y: 1}) --> 'price: $1.00' + * Lib.hovertemplateString('name: %{trace}', {trace: 'asdf'}) --> 'name: asdf' + * Lib.hovertemplateString('name: %{trace[0].name}', {trace: [{name: 'asdf'}]}) --> 'name: asdf' + * Lib.hovertemplateString('price: %{y:$.2f}', {y: 1}) --> 'price: $1.00' * + * @param {obj} d3 locale * @param {string} input string containing %{...:...} template strings * @param {obj} data object containing fallback text when no formatting is specified, ex.: {yLabel: 'formattedYValue'} * @param {obj} data objects containing substitution values * * @return {string} templated string */ -lib.hovertemplateString = function(string, labels) { +lib.hovertemplateString = function(string, labels, d3locale) { var args = arguments; // Not all that useful, but cache nestedProperty instantiation // just in case it speeds things up *slightly*: var getterCache = {}; - return string.replace(TEMPLATE_STRING_REGEX, function(match, key, format) { + return string.replace(lib.TEMPLATE_STRING_REGEX, function(match, key, format) { var obj, value, i; - for(i = 2; i < args.length; i++) { + for(i = 3; i < args.length; i++) { obj = args[i]; if(obj.hasOwnProperty(key)) { value = obj[key]; @@ -37410,7 +37553,13 @@ lib.hovertemplateString = function(string, labels) { } if(format) { - value = d3.format(format.replace(TEMPLATE_STRING_FORMAT_SEPARATOR, ''))(value); + var fmt; + if(d3locale) { + fmt = d3locale.numberFormat; + } else { + fmt = d3.format; + } + value = fmt(format.replace(TEMPLATE_STRING_FORMAT_SEPARATOR, ''))(value); } else { if(labels.hasOwnProperty(key + 'Label')) value = labels[key + 'Label']; } @@ -37474,7 +37623,6 @@ lib.pseudoRandom = function() { // more info: http://stackoverflow.com/questions/18531624/isplainobject-thing module.exports = function isPlainObject(obj) { - // We need to be a little less strict in the `imagetest` container because // of how async image requests are handled. // @@ -37738,7 +37886,7 @@ module.exports = function localize(gd, s) { return s; }; -},{"../registry":257}],172:[function(_dereq_,module,exports){ +},{"../registry":256}],172:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -39014,7 +39162,6 @@ module.exports = function relinkPrivateKeys(toContainer, fromContainer) { continue; } if(k.charAt(0) === '_' || typeof fromVal === 'function') { - // if it already exists at this point, it's something // that we recreate each time around, so ignore it if(k in toContainer) continue; @@ -39022,7 +39169,6 @@ module.exports = function relinkPrivateKeys(toContainer, fromContainer) { toContainer[k] = fromVal; } else if(isArrayOrTypedArray(fromVal) && isArrayOrTypedArray(toVal) && isPlainObject(fromVal[0])) { - // filter out data_array items that can contain user objects // most of the time the toVal === fromVal check will catch these early // but if the user makes new ones we also don't want to recurse in. @@ -39037,7 +39183,6 @@ module.exports = function relinkPrivateKeys(toContainer, fromContainer) { } } else if(isPlainObject(fromVal) && isPlainObject(toVal)) { - // recurse into objects, but only if they still exist relinkPrivateKeys(toVal, fromVal); @@ -39524,7 +39669,6 @@ function cleanEscapesForTex(s) { } function texToSVG(_texString, _config, _callback) { - var originalRenderer, originalConfig, originalProcessSectionDelay, @@ -40442,7 +40586,7 @@ module.exports = function containerArrayMatch(astr) { return {array: arrayStr, index: Number(match[1]), property: match[3] || ''}; }; -},{"../registry":257}],195:[function(_dereq_,module,exports){ +},{"../registry":256}],195:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -40587,10 +40731,11 @@ var Registry = _dereq_('../registry'); var Lib = _dereq_('../lib'); var Plots = _dereq_('../plots/plots'); var AxisIds = _dereq_('../plots/cartesian/axis_ids'); -var cleanId = AxisIds.cleanId; -var getFromTrace = AxisIds.getFromTrace; var Color = _dereq_('../components/color'); +var cleanId = AxisIds.cleanId; +var getFromTrace = AxisIds.getFromTrace; +var traceIs = Registry.traceIs; // clear the promise queue if one of them got rejected exports.clearPromiseQueue = function(gd) { @@ -40807,7 +40952,6 @@ function cleanAxRef(container, attr) { */ function cleanTitle(titleContainer) { if(titleContainer) { - // title -> title.text // (although title used to be a string attribute, // numbers are accepted as well) @@ -40828,7 +40972,6 @@ function cleanTitle(titleContainer) { var newAttrSet = titleContainer.title && titleContainer.title[newAttrName]; if(oldAttrSet && !newAttrSet) { - // Ensure title object exists if(!titleContainer.title) { titleContainer.title = {}; @@ -40861,7 +41004,7 @@ exports.cleanData = function(data) { // error_y.opacity is obsolete - merge into color if(trace.error_y && 'opacity' in trace.error_y) { var dc = Color.defaults; - var yeColor = trace.error_y.color || (Registry.traceIs(trace, 'bar') ? + var yeColor = trace.error_y.color || (traceIs(trace, 'bar') ? Color.defaultLine : dc[tracei % dc.length]); trace.error_y.color = Color.addOpacity( @@ -40873,8 +41016,8 @@ exports.cleanData = function(data) { // convert bardir to orientation, and put the data into // the axes it's eventually going to be used with if('bardir' in trace) { - if(trace.bardir === 'h' && (Registry.traceIs(trace, 'bar') || - trace.type.substr(0, 9) === 'histogram')) { + if(trace.bardir === 'h' && (traceIs(trace, 'bar') || + trace.type.substr(0, 9) === 'histogram')) { trace.orientation = 'h'; exports.swapXYData(trace); } @@ -40903,11 +41046,11 @@ exports.cleanData = function(data) { if(trace.yaxis) trace.yaxis = cleanId(trace.yaxis, 'y'); // scene ids scene1 -> scene - if(Registry.traceIs(trace, 'gl3d') && trace.scene) { + if(traceIs(trace, 'gl3d') && trace.scene) { trace.scene = Plots.subplotsRegistry.gl3d.cleanId(trace.scene); } - if(!Registry.traceIs(trace, 'pie') && !Registry.traceIs(trace, 'bar')) { + if(!traceIs(trace, 'pie') && !traceIs(trace, 'bar') && trace.type !== 'waterfall') { if(Array.isArray(trace.textposition)) { for(i = 0; i < trace.textposition.length; i++) { trace.textposition[i] = cleanTextPosition(trace.textposition[i]); @@ -41183,7 +41326,6 @@ exports.manageArrayContainers = function(np, newVal, undoit) { // delete item if(pLastIsNumber && newVal === null) { - // Clear item in array container when new value is null var contPath = parts.slice(0, pLength - 1).join('.'); var cont = Lib.nestedProperty(obj, contPath).get(); @@ -41194,7 +41336,6 @@ exports.manageArrayContainers = function(np, newVal, undoit) { } // create item else if(pLastIsNumber && np.get() === undefined) { - // When adding a new item, make sure undo command will remove it if(np.get() === undefined) undoit[np.astr] = null; @@ -41202,7 +41343,6 @@ exports.manageArrayContainers = function(np, newVal, undoit) { } // update item else { - // If the last part of attribute string isn't a number, // np.set is all we need. np.set(newVal); @@ -41275,7 +41415,7 @@ exports.clearAxisTypes = function(gd, traces, layoutUpdate) { } }; -},{"../components/color":51,"../lib":168,"../plots/cartesian/axis_ids":215,"../plots/plots":245,"../registry":257,"fast-isnumeric":18,"gl-mat4/fromQuat":19}],197:[function(_dereq_,module,exports){ +},{"../components/color":51,"../lib":168,"../plots/cartesian/axis_ids":215,"../plots/plots":244,"../registry":256,"fast-isnumeric":18,"gl-mat4/fromQuat":19}],197:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -41318,7 +41458,7 @@ var templateApi = _dereq_('./template_api'); exports.makeTemplate = templateApi.makeTemplate; exports.validateTemplate = templateApi.validateTemplate; -},{"../snapshot/download":259,"./plot_api":199,"./template_api":204,"./to_image":205,"./validate":206}],198:[function(_dereq_,module,exports){ +},{"../snapshot/download":258,"./plot_api":199,"./template_api":204,"./to_image":205,"./validate":206}],198:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -41536,7 +41676,7 @@ exports.applyContainerArrayChanges = function applyContainerArrayChanges(gd, np, return true; }; -},{"../lib/is_plain_object":169,"../lib/loggers":172,"../lib/noop":177,"../lib/search":186,"../registry":257,"./container_array_match":194}],199:[function(_dereq_,module,exports){ +},{"../lib/is_plain_object":169,"../lib/loggers":172,"../lib/noop":177,"../lib/search":186,"../registry":256,"./container_array_match":194}],199:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -41571,6 +41711,7 @@ var connectColorbar = _dereq_('../components/colorbar/connect'); var initInteractions = _dereq_('../plots/cartesian/graph_interact').initInteractions; var xmlnsNamespaces = _dereq_('../constants/xmlns_namespaces'); var svgTextUtils = _dereq_('../lib/svg_text_utils'); +var clearSelect = _dereq_('../plots/cartesian/select').clearSelect; var dfltConfig = _dereq_('./plot_config').dfltConfig; var manageArrays = _dereq_('./manage_arrays'); @@ -41783,8 +41924,6 @@ exports.plot = function(gd, data, layout, config) { 'position': 'absolute', 'top': 0, 'left': 0, - 'width': '100%', - 'height': '100%', 'overflow': 'visible', 'pointer-events': 'none' }); @@ -41818,6 +41957,16 @@ exports.plot = function(gd, data, layout, config) { } } + if(fullLayout.modebar.orientation === 'h') { + fullLayout._modebardiv + .style('height', null) + .style('width', '100%'); + } else { + fullLayout._modebardiv + .style('width', null) + .style('height', fullLayout.height + 'px'); + } + return Plots.previousPromises(gd); } @@ -42263,7 +42412,6 @@ function assertIndexArray(gd, indices, arrayName) { * @param newIndices */ function checkMoveTracesArgs(gd, currentIndices, newIndices) { - // check that gd has attribute 'data' and 'data' is array if(!Array.isArray(gd.data)) { throw new Error('gd.data must be an array.'); @@ -42289,7 +42437,6 @@ function checkMoveTracesArgs(gd, currentIndices, newIndices) { if(typeof newIndices !== 'undefined' && currentIndices.length !== newIndices.length) { throw new Error('current and new indices must be of equal length.'); } - } /** * A private function to reduce the type checking clutter in addTraces. @@ -42346,7 +42493,6 @@ function checkAddTracesArgs(gd, traces, newIndices) { * @param maxPoints */ function assertExtendTracesArgs(gd, update, indices, maxPoints) { - var maxPointsIsObject = Lib.isPlainObject(maxPoints); if(!Array.isArray(gd.data)) { @@ -42363,7 +42509,6 @@ function assertExtendTracesArgs(gd, update, indices, maxPoints) { assertIndexArray(gd, indices, 'indices'); for(var key in update) { - /* * Verify that the attribute to be updated contains as many trace updates * as indices. Failure must result in throw and no-op @@ -42394,7 +42539,6 @@ function assertExtendTracesArgs(gd, update, indices, maxPoints) { * @return {Object[]} */ function getExtendProperties(gd, update, indices, maxPoints) { - var maxPointsIsObject = Lib.isPlainObject(maxPoints); var updateProps = []; var trace, target, prop, insert, maxp; @@ -42407,9 +42551,7 @@ function getExtendProperties(gd, update, indices, maxPoints) { // loop through all update keys and traces and harvest validated data. for(var key in update) { - for(var j = 0; j < indices.length; j++) { - /* * Choose the trace indexed by the indices map argument and get the prop setter-getter * instance that references the key and value for this particular trace. @@ -42696,12 +42838,10 @@ exports.addTraces = function addTraces(gd, traces, newIndices) { } try { - // this is redundant, but necessary to not catch later possible errors! checkMoveTracesArgs(gd, currentIndices, newIndices); } catch(error) { - // something went wrong, reset gd to be safe and rethrow error gd.data.splice(gd.data.length - traces.length, traces.length); throw error; @@ -42826,7 +42966,6 @@ exports.moveTraces = function moveTraces(gd, currentIndices, newIndices) { // get the traces that aren't being moved around for(i = 0; i < gd.data.length; i++) { - // if index isn't in currentIndices, include it in ignored! if(currentIndices.indexOf(i) === -1) { newData.push(gd.data[i]); @@ -43119,7 +43258,7 @@ function _restyle(gd, aobj, traces) { // and figure out what kind of graphics update we need to do for(var ai in aobj) { if(helpers.hasParent(aobj, ai)) { - throw new Error('cannot set ' + ai + 'and a parent attribute simultaneously'); + throw new Error('cannot set ' + ai + ' and a parent attribute simultaneously'); } var vi = aobj[ai]; @@ -43471,22 +43610,34 @@ exports.relayout = relayout; // Optimization mostly for large splom traces where // Plots.supplyDefaults can take > 100ms function axRangeSupplyDefaultsByPass(gd, flags, specs) { - var k; + var fullLayout = gd._fullLayout; if(!flags.axrange) return false; - for(k in flags) { + for(var k in flags) { if(k !== 'axrange' && flags[k]) return false; } - for(k in specs.rangesAltered) { - var axName = Axes.id2name(k); + for(var axId in specs.rangesAltered) { + var axName = Axes.id2name(axId); var axIn = gd.layout[axName]; - var axOut = gd._fullLayout[axName]; + var axOut = fullLayout[axName]; axOut.autorange = axIn.autorange; axOut.range = axIn.range.slice(); axOut.cleanRange(); + + if(axOut._matchGroup) { + for(var axId2 in axOut._matchGroup) { + if(axId2 !== axId) { + var ax2 = fullLayout[Axes.id2name(axId2)]; + ax2.autorange = axOut.autorange; + ax2.range = axOut.range.slice(); + ax2._input.range = axOut.range.slice(); + } + } + } } + return true; } @@ -43496,20 +43647,37 @@ function addAxRangeSequence(seq, rangesAltered) { // executed after drawData var drawAxes = rangesAltered ? function(gd) { - var opts = {skipTitle: true}; + var axIds = []; + var skipTitle = true; + for(var id in rangesAltered) { - if(Axes.getFromId(gd, id).automargin) { - opts = {}; - break; + var ax = Axes.getFromId(gd, id); + axIds.push(id); + + if(ax._matchGroup) { + for(var id2 in ax._matchGroup) { + if(!rangesAltered[id2]) { + axIds.push(id2); + } + } } + + if(ax.automargin) skipTitle = false; } - return Axes.draw(gd, Object.keys(rangesAltered), opts); + + return Axes.draw(gd, axIds, {skipTitle: skipTitle}); } : function(gd) { return Axes.draw(gd, 'redraw'); }; + var _clearSelect = function(gd) { + var zoomlayer = gd._fullLayout._zoomlayer; + if(zoomlayer) clearSelect(zoomlayer); + }; + seq.push( + _clearSelect, subroutines.doAutoRangeAndConstraints, drawAxes, subroutines.drawData, @@ -43596,7 +43764,7 @@ function _relayout(gd, aobj) { // alter gd.layout for(var ai in aobj) { if(helpers.hasParent(aobj, ai)) { - throw new Error('cannot set ' + ai + 'and a parent attribute simultaneously'); + throw new Error('cannot set ' + ai + ' and a parent attribute simultaneously'); } var p = layoutNP(layout, ai); @@ -43807,6 +43975,9 @@ function _relayout(gd, aobj) { ) { flags.plot = true; } + else if(fullLayout._has('gl2d')) { + flags.plot = true; + } else if(valObject) editTypes.update(flags, valObject); else flags.calc = true; @@ -44025,6 +44196,8 @@ var traceUIControlPatterns = [ // "visible" includes trace.transforms[i].styles[j].value.visible {pattern: /(^|value\.)visible$/, attr: 'legend.uirevision'}, {pattern: /^dimensions\[\d+\]\.constraintrange/}, + {pattern: /^node\.(x|y)/}, // for Sankey nodes + {pattern: /^level$/}, // for Sunburst traces // below this you must be in editable: true mode // TODO: I still put name and title with `trace.uirevision` @@ -44243,7 +44416,6 @@ exports.react = function(gd, data, layout, config) { plotDone = exports.newPlot(gd, data, layout, config); } else { - if(Lib.isPlainObject(data)) { var obj = data; data = obj.data; @@ -44373,7 +44545,6 @@ exports.react = function(gd, data, layout, config) { return gd; }); - }; function diffData(gd, oldFullData, newFullData, immutable, transition, newDataRevision) { @@ -44595,7 +44766,6 @@ function getDiffFlags(oldContainer, newContainer, outerparts, opts) { } else if(canBeDataArray) { if(wasArray && nowArray) { - // don't try to diff two data arrays. If immutable we know the data changed, // if not, assume it didn't and let `layout.datarevision` tell us if it did if(immutable) { @@ -44890,7 +45060,6 @@ exports.animate = function(gd, frameOrGroupNameOrFrameList, animationOpts) { if(newFrame.onComplete) { newFrame.onComplete(); } - }); gd.emit('plotly_animatingframe', { @@ -45154,7 +45323,6 @@ exports.addFrames = function(gd, frameList, indices) { if(typeof frame.name === 'number') { Lib.warn('Warning: addFrames accepts frames with numeric names, but the numbers are' + 'implicitly cast to strings'); - } if(!frame.name) { @@ -45299,6 +45467,7 @@ function makePlotFramework(gd) { .classed('gl-container', true); fullLayout._paperdiv.selectAll('.main-svg').remove(); + fullLayout._paperdiv.select('.modebar-container').remove(); fullLayout._paper = fullLayout._paperdiv.insert('svg', ':first-child') .classed('main-svg', true); @@ -45306,6 +45475,11 @@ function makePlotFramework(gd) { fullLayout._toppaper = fullLayout._paperdiv.append('svg') .classed('main-svg', true); + fullLayout._modebardiv = fullLayout._paperdiv.append('div'); + + fullLayout._hoverpaper = fullLayout._paperdiv.append('svg') + .classed('main-svg', true); + if(!fullLayout._uid) { var otherUids = {}; d3.selectAll('defs').each(function() { @@ -45365,6 +45539,9 @@ function makePlotFramework(gd) { // single pie layer for the whole plot fullLayout._pielayer = fullLayout._paper.append('g').classed('pielayer', true); + // single sunbursrt layer for the whole plot + fullLayout._sunburstlayer = fullLayout._paper.append('g').classed('sunburstlayer', true); + // fill in image server scrape-svg fullLayout._glimages = fullLayout._paper.append('g').classed('glimages', true); @@ -45382,12 +45559,19 @@ function makePlotFramework(gd) { fullLayout._infolayer = fullLayout._toppaper.append('g').classed('infolayer', true); fullLayout._menulayer = fullLayout._toppaper.append('g').classed('menulayer', true); fullLayout._zoomlayer = fullLayout._toppaper.append('g').classed('zoomlayer', true); - fullLayout._hoverlayer = fullLayout._toppaper.append('g').classed('hoverlayer', true); + fullLayout._hoverlayer = fullLayout._hoverpaper.append('g').classed('hoverlayer', true); + + // Make the modebar container + fullLayout._modebardiv + .classed('modebar-container', true) + .style('position', 'absolute') + .style('top', '0px') + .style('right', '0px'); gd.emit('plotly_framework'); } -},{"../components/color":51,"../components/colorbar/connect":53,"../components/drawing":72,"../constants/xmlns_namespaces":150,"../lib":168,"../lib/events":161,"../lib/queue":182,"../lib/svg_text_utils":189,"../plots/cartesian/axes":212,"../plots/cartesian/constants":218,"../plots/cartesian/graph_interact":222,"../plots/plots":245,"../plots/polar/legacy":248,"../registry":257,"./edit_types":195,"./helpers":196,"./manage_arrays":198,"./plot_config":200,"./plot_schema":201,"./subroutines":203,"d3":16,"fast-isnumeric":18,"has-hover":20}],200:[function(_dereq_,module,exports){ +},{"../components/color":51,"../components/colorbar/connect":53,"../components/drawing":72,"../constants/xmlns_namespaces":150,"../lib":168,"../lib/events":161,"../lib/queue":182,"../lib/svg_text_utils":189,"../plots/cartesian/axes":212,"../plots/cartesian/constants":218,"../plots/cartesian/graph_interact":221,"../plots/cartesian/select":229,"../plots/plots":244,"../plots/polar/legacy":247,"../registry":256,"./edit_types":195,"./helpers":196,"./manage_arrays":198,"./plot_config":200,"./plot_schema":201,"./subroutines":203,"d3":16,"fast-isnumeric":18,"has-hover":20}],200:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -46271,7 +46455,6 @@ function formatAttributes(attrs) { } function mergeValTypeAndRole(attrs) { - function makeSrcAttr(attrName) { return { valType: 'string', @@ -46304,7 +46487,6 @@ function mergeValTypeAndRole(attrs) { } function formatArrayContainers(attrs) { - function callback(attr, attrName, attrs) { if(!attr) return; @@ -46370,7 +46552,7 @@ function insertAttrs(baseAttrs, newAttrs, astr) { np.set(extendDeepAll(np.get() || {}, newAttrs)); } -},{"../lib":168,"../plots/animation_attributes":207,"../plots/attributes":209,"../plots/frame_attributes":240,"../plots/layout_attributes":243,"../plots/polar/legacy/area_attributes":246,"../plots/polar/legacy/axis_attributes":247,"../registry":257,"./edit_types":195,"./plot_config":200}],202:[function(_dereq_,module,exports){ +},{"../lib":168,"../plots/animation_attributes":207,"../plots/attributes":209,"../plots/frame_attributes":239,"../plots/layout_attributes":242,"../plots/polar/legacy/area_attributes":245,"../plots/polar/legacy/axis_attributes":246,"../registry":256,"./edit_types":195,"./plot_config":200}],202:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -47287,7 +47469,8 @@ exports.doCamera = function(gd) { var sceneLayout = fullLayout[sceneIds[i]]; var scene = sceneLayout._scene; - scene.setCamera(sceneLayout.camera); + var cameraData = sceneLayout.camera; + scene.setCamera(cameraData); } }; @@ -47384,17 +47567,49 @@ exports.redrawReglTraces = function(gd) { }; exports.doAutoRangeAndConstraints = function(gd) { + var fullLayout = gd._fullLayout; var axList = Axes.list(gd, '', true); + var matchGroups = fullLayout._axisMatchGroups || []; + var ax; for(var i = 0; i < axList.length; i++) { - var ax = axList[i]; + ax = axList[i]; cleanAxisConstraints(gd, ax); - // in case margins changed, update scale - ax.setScale(); doAutoRange(gd, ax); } enforceAxisConstraints(gd); + + groupLoop: + for(var j = 0; j < matchGroups.length; j++) { + var group = matchGroups[j]; + var rng = null; + var id; + + for(id in group) { + ax = Axes.getFromId(gd, id); + if(ax.autorange === false) continue groupLoop; + + if(rng) { + if(rng[0] < rng[1]) { + rng[0] = Math.min(rng[0], ax.range[0]); + rng[1] = Math.max(rng[1], ax.range[1]); + } else { + rng[0] = Math.max(rng[0], ax.range[0]); + rng[1] = Math.min(rng[1], ax.range[1]); + } + } else { + rng = ax.range; + } + } + + for(id in group) { + ax = Axes.getFromId(gd, id); + ax.range = rng.slice(); + ax._input.range = rng.slice(); + ax.setScale(); + } + } }; // An initial paint must be completed before these components can be @@ -47422,7 +47637,7 @@ exports.drawMarginPushers = function(gd) { Registry.getComponentMethod('updatemenus', 'draw')(gd); }; -},{"../components/color":51,"../components/drawing":72,"../components/modebar":110,"../components/titles":139,"../constants/alignment":146,"../lib":168,"../lib/clear_gl_canvases":157,"../plots/cartesian/autorange":211,"../plots/cartesian/axes":212,"../plots/cartesian/constraints":220,"../plots/plots":245,"../registry":257,"d3":16}],204:[function(_dereq_,module,exports){ +},{"../components/color":51,"../components/drawing":72,"../components/modebar":110,"../components/titles":139,"../constants/alignment":146,"../lib":168,"../lib/clear_gl_canvases":157,"../plots/cartesian/autorange":211,"../plots/cartesian/axes":212,"../plots/cartesian/constraints":219,"../plots/plots":244,"../registry":256,"d3":16}],204:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -47897,7 +48112,7 @@ function format(opts) { return opts; } -},{"../lib":168,"../plots/attributes":209,"../plots/plots":245,"./plot_config":200,"./plot_schema":201,"./plot_template":202}],205:[function(_dereq_,module,exports){ +},{"../lib":168,"../plots/attributes":209,"../plots/plots":244,"./plot_config":200,"./plot_schema":201,"./plot_template":202}],205:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -48088,7 +48303,7 @@ function toImage(gd, opts) { module.exports = toImage; -},{"../lib":168,"../snapshot/helpers":261,"../snapshot/svgtoimg":263,"../snapshot/tosvg":265,"./plot_api":199}],206:[function(_dereq_,module,exports){ +},{"../lib":168,"../snapshot/helpers":260,"../snapshot/svgtoimg":262,"../snapshot/tosvg":264,"./plot_api":199}],206:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -48534,7 +48749,7 @@ function convertPathToAttributeString(path) { return astr; } -},{"../lib":168,"../plots/plots":245,"./plot_config":200,"./plot_schema":201}],207:[function(_dereq_,module,exports){ +},{"../lib":168,"../plots/plots":244,"./plot_config":200,"./plot_schema":201}],207:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -49145,6 +49360,8 @@ function concatExtremes(gd, ax) { } function doAutoRange(gd, ax) { + ax.setScale(); + if(ax.autorange) { ax.range = getAutoRange(gd, ax); @@ -49398,7 +49615,7 @@ function goodNumber(v) { function lessOrEqual(v0, v1) { return v0 <= v1; } function greaterOrEqual(v0, v1) { return v0 >= v1; } -},{"../../constants/numerical":149,"../../lib":168,"../../registry":257,"fast-isnumeric":18}],212:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"../../registry":256,"fast-isnumeric":18}],212:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -51203,14 +51420,11 @@ axes.drawOne = function(gd, ax, opts) { // TODO: mirror labels, esp for subplots seq.push(function() { - var labelFns = axes.makeLabelFns(ax, mainLinePosition); return axes.drawLabels(gd, ax, { vals: vals, layer: mainAxLayer, transFn: transFn, - labelXFn: labelFns.labelXFn, - labelYFn: labelFns.labelYFn, - labelAnchorFn: labelFns.labelAnchorFn, + labelFns: axes.makeLabelFns(ax, mainLinePosition) }); }); @@ -51222,8 +51436,6 @@ axes.drawOne = function(gd, ax, opts) { seq.push(function() { labelLength += getLabelLevelSpan(ax, axId + 'tick') + pad; labelLength += ax._tickAngles[axId + 'tick'] ? ax.tickfont.size * LINE_SPACING : 0; - var secondaryPosition = mainLinePosition + labelLength * sgn; - var secondaryLabelFns = axes.makeLabelFns(ax, secondaryPosition); return axes.drawLabels(gd, ax, { vals: getSecondaryLabelVals(ax, vals), @@ -51232,9 +51444,7 @@ axes.drawOne = function(gd, ax, opts) { repositionOnUpdate: true, secondary: true, transFn: transFn, - labelXFn: secondaryLabelFns.labelXFn, - labelYFn: secondaryLabelFns.labelYFn, - labelAnchorFn: secondaryLabelFns.labelAnchorFn, + labelFns: axes.makeLabelFns(ax, mainLinePosition + labelLength * sgn) }); }); @@ -51354,29 +51564,29 @@ axes.drawOne = function(gd, ax, opts) { push = {x: 0, y: 0, r: 0, l: 0, t: 0, b: 0}; var bbox = ax._boundingBox; - var counterAx = mainPlotinfo[counterLetter + 'axis']; + var titleOffset = getTitleOffset(gd, ax); var anchorAxDomainIndex; var offset; switch(axLetter + s) { case 'xb': anchorAxDomainIndex = 0; - offset = bbox.top - counterAx._length - counterAx._offset; + offset = bbox.top - titleOffset; push[s] = bbox.height; break; case 'xt': anchorAxDomainIndex = 1; - offset = counterAx._offset - bbox.bottom; + offset = titleOffset - bbox.bottom; push[s] = bbox.height; break; case 'yl': anchorAxDomainIndex = 0; - offset = counterAx._offset - bbox.right; + offset = titleOffset - bbox.right; push[s] = bbox.width; break; case 'yr': anchorAxDomainIndex = 1; - offset = bbox.left - counterAx._length - counterAx._offset; + offset = bbox.left - titleOffset; push[s] = bbox.width; break; } @@ -51388,9 +51598,34 @@ axes.drawOne = function(gd, ax, opts) { if(push[s] > 0) { push[s] += offset; } + if(ax.title.text !== fullLayout._dfltTitle[axLetter]) { push[s] += ax.title.font.size; } + + if(axLetter === 'x' && bbox.width > 0) { + var rExtra = bbox.right - (ax._offset + ax._length); + if(rExtra > 0) { + push.x = 1; + push.r = rExtra; + } + var lExtra = ax._offset - bbox.left; + if(lExtra > 0) { + push.x = 0; + push.l = lExtra; + } + } else if(axLetter === 'y' && bbox.height > 0) { + var bExtra = bbox.bottom - (ax._offset + ax._length); + if(bExtra > 0) { + push.y = 0; + push.b = bExtra; + } + var tExtra = ax._offset - bbox.top; + if(tExtra > 0) { + push.y = 1; + push.t = tExtra; + } + } } Plots.autoMargin(gd, axAutoMarginID(ax), push); @@ -51579,66 +51814,79 @@ axes.makeTickPath = function(ax, shift, sgn, len) { * @param {number} shift * @param {number} angle [in degrees] ... * @return {object} - * - {fn} labelXFn - * - {fn} labelYFn - * - {fn} labelAnchorFn - * - {number} labelStandoff - * - {number} labelShift + * - {fn} xFn + * - {fn} yFn + * - {fn} anchorFn + * - {fn} heightFn + * - {number} labelStandoff (gap parallel to ticks) + * - {number} labelShift (gap perpendicular to ticks) */ axes.makeLabelFns = function(ax, shift, angle) { var axLetter = ax._id.charAt(0); - var pad = (ax.linewidth || 1) / 2; var ticksOnOutsideLabels = ax.tickson !== 'boundaries' && ax.ticks === 'outside'; - var labelStandoff = ticksOnOutsideLabels ? ax.ticklen : 0; + var labelStandoff = 0; var labelShift = 0; + if(ticksOnOutsideLabels) { + labelStandoff += ax.ticklen; + } if(angle && ax.ticks === 'outside') { var rad = Lib.deg2rad(angle); labelStandoff = ax.ticklen * Math.cos(rad) + 1; labelShift = ax.ticklen * Math.sin(rad); } - if(ax.showticklabels && (ticksOnOutsideLabels || ax.showline)) { labelStandoff += 0.2 * ax.tickfont.size; } + labelStandoff += (ax.linewidth || 1) / 2; - // Used in polar angular label x/y functions - // TODO generalize makeLabelFns so that it just work for angular axes var out = { labelStandoff: labelStandoff, labelShift: labelShift }; var x0, y0, ff, flipIt; + if(axLetter === 'x') { flipIt = ax.side === 'bottom' ? 1 : -1; x0 = labelShift * flipIt; - y0 = shift + (labelStandoff + pad) * flipIt; + y0 = shift + labelStandoff * flipIt; ff = ax.side === 'bottom' ? 1 : -0.2; - out.labelXFn = function(d) { return d.dx + x0; }; - out.labelYFn = function(d) { return d.dy + y0 + d.fontSize * ff; }; - out.labelAnchorFn = function(a) { + out.xFn = function(d) { return d.dx + x0; }; + out.yFn = function(d) { return d.dy + y0 + d.fontSize * ff; }; + out.anchorFn = function(d, a) { if(!isNumeric(a) || a === 0 || a === 180) { return 'middle'; } return (a * flipIt < 0) ? 'end' : 'start'; }; + out.heightFn = function(d, a, h) { + return (a < -60 || a > 60) ? -0.5 * h : + ax.side === 'top' ? -h : + 0; + }; } else if(axLetter === 'y') { flipIt = ax.side === 'right' ? 1 : -1; - x0 = labelStandoff + pad; + x0 = labelStandoff; y0 = -labelShift * flipIt; ff = Math.abs(ax.tickangle) === 90 ? 0.5 : 0; - out.labelXFn = function(d) { return d.dx + shift + (x0 + d.fontSize * ff) * flipIt; }; - out.labelYFn = function(d) { return d.dy + y0 + d.fontSize * MID_SHIFT; }; - out.labelAnchorFn = function(a) { + out.xFn = function(d) { return d.dx + shift + (x0 + d.fontSize * ff) * flipIt; }; + out.yFn = function(d) { return d.dy + y0 + d.fontSize * MID_SHIFT; }; + out.anchorFn = function(d, a) { if(isNumeric(a) && Math.abs(a) === 90) { return 'middle'; } return ax.side === 'right' ? 'start' : 'end'; }; + out.heightFn = function(d, a, h) { + a *= ax.side === 'left' ? 1 : -1; + return a < -30 ? -h : + a < 30 ? -0.5 * h : + 0; + }; } return out; @@ -51813,9 +52061,11 @@ axes.drawZeroLine = function(gd, ax, opts) { * - {boolean} repositionOnUpdate (set to true to reposition update selection) * - {boolean} secondary * - {fn} transFn - * - {fn} labelXFn - * - {fn} labelYFn - * - {fn} labelAnchorFn + * - {object} labelFns + * + {fn} xFn + * + {fn} yFn + * + {fn} anchorFn + * + {fn} heightFn */ axes.drawLabels = function(gd, ax, opts) { opts = opts || {}; @@ -51824,9 +52074,7 @@ axes.drawLabels = function(gd, ax, opts) { var axLetter = axId.charAt(0); var cls = opts.cls || axId + 'tick'; var vals = opts.vals; - var labelXFn = opts.labelXFn; - var labelYFn = opts.labelYFn; - var labelAnchorFn = opts.labelAnchorFn; + var labelFns = opts.labelFns; var tickAngle = opts.secondary ? 0 : ax.tickangle; var lastAngle = (ax._tickAngles || {})[cls]; @@ -51846,7 +52094,7 @@ axes.drawLabels = function(gd, ax, opts) { var newPromise = gd._promises.length; thisLabel - .call(svgTextUtils.positionText, labelXFn(d), labelYFn(d)) + .call(svgTextUtils.positionText, labelFns.xFn(d), labelFns.yFn(d)) .call(Drawing.font, d.font, d.fontSize, d.fontColor) .text(d.text) .call(svgTextUtils.convertToTspans, gd); @@ -51870,47 +52118,26 @@ axes.drawLabels = function(gd, ax, opts) { if(opts.repositionOnUpdate) { tickLabels.each(function(d) { d3.select(this).select('text') - .call(svgTextUtils.positionText, labelXFn(d), labelYFn(d)); + .call(svgTextUtils.positionText, labelFns.xFn(d), labelFns.yFn(d)); }); } - // How much to shift a multi-line label to center it vertically. - function getAnchorHeight(lineCount, lineHeight, angle) { - var h = (lineCount - 1) * lineHeight; - if(axLetter === 'x') { - if(angle < -60 || 60 < angle) { - return -0.5 * h; - } else if(ax.side === 'top') { - return -h; - } - } else { - angle *= ax.side === 'left' ? 1 : -1; - if(angle < -30) { - return -h; - } else if(angle < 30) { - return -0.5 * h; - } - } - return 0; - } - function positionLabels(s, angle) { s.each(function(d) { var thisLabel = d3.select(this); var mathjaxGroup = thisLabel.select('.text-math-group'); - var anchor = labelAnchorFn(angle, d); + var anchor = labelFns.anchorFn(d, angle); var transform = opts.transFn.call(thisLabel.node(), d) + ((isNumeric(angle) && +angle !== 0) ? - (' rotate(' + angle + ',' + labelXFn(d) + ',' + - (labelYFn(d) - d.fontSize / 2) + ')') : + (' rotate(' + angle + ',' + labelFns.xFn(d) + ',' + + (labelFns.yFn(d) - d.fontSize / 2) + ')') : ''); - var anchorHeight = getAnchorHeight( - svgTextUtils.lineCount(thisLabel), - LINE_SPACING * d.fontSize, - isNumeric(angle) ? +angle : 0 - ); + // how much to shift a multi-line label to center it vertically. + var nLines = svgTextUtils.lineCount(thisLabel); + var lineHeight = LINE_SPACING * d.fontSize; + var anchorHeight = labelFns.heightFn(d, isNumeric(angle) ? +angle : 0, (nLines - 1) * lineHeight); if(anchorHeight) { transform += ' translate(0, ' + anchorHeight + ')'; @@ -52063,11 +52290,37 @@ function drawDividers(gd, ax, opts) { .attr('d', opts.path); } +function getTitleOffset(gd, ax) { + var gs = gd._fullLayout._size; + var axLetter = ax._id.charAt(0); + var side = ax.side; + var anchorAxis; + + if(ax.anchor !== 'free') { + anchorAxis = axisIds.getFromId(gd, ax.anchor); + } else if(axLetter === 'x') { + anchorAxis = { + _offset: gs.t + (1 - (ax.position || 0)) * gs.h, + _length: 0 + }; + } else if(axLetter === 'y') { + anchorAxis = { + _offset: gs.l + (ax.position || 0) * gs.w, + _length: 0 + }; + } + + if(side === 'top' || side === 'left') { + return anchorAxis._offset; + } else if(side === 'bottom' || side === 'right') { + return anchorAxis._offset + anchorAxis._length; + } +} + function drawTitle(gd, ax) { var fullLayout = gd._fullLayout; var axId = ax._id; var axLetter = axId.charAt(0); - var gs = fullLayout._size; var fontSize = ax.title.font.size; var titleStandoff; @@ -52078,36 +52331,28 @@ function drawTitle(gd, ax) { titleStandoff = 10 + fontSize * offsetBase + (ax.linewidth ? ax.linewidth - 1 : 0); } - var transform, counterAxis, x, y; + var titleOffset = getTitleOffset(gd, ax); + + var transform, x, y; if(axLetter === 'x') { - counterAxis = (ax.anchor === 'free') ? - {_offset: gs.t + (1 - (ax.position || 0)) * gs.h, _length: 0} : - axisIds.getFromId(gd, ax.anchor); - x = ax._offset + ax._length / 2; if(ax.side === 'top') { y = -titleStandoff - fontSize * (ax.showticklabels ? 1 : 0); } else { - y = counterAxis._length + titleStandoff + - fontSize * (ax.showticklabels ? 1.5 : 0.5); + y = titleStandoff + fontSize * (ax.showticklabels ? 1.5 : 0.5); } - y += counterAxis._offset; + y += titleOffset; } else { - counterAxis = (ax.anchor === 'free') ? - {_offset: gs.l + (ax.position || 0) * gs.w, _length: 0} : - axisIds.getFromId(gd, ax.anchor); - y = ax._offset + ax._length / 2; if(ax.side === 'right') { - x = counterAxis._length + titleStandoff + - fontSize * (ax.showticklabels ? 1 : 0.5); + x = titleStandoff + fontSize * (ax.showticklabels ? 1 : 0.5); } else { x = -titleStandoff - fontSize * (ax.showticklabels ? 0.5 : 0); } - x += counterAxis._offset; + x += titleOffset; transform = {rotate: '-90', offset: 0}; } @@ -52220,14 +52465,16 @@ function hasBarsOrFill(gd, ax) { for(var i = 0; i < fullData.length; i++) { var trace = fullData[i]; - if(trace.visible === true && - (trace.xaxis + trace.yaxis) === subplot && - ( - Registry.traceIs(trace, 'bar') && trace.orientation === {x: 'h', y: 'v'}[axLetter] || - trace.fill && trace.fill.charAt(trace.fill.length - 1) === axLetter - ) - ) { - return true; + if(trace.visible === true && (trace.xaxis + trace.yaxis) === subplot) { + if( + (Registry.traceIs(trace, 'bar') || trace.type === 'waterfall') && + trace.orientation === {x: 'h', y: 'v'}[axLetter] + ) return true; + + if( + trace.fill && + trace.fill.charAt(trace.fill.length - 1) === axLetter + ) return true; } } return false; @@ -52412,7 +52659,7 @@ function isAngular(ax) { return ax._id === 'angularaxis'; } -},{"../../components/color":51,"../../components/drawing":72,"../../components/titles":139,"../../constants/alignment":146,"../../constants/numerical":149,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/plots":245,"../../registry":257,"./autorange":211,"./axis_autotype":213,"./axis_ids":215,"./clean_ticks":217,"./layout_attributes":225,"./set_convert":231,"d3":16,"fast-isnumeric":18}],213:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/drawing":72,"../../components/titles":139,"../../constants/alignment":146,"../../constants/numerical":149,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/plots":244,"../../registry":256,"./autorange":211,"./axis_autotype":213,"./axis_ids":215,"./clean_ticks":217,"./layout_attributes":224,"./set_convert":230,"d3":16,"fast-isnumeric":18}],213:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -52622,7 +52869,7 @@ module.exports = function handleAxisDefaults(containerIn, containerOut, coerce, return containerOut; }; -},{"../../lib":168,"../../registry":257,"./category_order_defaults":216,"./layout_attributes":225,"./line_grid_defaults":227,"./set_convert":231,"./tick_label_defaults":232,"./tick_mark_defaults":233,"./tick_value_defaults":234}],215:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"./category_order_defaults":216,"./layout_attributes":224,"./line_grid_defaults":226,"./set_convert":230,"./tick_label_defaults":231,"./tick_mark_defaults":232,"./tick_value_defaults":233}],215:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -52740,7 +52987,17 @@ exports.idSort = function(id1, id2) { return +(id1.substr(1) || 1) - +(id2.substr(1) || 1); }; -},{"../../registry":257,"./constants":218}],216:[function(_dereq_,module,exports){ +exports.getAxisGroup = function getAxisGroup(fullLayout, axId) { + var matchGroups = fullLayout._axisMatchGroups; + + for(var i = 0; i < matchGroups.length; i++) { + var group = matchGroups[i]; + if(group[axId]) return 'g' + i; + } + return axId; +}; + +},{"../../registry":256,"./constants":218}],216:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -52991,7 +53248,7 @@ module.exports = { traceLayerClasses: [ 'heatmaplayer', 'contourcarpetlayer', 'contourlayer', - 'barlayer', + 'waterfalllayer', 'barlayer', 'carpetlayer', 'violinlayer', 'boxlayer', @@ -53014,23 +53271,29 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Lib = _dereq_('../../lib'); var id2name = _dereq_('./axis_ids').id2name; +var scaleZoom = _dereq_('./scale_zoom'); +var makePadFn = _dereq_('./autorange').makePadFn; +var concatExtremes = _dereq_('./autorange').concatExtremes; +var ALMOST_EQUAL = _dereq_('../../constants/numerical').ALMOST_EQUAL; +var FROM_BL = _dereq_('../../constants/alignment').FROM_BL; -module.exports = function handleConstraintDefaults(containerIn, containerOut, coerce, allAxisIds, layoutOut) { +exports.handleConstraintDefaults = function(containerIn, containerOut, coerce, allAxisIds, layoutOut) { var constraintGroups = layoutOut._axisConstraintGroups; + var matchGroups = layoutOut._axisMatchGroups; + var axId = containerOut._id; + var axLetter = axId.charAt(0); + var splomStash = ((layoutOut._splomAxes || {})[axLetter] || {})[axId] || {}; var thisID = containerOut._id; var letter = thisID.charAt(0); - if(containerOut.fixedrange) return; - // coerce the constraint mechanics even if this axis has no scaleanchor // because it may be the anchor of another axis. - coerce('constrain'); + var constrain = coerce('constrain'); Lib.coerce(containerIn, containerOut, { constraintoward: { valType: 'enumerated', @@ -53039,19 +53302,44 @@ module.exports = function handleConstraintDefaults(containerIn, containerOut, co } }, 'constraintoward'); - if(!containerIn.scaleanchor) return; + var matches, matchOpts; - var constraintOpts = getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut); + if((containerIn.matches || splomStash.matches) && !containerOut.fixedrange) { + matchOpts = getConstraintOpts(matchGroups, thisID, allAxisIds, layoutOut); + matches = Lib.coerce(containerIn, containerOut, { + matches: { + valType: 'enumerated', + values: matchOpts.linkableAxes || [], + dflt: splomStash.matches + } + }, 'matches'); + } - var scaleanchor = Lib.coerce(containerIn, containerOut, { - scaleanchor: { - valType: 'enumerated', - values: constraintOpts.linkableAxes - } - }, 'scaleanchor'); + // 'matches' wins over 'scaleanchor' (for now) + var scaleanchor, scaleOpts; + + if(!matches && containerIn.scaleanchor && !(containerOut.fixedrange && constrain !== 'domain')) { + scaleOpts = getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut, constrain); + scaleanchor = Lib.coerce(containerIn, containerOut, { + scaleanchor: { + valType: 'enumerated', + values: scaleOpts.linkableAxes || [] + } + }, 'scaleanchor'); + } + + if(matches) { + delete containerOut.constrain; + updateConstraintGroups(matchGroups, matchOpts.thisGroup, thisID, matches, 1); + } else if(allAxisIds.indexOf(containerIn.matches) !== -1) { + Lib.warn('ignored ' + containerOut._name + '.matches: "' + + containerIn.matches + '" to avoid either an infinite loop ' + + 'or because the target axis has fixed range.'); + } if(scaleanchor) { var scaleratio = coerce('scaleratio'); + // TODO: I suppose I could do attribute.min: Number.MIN_VALUE to avoid zero, // but that seems hacky. Better way to say "must be a positive number"? // Of course if you use several super-tiny values you could eventually @@ -53059,24 +53347,21 @@ module.exports = function handleConstraintDefaults(containerIn, containerOut, co // Likewise with super-huge values. if(!scaleratio) scaleratio = containerOut.scaleratio = 1; - updateConstraintGroups(constraintGroups, constraintOpts.thisGroup, - thisID, scaleanchor, scaleratio); - } - else if(allAxisIds.indexOf(containerIn.scaleanchor) !== -1) { + updateConstraintGroups(constraintGroups, scaleOpts.thisGroup, thisID, scaleanchor, scaleratio); + } else if(allAxisIds.indexOf(containerIn.scaleanchor) !== -1) { Lib.warn('ignored ' + containerOut._name + '.scaleanchor: "' + containerIn.scaleanchor + '" to avoid either an infinite loop ' + - 'and possibly inconsistent scaleratios, or because the target' + - 'axis has fixed range.'); + 'and possibly inconsistent scaleratios, or because the target ' + + 'axis has fixed range or this axis declares a *matches* constraint.'); } }; -function getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut) { - // If this axis is already part of a constraint group, we can't - // scaleanchor any other axis in that group, or we'd make a loop. - // Filter allAxisIds to enforce this, also matching axis types. - +// If this axis is already part of a constraint group, we can't +// scaleanchor any other axis in that group, or we'd make a loop. +// Filter allAxisIds to enforce this, also matching axis types. +function getConstraintOpts(groups, thisID, allAxisIds, layoutOut, constrain) { + var doesNotConstrainRange = constrain !== 'range'; var thisType = layoutOut[id2name(thisID)].type; - var i, j, idj, axj; var linkableAxes = []; @@ -53085,12 +53370,23 @@ function getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut) { if(idj === thisID) continue; axj = layoutOut[id2name(idj)]; - if(axj.type === thisType && !axj.fixedrange) linkableAxes.push(idj); + if(axj.type === thisType) { + if(!axj.fixedrange) { + linkableAxes.push(idj); + } else if(doesNotConstrainRange && axj.anchor) { + // allow domain constraints on subplots where + // BOTH axes have fixedrange:true and constrain:domain + var counterAxj = layoutOut[id2name(axj.anchor)]; + if(counterAxj.fixedrange) { + linkableAxes.push(idj); + } + } + } } - for(i = 0; i < constraintGroups.length; i++) { - if(constraintGroups[i][thisID]) { - var thisGroup = constraintGroups[i]; + for(i = 0; i < groups.length; i++) { + if(groups[i][thisID]) { + var thisGroup = groups[i]; var linkableAxesNoLoops = []; for(j = 0; j < linkableAxes.length; j++) { @@ -53104,7 +53400,6 @@ function getConstraintOpts(constraintGroups, thisID, allAxisIds, layoutOut) { return {linkableAxes: linkableAxes, thisGroup: null}; } - /* * Add this axis to the axis constraint groups, which is the collection * of axes that are all constrained together on scale. @@ -53159,28 +53454,6 @@ function updateConstraintGroups(constraintGroups, thisGroup, thisID, scaleanchor thisGroup[scaleanchor] = 1; } -},{"../../lib":168,"./axis_ids":215}],220:[function(_dereq_,module,exports){ -/** -* Copyright 2012-2019, Plotly, Inc. -* All rights reserved. -* -* This source code is licensed under the MIT license found in the -* LICENSE file in the root directory of this source tree. -*/ - - -'use strict'; - -var id2name = _dereq_('./axis_ids').id2name; -var scaleZoom = _dereq_('./scale_zoom'); -var makePadFn = _dereq_('./autorange').makePadFn; -var concatExtremes = _dereq_('./autorange').concatExtremes; - -var ALMOST_EQUAL = _dereq_('../../constants/numerical').ALMOST_EQUAL; - -var FROM_BL = _dereq_('../../constants/alignment').FROM_BL; - - exports.enforce = function enforceAxisConstraints(gd) { var fullLayout = gd._fullLayout; var constraintGroups = fullLayout._axisConstraintGroups || []; @@ -53370,7 +53643,7 @@ function updateDomain(ax, factor) { ax.setScale(); } -},{"../../constants/alignment":146,"../../constants/numerical":149,"./autorange":211,"./axis_ids":215,"./scale_zoom":229}],221:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146,"../../constants/numerical":149,"../../lib":168,"./autorange":211,"./axis_ids":215,"./scale_zoom":228}],220:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -53449,12 +53722,12 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { // which are the x/y {ax._id: ax} hash objects and their values // for linked axis relative to this subplot var links; + // similar to `links` but for matching axes + var matches; // set to ew/ns val when active, set to '' when inactive var xActive, yActive; // are all axes in this subplot are fixed? var allFixedRanges; - // is subplot constrained? - var isSubplotConstrained; // do we need to edit x/y ranges? var editX, editY; // graph-wide optimization flags @@ -53492,10 +53765,10 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { yActive = isDirectionActive(yaxes, ns); allFixedRanges = !yActive && !xActive; - links = calcLinks(gd, xaHash, yaHash); - isSubplotConstrained = links.isSubplotConstrained; - editX = ew || isSubplotConstrained; - editY = ns || isSubplotConstrained; + links = calcLinks(gd, gd._fullLayout._axisConstraintGroups, xaHash, yaHash); + matches = calcLinks(gd, gd._fullLayout._axisMatchGroups, xaHash, yaHash); + editX = ew || links.isSubplotConstrained || matches.isSubplotConstrained; + editY = ns || links.isSubplotConstrained || matches.isSubplotConstrained; var fullLayout = gd._fullLayout; hasScatterGl = fullLayout._has('scattergl'); @@ -53653,16 +53926,22 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { dragElement.init(dragOptions); - var x0, - y0, - box, - lum, - path0, - dimmed, - zoomMode, - zb, - corners; - + // x/y px position at start of drag + var x0, y0; + // bbox object of the zoombox + var box; + // luminance of bg behind zoombox + var lum; + // zoombox path outline + var path0; + // is zoombox dimmed (during drag) + var dimmed; + // 'x'-only, 'y' or 'xy' zooming + var zoomMode; + // zoombox d3 selection + var zb; + // zoombox corner d3 selection + var corners; // zoom takes over minDrag, so it also has to take over gd._dragged var zoomDragged; @@ -53678,9 +53957,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { dimmed = false; zoomMode = 'xy'; zoomDragged = false; - zb = makeZoombox(zoomlayer, lum, xs, ys, path0); - corners = makeCorners(zoomlayer, xs, ys); } @@ -53706,22 +53983,36 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { corners.attr('d', 'M0,0Z'); } - if(isSubplotConstrained) { + if(links.isSubplotConstrained) { if(dx > MINZOOM || dy > MINZOOM) { zoomMode = 'xy'; if(dx / pw > dy / ph) { dy = dx * ph / pw; if(y0 > y1) box.t = y0 - dy; else box.b = y0 + dy; - } - else { + } else { dx = dy * pw / ph; if(x0 > x1) box.l = x0 - dx; else box.r = x0 + dx; } corners.attr('d', xyCorners(box)); + } else { + noZoom(); } - else { + } + else if(matches.isSubplotConstrained) { + if(dx > MINZOOM || dy > MINZOOM) { + zoomMode = 'xy'; + + var r0 = Math.min(box.l / pw, (ph - box.b) / ph); + var r1 = Math.max(box.r / pw, (ph - box.t) / ph); + + box.l = r0 * pw; + box.r = r1 * pw; + box.b = (1 - r0) * ph; + box.t = (1 - r1) * ph; + corners.attr('d', xyCorners(box)); + } else { noZoom(); } } @@ -53769,9 +54060,11 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { // TODO: edit linked axes in zoomAxRanges and in dragTail if(zoomMode === 'xy' || zoomMode === 'x') { zoomAxRanges(xaxes, box.l / pw, box.r / pw, updates, links.xaxes); + updateMatchedAxRange('x', updates); } if(zoomMode === 'xy' || zoomMode === 'y') { zoomAxRanges(yaxes, (ph - box.b) / ph, (ph - box.t) / ph, updates, links.yaxes); + updateMatchedAxRange('y', updates); } removeZoombox(gd); @@ -53837,6 +54130,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { for(i = 0; i < xaxes.length; i++) { zoomWheelOneAxis(xaxes[i], xfrac, zoom); } + updateMatchedAxRange('x'); scrollViewBox[2] *= zoom; scrollViewBox[0] += scrollViewBox[2] * xfrac * (1 / zoom - 1); @@ -53847,6 +54141,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { for(i = 0; i < yaxes.length; i++) { zoomWheelOneAxis(yaxes[i], yfrac, zoom); } + updateMatchedAxRange('y'); scrollViewBox[3] *= zoom; scrollViewBox[1] += scrollViewBox[3] * (1 - yfrac) * (1 / zoom - 1); @@ -53883,8 +54178,14 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { gd._fullLayout._replotting = true; if(xActive === 'ew' || yActive === 'ns') { - if(xActive) dragAxList(xaxes, dx); - if(yActive) dragAxList(yaxes, dy); + if(xActive) { + dragAxList(xaxes, dx); + updateMatchedAxRange('x'); + } + if(yActive) { + dragAxList(yaxes, dy); + updateMatchedAxRange('y'); + } updateSubplots([xActive ? -dx : 0, yActive ? -dy : 0, pw, ph]); ticksAndAnnotations(); return; @@ -53915,7 +54216,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { (movedAx._rl[end] - movedAx._rl[otherEnd]); } - if(isSubplotConstrained && xActive && yActive) { + if(links.isSubplotConstrained && xActive && yActive) { // dragging a corner of a constrained subplot: // respect the fixed corner, but harmonize dx and dy var dxySign = ((xActive === 'w') === (yActive === 'n')) ? 1 : -1; @@ -53935,7 +54236,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { var x0 = (xActive === 'w') ? dx : 0; var y0 = (yActive === 'n') ? dy : 0; - if(isSubplotConstrained) { + if(links.isSubplotConstrained) { var i; if(!xActive && yActive.length === 1) { // dragging one end of the y axis of a constrained subplot @@ -53957,10 +54258,39 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { } } + updateMatchedAxRange('x'); + updateMatchedAxRange('y'); updateSubplots([x0, y0, pw - dx, ph - dy]); ticksAndAnnotations(); } + function updateMatchedAxRange(axLetter, out) { + var matchedAxes = matches.isSubplotConstrained ? + {x: yaxes, y: xaxes}[axLetter] : + matches[axLetter + 'axes']; + + var constrainedAxes = matches.isSubplotConstrained ? + {x: xaxes, y: yaxes}[axLetter] : + []; + + for(var i = 0; i < matchedAxes.length; i++) { + var ax = matchedAxes[i]; + var axId = ax._id; + var axId2 = matches.xLinks[axId] || matches.yLinks[axId]; + var ax2 = constrainedAxes[0] || xaHash[axId2] || yaHash[axId2]; + + if(ax2) { + var rng = ax2.range; + if(out) { + out[ax._name + '.range[0]'] = rng[0]; + out[ax._name + '.range[1]'] = rng[1]; + } else { + ax.range = rng; + } + } + } + } + // Draw ticks and annotations (and other components) when ranges change. // Also records the ranges that have changed for use by update at the end. function ticksAndAnnotations() { @@ -53976,10 +54306,12 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { if(editX) { pushActiveAxIds(xaxes); pushActiveAxIds(links.xaxes); + pushActiveAxIds(matches.xaxes); } if(editY) { pushActiveAxIds(yaxes); pushActiveAxIds(links.yaxes); + pushActiveAxIds(matches.yaxes); } updates = {}; @@ -53998,9 +54330,14 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { if(gd._transitioningWithDuration) return; var doubleClickConfig = gd._context.doubleClick; - var axList = (xActive ? xaxes : []).concat(yActive ? yaxes : []); - var attrs = {}; + var axList = []; + if(xActive) axList = axList.concat(xaxes); + if(yActive) axList = axList.concat(yaxes); + if(matches.xaxes) axList = axList.concat(matches.xaxes); + if(matches.yaxes) axList = axList.concat(matches.yaxes); + + var attrs = {}; var ax, i, rangeInitial; // For reset+autosize mode: @@ -54009,7 +54346,6 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { // doubleClickConfig === 'reset' below), we reset. // If they are *all* at their initial ranges, then we autosize. if(doubleClickConfig === 'reset+autosize') { - doubleClickConfig = 'autosize'; for(i = 0; i < axList.length; i++) { @@ -54037,10 +54373,10 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { else if(doubleClickConfig === 'reset') { // when we're resetting, reset all linked axes too, so we get back // to the fully-auto-with-constraints situation - if(xActive || isSubplotConstrained) axList = axList.concat(links.xaxes); - if(yActive && !isSubplotConstrained) axList = axList.concat(links.yaxes); + if(xActive || links.isSubplotConstrained) axList = axList.concat(links.xaxes); + if(yActive && !links.isSubplotConstrained) axList = axList.concat(links.yaxes); - if(isSubplotConstrained) { + if(links.isSubplotConstrained) { if(!xActive) axList = axList.concat(xaxes); else if(!yActive) axList = axList.concat(yaxes); } @@ -54082,10 +54418,6 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { ], gd); } - // x/y scaleFactor stash, - // minimizes number of per-point DOM updates in updateSubplots below - var xScaleFactorOld, yScaleFactorOld; - // updateSubplots - find all plot viewboxes that should be // affected by this drag, and update them. look for all plots // sharing an affected axis (including the one being dragged), @@ -54137,6 +54469,14 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { if(editX2) { xScaleFactor2 = xScaleFactor; clipDx = ew ? viewBox[0] : getShift(xa, xScaleFactor2); + } else if(matches.xaHash[xa._id]) { + xScaleFactor2 = xScaleFactor; + clipDx = viewBox[0] * xa._length / xa0._length; + } else if(matches.yaHash[xa._id]) { + xScaleFactor2 = yScaleFactor; + clipDx = yActive === 'ns' ? + -viewBox[1] * xa._length / ya0._length : + getShift(xa, xScaleFactor2, {n: 'top', s: 'bottom'}[yActive]); } else { xScaleFactor2 = getLinkedScaleFactor(xa, xScaleFactor, yScaleFactor); clipDx = scaleAndGetShift(xa, xScaleFactor2); @@ -54145,6 +54485,14 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { if(editY2) { yScaleFactor2 = yScaleFactor; clipDy = ns ? viewBox[1] : getShift(ya, yScaleFactor2); + } else if(matches.yaHash[ya._id]) { + yScaleFactor2 = yScaleFactor; + clipDy = viewBox[1] * ya._length / ya0._length; + } else if(matches.xaHash[ya._id]) { + yScaleFactor2 = xScaleFactor; + clipDy = xActive === 'ew' ? + -viewBox[0] * ya._length / xa0._length : + getShift(ya, yScaleFactor2, {e: 'right', w: 'left'}[xActive]); } else { yScaleFactor2 = getLinkedScaleFactor(ya, xScaleFactor, yScaleFactor); clipDy = scaleAndGetShift(ya, yScaleFactor2); @@ -54178,7 +54526,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { // the scale of the trace group. // apply only when scale changes, as adjusting the scale of // all the points can be expansive. - if(xScaleFactor2 !== xScaleFactorOld || yScaleFactor2 !== yScaleFactorOld) { + if(xScaleFactor2 !== sp.xScaleFactor || yScaleFactor2 !== sp.yScaleFactor) { Drawing.setPointGroupScale(sp.zoomScalePts, xScaleFactor2, yScaleFactor2); Drawing.setTextPointsScale(sp.zoomScaleTxt, xScaleFactor2, yScaleFactor2); } @@ -54186,8 +54534,8 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { Drawing.hideOutsideRangePoints(sp.clipOnAxisFalseTraces, sp); // update x/y scaleFactor stash - xScaleFactorOld = xScaleFactor2; - yScaleFactorOld = yScaleFactor2; + sp.xScaleFactor = xScaleFactor2; + sp.yScaleFactor = yScaleFactor2; } } } @@ -54201,7 +54549,7 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { if(editX && links.xaHash[ax._id]) { return xScaleFactor; } - if(editY && (isSubplotConstrained ? links.xaHash : links.yaHash)[ax._id]) { + if(editY && (links.isSubplotConstrained ? links.xaHash : links.yaHash)[ax._id]) { return yScaleFactor; } return 0; @@ -54216,8 +54564,8 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) { return 0; } - function getShift(ax, scaleFactor) { - return ax._length * (1 - scaleFactor) * FROM_TL[ax.constraintoward || 'middle']; + function getShift(ax, scaleFactor, from) { + return ax._length * (1 - scaleFactor) * FROM_TL[from || ax.constraintoward || 'middle']; } return dragger; @@ -54270,17 +54618,12 @@ function getEndText(ax, end) { } function zoomAxRanges(axList, r0Fraction, r1Fraction, updates, linkedAxes) { - var i, - axi, - axRangeLinear0, - axRangeLinearSpan; - - for(i = 0; i < axList.length; i++) { - axi = axList[i]; + for(var i = 0; i < axList.length; i++) { + var axi = axList[i]; if(axi.fixedrange) continue; - axRangeLinear0 = axi._rl[0]; - axRangeLinearSpan = axi._rl[1] - axRangeLinear0; + var axRangeLinear0 = axi._rl[0]; + var axRangeLinearSpan = axi._rl[1] - axRangeLinear0; axi.range = [ axi.l2r(axRangeLinear0 + axRangeLinearSpan * r0Fraction), axi.l2r(axRangeLinear0 + axRangeLinearSpan * r1Fraction) @@ -54293,8 +54636,7 @@ function zoomAxRanges(axList, r0Fraction, r1Fraction, updates, linkedAxes) { // zoom linked axes about their centers if(linkedAxes && linkedAxes.length) { var linkedR0Fraction = (r0Fraction + (1 - r1Fraction)) / 2; - - zoomAxRanges(linkedAxes, linkedR0Fraction, 1 - linkedR0Fraction, updates); + zoomAxRanges(linkedAxes, linkedR0Fraction, 1 - linkedR0Fraction, updates, [], []); } } @@ -54421,15 +54763,14 @@ function xyCorners(box) { 'h' + clen + 'v3h-' + (clen + 3) + 'Z'; } -function calcLinks(gd, xaHash, yaHash) { - var constraintGroups = gd._fullLayout._axisConstraintGroups; +function calcLinks(gd, groups, xaHash, yaHash) { var isSubplotConstrained = false; var xLinks = {}; var yLinks = {}; var xID, yID, xLinkID, yLinkID; - for(var i = 0; i < constraintGroups.length; i++) { - var group = constraintGroups[i]; + for(var i = 0; i < groups.length; i++) { + var group = groups[i]; // check if any of the x axes we're dragging is in this constraint group for(xID in xaHash) { if(group[xID]) { @@ -54438,7 +54779,7 @@ function calcLinks(gd, xaHash, yaHash) { // to match the changes in the dragged x axes for(xLinkID in group) { if(!(xLinkID.charAt(0) === 'x' ? xaHash : yaHash)[xLinkID]) { - xLinks[xLinkID] = 1; + xLinks[xLinkID] = xID; } } @@ -54455,7 +54796,7 @@ function calcLinks(gd, xaHash, yaHash) { if(group[yID]) { for(yLinkID in group) { if(!(yLinkID.charAt(0) === 'x' ? xaHash : yaHash)[yLinkID]) { - yLinks[yLinkID] = 1; + yLinks[yLinkID] = yID; } } } @@ -54491,6 +54832,8 @@ function calcLinks(gd, xaHash, yaHash) { yaHash: yaHashLinked, xaxes: xaxesLinked, yaxes: yaxesLinked, + xLinks: xLinks, + yLinks: yLinks, isSubplotConstrained: isSubplotConstrained }; } @@ -54536,7 +54879,7 @@ module.exports = { attachWheelEventHandler: attachWheelEventHandler }; -},{"../../components/color":51,"../../components/dragelement":69,"../../components/drawing":72,"../../components/fx":90,"../../constants/alignment":146,"../../lib":168,"../../lib/clear_gl_canvases":157,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plot_api/subroutines":203,"../../registry":257,"../plots":245,"./axes":212,"./axis_ids":215,"./constants":218,"./scale_zoom":229,"./select":230,"d3":16,"has-passive-events":21,"tinycolor2":34}],222:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/dragelement":69,"../../components/drawing":72,"../../components/fx":90,"../../constants/alignment":146,"../../lib":168,"../../lib/clear_gl_canvases":157,"../../lib/setcursor":187,"../../lib/svg_text_utils":189,"../../plot_api/subroutines":203,"../../registry":256,"../plots":244,"./axes":212,"./axis_ids":215,"./constants":218,"./scale_zoom":228,"./select":229,"d3":16,"has-passive-events":21,"tinycolor2":34}],221:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -54704,7 +55047,7 @@ exports.updateFx = function(gd) { setCursor(fullLayout._draggers, cursor); }; -},{"../../components/dragelement":69,"../../components/fx":90,"../../lib/setcursor":187,"./constants":218,"./dragbox":221,"d3":16}],223:[function(_dereq_,module,exports){ +},{"../../components/dragelement":69,"../../components/fx":90,"../../lib/setcursor":187,"./constants":218,"./dragbox":220,"d3":16}],222:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -54779,7 +55122,7 @@ module.exports = function makeIncludeComponents(containerArrayName) { }; }; -},{"../../lib":168,"../../registry":257}],224:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],223:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -55043,7 +55386,7 @@ function plotOne(gd, plotinfo, cdSubplot, transitionOpts, makeOnCompleteCallback ); // layers that allow `cliponaxis: false` - if(className !== 'scatterlayer' && className !== 'barlayer') { + if(className !== 'scatterlayer' && className !== 'barlayer' && className !== 'waterfalllayer') { Drawing.setClipUrl(sel, plotinfo.layerClipId, gd); } }); @@ -55059,7 +55402,7 @@ function plotOne(gd, plotinfo, cdSubplot, transitionOpts, makeOnCompleteCallback if(!gd._context.staticPlot) { if(plotinfo._hasClipOnAxisFalse) { plotinfo.clipOnAxisFalseTraces = plotinfo.plot - .selectAll('.scatterlayer, .barlayer') + .selectAll('.scatterlayer, .barlayer, .waterfalllayer') .selectAll('.trace'); } @@ -55402,7 +55745,7 @@ exports.toSVG = function(gd) { exports.updateFx = _dereq_('./graph_interact').updateFx; -},{"../../components/drawing":72,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../registry":257,"../get_data":241,"../plots":245,"./attributes":210,"./axis_ids":215,"./constants":218,"./graph_interact":222,"./layout_attributes":225,"./layout_defaults":226,"./transition_axes":235,"d3":16}],225:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../registry":256,"../get_data":240,"../plots":244,"./attributes":210,"./axis_ids":215,"./constants":218,"./graph_interact":221,"./layout_attributes":224,"./layout_defaults":225,"./transition_axes":234,"d3":16}],224:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -55536,6 +55879,16 @@ module.exports = { editType: 'plot', + }, + matches: { + valType: 'enumerated', + values: [ + constants.idRegex.x.toString(), + constants.idRegex.y.toString() + ], + + editType: 'calc', + }, // ticks tickmode: { @@ -55979,7 +56332,7 @@ module.exports = { } }; -},{"../../components/color/attributes":50,"../../components/drawing/attributes":71,"../../lib/extend":162,"../../plot_api/plot_template":202,"../font_attributes":239,"./constants":218}],226:[function(_dereq_,module,exports){ +},{"../../components/color/attributes":50,"../../components/drawing/attributes":71,"../../lib/extend":162,"../../plot_api/plot_template":202,"../font_attributes":238,"./constants":218}],225:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -55999,7 +56352,7 @@ var basePlotLayoutAttributes = _dereq_('../layout_attributes'); var layoutAttributes = _dereq_('./layout_attributes'); var handleTypeDefaults = _dereq_('./type_defaults'); var handleAxisDefaults = _dereq_('./axis_defaults'); -var handleConstraintDefaults = _dereq_('./constraint_defaults'); +var handleConstraintDefaults = _dereq_('./constraints').handleConstraintDefaults; var handlePositionDefaults = _dereq_('./position_defaults'); var axisIds = _dereq_('./axis_ids'); @@ -56106,6 +56459,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { } var counterAxes = {x: getCounterAxes('x'), y: getCounterAxes('y')}; + var allAxisIds = counterAxes.x.concat(counterAxes.y); function getOverlayableAxes(axLetter, axName) { var list = (axLetter === 'x') ? xNames : yNames; @@ -56181,14 +56535,12 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { delete axLayoutOut.spikesnap; } - var positioningOptions = { + handlePositionDefaults(axLayoutIn, axLayoutOut, coerce, { letter: axLetter, counterAxes: counterAxes[axLetter], overlayableAxes: overlayableAxes, grid: layoutOut.grid - }; - - handlePositionDefaults(axLayoutIn, axLayoutOut, coerce, positioningOptions); + }); axLayoutOut._input = axLayoutIn; } @@ -56229,27 +56581,85 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { coerce('fixedrange', fixedRangeDflt); } - // Finally, handle scale constraints. We need to do this after all axes have - // coerced both `type` (so we link only axes of the same type) and + // Finally, handle scale constraints and matching axes. + // + // We need to do this after all axes have coerced both `type` + // (so we link only axes of the same type) and // `fixedrange` (so we can avoid linking from OR TO a fixed axis). // sets of axes linked by `scaleanchor` along with the scaleratios compounded // together, populated in handleConstraintDefaults - layoutOut._axisConstraintGroups = []; - var allAxisIds = counterAxes.x.concat(counterAxes.y); + var constraintGroups = layoutOut._axisConstraintGroups = []; + // similar to _axisConstraintGroups, but for matching axes + var matchGroups = layoutOut._axisMatchGroups = []; for(i = 0; i < axNames.length; i++) { axName = axNames[i]; axLetter = axName.charAt(0); - axLayoutIn = layoutIn[axName]; axLayoutOut = layoutOut[axName]; handleConstraintDefaults(axLayoutIn, axLayoutOut, coerce, allAxisIds, layoutOut); } + + for(i = 0; i < matchGroups.length; i++) { + var group = matchGroups[i]; + var rng = null; + var autorange = null; + var axId; + + // find 'matching' range attrs + for(axId in group) { + axLayoutOut = layoutOut[id2name(axId)]; + if(!axLayoutOut.matches) { + rng = axLayoutOut.range; + autorange = axLayoutOut.autorange; + } + } + // if `ax.matches` values are reciprocal, + // pick values of first axis in group + if(rng === null || autorange === null) { + for(axId in group) { + axLayoutOut = layoutOut[id2name(axId)]; + rng = axLayoutOut.range; + autorange = axLayoutOut.autorange; + break; + } + } + // apply matching range attrs + for(axId in group) { + axLayoutOut = layoutOut[id2name(axId)]; + if(axLayoutOut.matches) { + axLayoutOut.range = rng.slice(); + axLayoutOut.autorange = autorange; + } + axLayoutOut._matchGroup = group; + } + + // remove matching axis from scaleanchor constraint groups (for now) + if(constraintGroups.length) { + for(axId in group) { + for(j = 0; j < constraintGroups.length; j++) { + var group2 = constraintGroups[j]; + for(var axId2 in group2) { + if(axId === axId2) { + Lib.warn('Axis ' + axId2 + ' is set with both ' + + 'a *scaleanchor* and *matches* constraint; ' + + 'ignoring the scale constraint.'); + + delete group2[axId2]; + if(Object.keys(group2).length < 2) { + constraintGroups.splice(j, 1); + } + } + } + } + } + } + } }; -},{"../../components/color":51,"../../lib":168,"../../plot_api/plot_template":202,"../../registry":257,"../layout_attributes":243,"./axis_defaults":214,"./axis_ids":215,"./constraint_defaults":219,"./layout_attributes":225,"./position_defaults":228,"./type_defaults":236}],227:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../../plot_api/plot_template":202,"../../registry":256,"../layout_attributes":242,"./axis_defaults":214,"./axis_ids":215,"./constraints":219,"./layout_attributes":224,"./position_defaults":227,"./type_defaults":235}],226:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -56314,7 +56724,7 @@ module.exports = function handleLineGridDefaults(containerIn, containerOut, coer } }; -},{"../../components/color/attributes":50,"../../lib":168,"tinycolor2":34}],228:[function(_dereq_,module,exports){ +},{"../../components/color/attributes":50,"../../lib":168,"tinycolor2":34}],227:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -56402,7 +56812,7 @@ module.exports = function handlePositionDefaults(containerIn, containerOut, coer return containerOut; }; -},{"../../lib":168,"fast-isnumeric":18}],229:[function(_dereq_,module,exports){ +},{"../../lib":168,"fast-isnumeric":18}],228:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -56430,7 +56840,7 @@ module.exports = function scaleZoom(ax, factor, centerFraction) { ]; }; -},{"../../constants/alignment":146}],230:[function(_dereq_,module,exports){ +},{"../../constants/alignment":146}],229:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -56586,7 +56996,6 @@ function prepSelect(e, startX, startY, dragOptions, mode) { 'h-4v' + (2 * MINSELECT) + 'h4Z' + 'M' + (currentPolygon.xmax - 1) + ',' + (y0 - MINSELECT) + 'h4v' + (2 * MINSELECT) + 'h-4Z'); - } else if(direction === 'v') { // vertical motion: make a horizontal box @@ -57004,7 +57413,6 @@ function extractClickedPtInfo(hoverData, searchTraces) { for(i = 0; i < searchTraces.length; i++) { searchInfo = searchTraces[i]; if(hoverDatum.fullData._expandedIndex === searchInfo.cd[0].trace._expandedIndex) { - // Special case for box (and violin) if(hoverDatum.hoverOnBox === true) { break; @@ -57222,7 +57630,7 @@ module.exports = { selectOnClick: selectOnClick }; -},{"../../components/color":51,"../../components/fx":90,"../../components/fx/helpers":86,"../../lib/clear_gl_canvases":157,"../../lib/polygon":180,"../../lib/throttle":190,"../../plot_api/subroutines":203,"../../registry":257,"./axis_ids":215,"./constants":218,"polybooljs":25}],231:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/fx":90,"../../components/fx/helpers":86,"../../lib/clear_gl_canvases":157,"../../lib/polygon":180,"../../lib/throttle":190,"../../plot_api/subroutines":203,"../../registry":256,"./axis_ids":215,"./constants":218,"polybooljs":25}],230:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -57231,7 +57639,6 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var d3 = _dereq_('d3'); @@ -57288,7 +57695,8 @@ function isValidCategory(v) { module.exports = function setConvert(ax, fullLayout) { fullLayout = fullLayout || {}; - var axLetter = (ax._id || 'x').charAt(0); + var axId = (ax._id || 'x'); + var axLetter = axId.charAt(0); function toLog(v, clip) { if(v > 0) return Math.log(v) / Math.LN10; @@ -57532,10 +57940,25 @@ module.exports = function setConvert(ax, fullLayout) { var traceIndices = ax._traceIndices; var i, j; + var matchGroups = fullLayout._axisMatchGroups; + if(matchGroups && matchGroups.length && ax._categories.length === 0) { + for(i = 0; i < matchGroups.length; i++) { + var group = matchGroups[i]; + if(group[axId]) { + for(var axId2 in group) { + if(axId2 !== axId) { + var ax2 = fullLayout[axisIds.id2name(axId2)]; + traceIndices = traceIndices.concat(ax2._traceIndices); + } + } + } + } + } + // [ [cnt, {$cat: index}], for 1,2 ] - var seen = ax._multicatSeen = [[0, {}], [0, {}]]; + var seen = [[0, {}], [0, {}]]; // [ [arrayIn[0][i], arrayIn[1][i]], for i .. N ] - var list = ax._multicatList = []; + var list = []; for(i = 0; i < traceIndices.length; i++) { var trace = fullData[traceIndices[i]]; @@ -57694,15 +58117,14 @@ module.exports = function setConvert(ax, fullLayout) { ax._length = gs.h * (ax.domain[1] - ax.domain[0]); ax._m = ax._length / (rl0 - rl1); ax._b = -ax._m * rl1; - } - else { + } else { ax._offset = gs.l + ax.domain[0] * gs.w; ax._length = gs.w * (ax.domain[1] - ax.domain[0]); ax._m = ax._length / (rl1 - rl0); ax._b = -ax._m * rl0; } - if(!isFinite(ax._m) || !isFinite(ax._b)) { + if(!isFinite(ax._m) || !isFinite(ax._b) || ax._length < 0) { fullLayout._replotting = false; throw new Error('Something went wrong with axis scaling'); } @@ -57783,15 +58205,53 @@ module.exports = function setConvert(ax, fullLayout) { } }; + // should skip if not category nor multicategory ax.clearCalc = function() { - // initialize the category list, if there is one, so we start over - // to be filled in later by ax.d2c - ax._categories = (ax._initialCategories || []).slice(); + var emptyCategories = function() { + ax._categories = []; + ax._categoriesMap = {}; + }; - // Build the lookup map for initialized categories - ax._categoriesMap = {}; - for(var j = 0; j < ax._categories.length; j++) { - ax._categoriesMap[ax._categories[j]] = j; + var matchGroups = fullLayout._axisMatchGroups; + + if(matchGroups && matchGroups.length) { + var found = false; + + for(var i = 0; i < matchGroups.length; i++) { + var group = matchGroups[i]; + + if(group[axId]) { + found = true; + var categories = null; + var categoriesMap = null; + + for(var axId2 in group) { + var ax2 = fullLayout[axisIds.id2name(axId2)]; + if(ax2._categories) { + categories = ax2._categories; + categoriesMap = ax2._categoriesMap; + break; + } + } + + if(categories && categoriesMap) { + ax._categories = categories; + ax._categoriesMap = categoriesMap; + } else { + emptyCategories(); + } + break; + } + } + if(!found) emptyCategories(); + } else { + emptyCategories(); + } + + if(ax._initialCategories) { + for(var j = 0; j < ax._initialCategories.length; j++) { + setCategoryIndex(ax._initialCategories[j]); + } } }; @@ -57815,7 +58275,7 @@ module.exports = function setConvert(ax, fullLayout) { delete ax._forceTick0; }; -},{"../../constants/numerical":149,"../../lib":168,"./axis_ids":215,"./constants":218,"d3":16,"fast-isnumeric":18}],232:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"./axis_ids":215,"./constants":218,"d3":16,"fast-isnumeric":18}],231:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -57914,7 +58374,7 @@ function tickformatstopDefaults(valueIn, valueOut) { } } -},{"../../lib":168,"../array_container_defaults":208,"./layout_attributes":225}],233:[function(_dereq_,module,exports){ +},{"../../lib":168,"../array_container_defaults":208,"./layout_attributes":224}],232:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -57947,7 +58407,7 @@ module.exports = function handleTickDefaults(containerIn, containerOut, coerce, } }; -},{"../../lib":168,"./layout_attributes":225}],234:[function(_dereq_,module,exports){ +},{"../../lib":168,"./layout_attributes":224}],233:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -57989,7 +58449,7 @@ module.exports = function handleTickValueDefaults(containerIn, containerOut, coe } }; -},{"./clean_ticks":217}],235:[function(_dereq_,module,exports){ +},{"./clean_ticks":217}],234:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58199,7 +58659,7 @@ module.exports = function transitionAxes(gd, edits, transitionOpts, makeOnComple return Promise.resolve(); }; -},{"../../components/drawing":72,"../../registry":257,"./axes":212,"d3":16}],236:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../registry":256,"./axes":212,"d3":16}],235:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58337,7 +58797,7 @@ function isBoxWithoutPositionCoords(trace, axLetter) { ); } -},{"../../registry":257,"./axis_autotype":213}],237:[function(_dereq_,module,exports){ +},{"../../registry":256,"./axis_autotype":213}],236:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58398,8 +58858,6 @@ exports.manageCommandObserver = function(gd, container, commandList, onchange) { // table should have been updated and check is already attached, // so there's nothing to be done: return ret; - - } } @@ -58761,7 +59219,7 @@ function crawl(attrs, callback, path, depth) { }); } -},{"../lib":168,"../registry":257}],238:[function(_dereq_,module,exports){ +},{"../lib":168,"../registry":256}],237:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58869,7 +59327,7 @@ exports.defaults = function(containerOut, layout, coerce, dfltDomains) { coerce('domain.y', dfltY); }; -},{"../lib/extend":162}],239:[function(_dereq_,module,exports){ +},{"../lib/extend":162}],238:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58934,7 +59392,7 @@ module.exports = function(opts) { return attrs; }; -},{}],240:[function(_dereq_,module,exports){ +},{}],239:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -58980,7 +59438,7 @@ module.exports = { } }; -},{}],241:[function(_dereq_,module,exports){ +},{}],240:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -59108,7 +59566,7 @@ exports.getSubplotData = function getSubplotData(data, type, subplotId) { return subplotData; }; -},{"../registry":257,"./cartesian/constants":218}],242:[function(_dereq_,module,exports){ +},{"../registry":256,"./cartesian/constants":218}],241:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -59142,7 +59600,7 @@ function project(camera, v) { module.exports = project; -},{}],243:[function(_dereq_,module,exports){ +},{}],242:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -59446,7 +59904,7 @@ module.exports = { } }; -},{"../components/color/attributes":50,"../components/colorscale/layout_attributes":64,"../lib/extend":162,"./animation_attributes":207,"./font_attributes":239,"./pad_attributes":244}],244:[function(_dereq_,module,exports){ +},{"../components/color/attributes":50,"../components/colorscale/layout_attributes":64,"../lib/extend":162,"./animation_attributes":207,"./font_attributes":238,"./pad_attributes":243}],243:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -59501,7 +59959,7 @@ module.exports = function(opts) { }; }; -},{}],245:[function(_dereq_,module,exports){ +},{}],244:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -59580,7 +60038,6 @@ plots.resize = function(gd) { gd = Lib.getGraphDiv(gd); return new Promise(function(resolve, reject) { - function isHidden(gd) { var display = window.getComputedStyle(gd).display; return !display || display === 'none'; @@ -59843,7 +60300,6 @@ plots.supplyDefaults = function(gd, opts) { // first fill in what we can of layout without looking at data // because fullData needs a few things from layout if(oldFullLayout._initialAutoSizeIsDone) { - // coerce the updated layout while preserving width and height var oldWidth = oldFullLayout.width; var oldHeight = oldFullLayout.height; @@ -59855,7 +60311,6 @@ plots.supplyDefaults = function(gd, opts) { plots.sanitizeMargins(newFullLayout); } else { - // coerce the updated layout and autosize if needed plots.supplyLayoutGlobalDefaults(newLayout, newFullLayout, formatObj); @@ -59898,6 +60353,8 @@ plots.supplyDefaults = function(gd, opts) { newFullLayout._scatterStackOpts = {}; // for the first scatter trace on each subplot (so it knows tonext->tozero) newFullLayout._firstScatter = {}; + // for grouped bar/box/violin trace to share config across traces + newFullLayout._alignmentOpts = {}; // for traces to request a default rangeslider on their x axes // eg set `_requestRangeslider.x2 = true` for xaxis2 @@ -61343,11 +61800,12 @@ plots.doAutoMargin = function(gd) { var mr = margin.r; var mt = margin.t; var mb = margin.b; + var width = fullLayout.width; + var height = fullLayout.height; var pushMargin = fullLayout._pushmargin; var pushMarginIds = fullLayout._pushmarginIds; if(fullLayout.margin.autoexpand !== false) { - for(var k in pushMargin) { if(!pushMarginIds[k]) delete pushMargin[k]; } @@ -61364,7 +61822,6 @@ plots.doAutoMargin = function(gd) { // (and t and b) to find the required margins for(var k1 in pushMargin) { - var pushleft = pushMargin[k1].l || {}; var pushbottom = pushMargin[k1].b || {}; var fl = pushleft.val; @@ -61378,13 +61835,11 @@ plots.doAutoMargin = function(gd) { var pr = pushMargin[k2].r.size; if(fr > fl) { - var newl = (pl * fr + - (pr - fullLayout.width) * fl) / (fr - fl); - var newr = (pr * (1 - fl) + - (pl - fullLayout.width) * (1 - fr)) / (fr - fl); - if(newl >= 0 && newr >= 0 && newl + newr > ml + mr) { - ml = newl; - mr = newr; + var newL = (pl * fr + (pr - width) * fl) / (fr - fl); + var newR = (pr * (1 - fl) + (pl - width) * (1 - fr)) / (fr - fl); + if(newL >= 0 && newR >= 0 && width - (newL + newR) > 0 && newL + newR > ml + mr) { + ml = newL; + mr = newR; } } } @@ -61394,13 +61849,11 @@ plots.doAutoMargin = function(gd) { var pt = pushMargin[k2].t.size; if(ft > fb) { - var newb = (pb * ft + - (pt - fullLayout.height) * fb) / (ft - fb); - var newt = (pt * (1 - fb) + - (pb - fullLayout.height) * (1 - ft)) / (ft - fb); - if(newb >= 0 && newt >= 0 && newb + newt > mb + mt) { - mb = newb; - mt = newt; + var newB = (pb * ft + (pt - height) * fb) / (ft - fb); + var newT = (pt * (1 - fb) + (pb - height) * (1 - ft)) / (ft - fb); + if(newB >= 0 && newT >= 0 && height - (newT + newB) > 0 && newB + newT > mb + mt) { + mb = newB; + mt = newT; } } } @@ -61413,8 +61866,8 @@ plots.doAutoMargin = function(gd) { gs.t = Math.round(mt); gs.b = Math.round(mb); gs.p = Math.round(margin.pad); - gs.w = Math.round(fullLayout.width) - gs.l - gs.r; - gs.h = Math.round(fullLayout.height) - gs.t - gs.b; + gs.w = Math.round(width) - gs.l - gs.r; + gs.h = Math.round(height) - gs.t - gs.b; // if things changed and we're not already redrawing, trigger a redraw if(!fullLayout._replotting && @@ -62227,8 +62680,9 @@ plots.doCalcdata = function(gd, traces) { gd._hmpixcount = 0; gd._hmlumcount = 0; - // for sharing colors across pies (and for legend) + // for sharing colors across pies / sunbursts (and for legend) fullLayout._piecolormap = {}; + fullLayout._sunburstcolormap = {}; // If traces were specified and this trace was not included, // then transfer it over from the old calcdata: @@ -62306,7 +62760,6 @@ plots.doCalcdata = function(gd, traces) { var cd = []; if(trace.visible === true) { - // clear existing ref in case it got relinked delete trace._indexToPoints; // keep ref of index-to-points map object of the *last* enabled transform, @@ -62459,7 +62912,7 @@ plots.generalUpdatePerTraceModule = function(gd, subplot, subplotCalcData, subpl subplot.traceHash = traceHash; }; -},{"../components/color":51,"../constants/numerical":149,"../lib":168,"../plot_api/plot_schema":201,"../plot_api/plot_template":202,"../plots/cartesian/axis_ids":215,"../registry":257,"./animation_attributes":207,"./attributes":209,"./command":237,"./font_attributes":239,"./frame_attributes":240,"./layout_attributes":243,"d3":16,"fast-isnumeric":18}],246:[function(_dereq_,module,exports){ +},{"../components/color":51,"../constants/numerical":149,"../lib":168,"../plot_api/plot_schema":201,"../plot_api/plot_template":202,"../plots/cartesian/axis_ids":215,"../registry":256,"./animation_attributes":207,"./attributes":209,"./command":236,"./font_attributes":238,"./frame_attributes":239,"./layout_attributes":242,"d3":16,"fast-isnumeric":18}],245:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -62503,7 +62956,7 @@ module.exports = { } }; -},{"../../../lib/extend":162,"../../../traces/scatter/attributes":367}],247:[function(_dereq_,module,exports){ +},{"../../../lib/extend":162,"../../../traces/scatter/attributes":366}],246:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -62625,7 +63078,7 @@ module.exports = overrideAll({ } }, 'plot', 'nested'); -},{"../../../lib/extend":162,"../../../plot_api/edit_types":195,"../../cartesian/layout_attributes":225}],248:[function(_dereq_,module,exports){ +},{"../../../lib/extend":162,"../../../plot_api/edit_types":195,"../../cartesian/layout_attributes":224}],247:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -62640,7 +63093,7 @@ var Polar = module.exports = _dereq_('./micropolar'); Polar.manager = _dereq_('./micropolar_manager'); -},{"./micropolar":249,"./micropolar_manager":250}],249:[function(_dereq_,module,exports){ +},{"./micropolar":248,"./micropolar_manager":249}],248:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64060,7 +64513,7 @@ var µ = module.exports = { version: '0.2.2' }; return exports; }; -},{"../../../constants/alignment":146,"../../../lib":168,"d3":16}],250:[function(_dereq_,module,exports){ +},{"../../../constants/alignment":146,"../../../lib":168,"d3":16}],249:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64146,7 +64599,7 @@ manager.fillLayout = function(_gd) { _gd._fullLayout = extendDeepAll(dflts, _gd.layout); }; -},{"../../../components/color":51,"../../../lib":168,"./micropolar":249,"./undo_manager":251,"d3":16}],251:[function(_dereq_,module,exports){ +},{"../../../components/color":51,"../../../lib":168,"./micropolar":248,"./undo_manager":250,"d3":16}],250:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64212,7 +64665,7 @@ module.exports = function UndoManager() { }; }; -},{}],252:[function(_dereq_,module,exports){ +},{}],251:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64297,7 +64750,7 @@ module.exports = function handleSubplotDefaults(layoutIn, layoutOut, fullData, o } }; -},{"../lib":168,"../plot_api/plot_template":202,"./domain":238}],253:[function(_dereq_,module,exports){ +},{"../lib":168,"../plot_api/plot_template":202,"./domain":237}],252:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64381,7 +64834,7 @@ exports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout) } }; -},{"../../lib":168,"../../plots/get_data":241,"./layout_attributes":254,"./layout_defaults":255,"./ternary":256}],254:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/get_data":240,"./layout_attributes":253,"./layout_defaults":254,"./ternary":255}],253:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64484,7 +64937,7 @@ attrs.aaxis.uirevision = attrs.baxis.uirevision = attrs.caxis.uirevision = { }; -},{"../../components/color/attributes":50,"../../lib/extend":162,"../../plot_api/edit_types":195,"../cartesian/layout_attributes":225,"../domain":238}],255:[function(_dereq_,module,exports){ +},{"../../components/color/attributes":50,"../../lib/extend":162,"../../plot_api/edit_types":195,"../cartesian/layout_attributes":224,"../domain":237}],254:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -64616,7 +65069,7 @@ function handleAxisDefaults(containerIn, containerOut, options, ternaryLayoutOut coerce('layer'); } -},{"../../components/color":51,"../../lib":168,"../../plot_api/plot_template":202,"../cartesian/line_grid_defaults":227,"../cartesian/tick_label_defaults":232,"../cartesian/tick_mark_defaults":233,"../cartesian/tick_value_defaults":234,"../subplot_defaults":252,"./layout_attributes":254}],256:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../../plot_api/plot_template":202,"../cartesian/line_grid_defaults":226,"../cartesian/tick_label_defaults":231,"../cartesian/tick_mark_defaults":232,"../cartesian/tick_value_defaults":233,"../subplot_defaults":251,"./layout_attributes":253}],255:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -65078,15 +65531,11 @@ proto.drawAx = function(ax) { crisp: false }); - var labelFns = Axes.makeLabelFns(ax, 0, counterAngle); - Axes.drawLabels(gd, ax, { vals: vals, layer: axLayer, transFn: transFn, - labelXFn: labelFns.labelXFn, - labelYFn: labelFns.labelYFn, - labelAnchorFn: labelFns.labelAnchorFn + labelFns: Axes.makeLabelFns(ax, 0, counterAngle) }); }; @@ -65378,7 +65827,7 @@ function removeZoombox(gd) { .remove(); } -},{"../../components/color":51,"../../components/dragelement":69,"../../components/drawing":72,"../../components/fx":90,"../../components/titles":139,"../../lib":168,"../../lib/extend":162,"../../registry":257,"../cartesian/axes":212,"../cartesian/constants":218,"../cartesian/select":230,"../cartesian/set_convert":231,"../plots":245,"d3":16,"tinycolor2":34}],257:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/dragelement":69,"../../components/drawing":72,"../../components/fx":90,"../../components/titles":139,"../../lib":168,"../../lib/extend":162,"../../registry":256,"../cartesian/axes":212,"../cartesian/constants":218,"../cartesian/select":229,"../cartesian/set_convert":230,"../plots":244,"d3":16,"tinycolor2":34}],256:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -65823,7 +66272,7 @@ function getTraceType(traceType) { return traceType; } -},{"./lib/extend":162,"./lib/is_plain_object":169,"./lib/loggers":172,"./lib/noop":177,"./lib/push_unique":181,"./plots/attributes":209,"./plots/layout_attributes":243}],258:[function(_dereq_,module,exports){ +},{"./lib/extend":162,"./lib/is_plain_object":169,"./lib/loggers":172,"./lib/noop":177,"./lib/push_unique":181,"./plots/attributes":209,"./plots/layout_attributes":242}],257:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -65884,7 +66333,6 @@ function keyIsAxis(keyName) { module.exports = function clonePlot(graphObj, options) { - // Polar plot compatibility if(graphObj.framework && graphObj.framework.isPolar) { graphObj = graphObj.framework.getConfig(); @@ -65997,7 +66445,7 @@ module.exports = function clonePlot(graphObj, options) { return plotTile; }; -},{"../lib":168}],259:[function(_dereq_,module,exports){ +},{"../lib":168}],258:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66065,7 +66513,7 @@ function downloadImage(gd, opts) { module.exports = downloadImage; -},{"../lib":168,"../plot_api/to_image":205,"./filesaver":260}],260:[function(_dereq_,module,exports){ +},{"../lib":168,"../plot_api/to_image":205,"./filesaver":259}],259:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66137,7 +66585,7 @@ var fileSaver = function(url, name) { module.exports = fileSaver; -},{}],261:[function(_dereq_,module,exports){ +},{}],260:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66174,7 +66622,7 @@ exports.getRedrawFunc = function(gd) { }; }; -},{}],262:[function(_dereq_,module,exports){ +},{}],261:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66200,7 +66648,7 @@ var Snapshot = { module.exports = Snapshot; -},{"./cloneplot":258,"./download":259,"./helpers":261,"./svgtoimg":263,"./toimage":264,"./tosvg":265}],263:[function(_dereq_,module,exports){ +},{"./cloneplot":257,"./download":258,"./helpers":260,"./svgtoimg":262,"./toimage":263,"./tosvg":264}],262:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66316,7 +66764,7 @@ function svgToImg(opts) { module.exports = svgToImg; -},{"../lib":168,"events":15}],264:[function(_dereq_,module,exports){ +},{"../lib":168,"events":15}],263:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66343,7 +66791,6 @@ var svgToImg = _dereq_('./svgtoimg'); * @param opts.format 'jpeg' | 'png' | 'webp' | 'svg' */ function toImage(gd, opts) { - // first clone the GD so we can operate in a clean environment var ev = new EventEmitter(); @@ -66376,7 +66823,6 @@ function toImage(gd, opts) { ev.clean = function() { if(clonedGd) document.body.removeChild(clonedGd); }; - }, delay); } @@ -66395,7 +66841,7 @@ function toImage(gd, opts) { module.exports = toImage; -},{"../lib":168,"../registry":257,"./cloneplot":258,"./helpers":261,"./svgtoimg":263,"./tosvg":265,"events":15}],265:[function(_dereq_,module,exports){ +},{"../lib":168,"../registry":256,"./cloneplot":257,"./helpers":260,"./svgtoimg":262,"./tosvg":264,"events":15}],264:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66577,7 +67023,7 @@ module.exports = function toSVG(gd, format, scale) { return s; }; -},{"../components/color":51,"../components/drawing":72,"../constants/xmlns_namespaces":150,"../lib":168,"d3":16}],266:[function(_dereq_,module,exports){ +},{"../components/color":51,"../components/drawing":72,"../constants/xmlns_namespaces":150,"../lib":168,"d3":16}],265:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66586,12 +67032,10 @@ module.exports = function toSVG(gd, format, scale) { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var mergeArray = _dereq_('../../lib').mergeArray; - // arrayOk attributes, merge them into calcdata array module.exports = function arraysToCalcdata(cd, trace) { for(var i = 0; i < cd.length; i++) cd[i].i = i; @@ -66612,7 +67056,7 @@ module.exports = function arraysToCalcdata(cd, trace) { } }; -},{"../../lib":168}],267:[function(_dereq_,module,exports){ +},{"../../lib":168}],266:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66754,6 +67198,21 @@ module.exports = { marker: marker, + offsetgroup: { + valType: 'string', + + dflt: '', + editType: 'calc', + + }, + alignmentgroup: { + valType: 'string', + + dflt: '', + editType: 'calc', + + }, + selected: { marker: { opacity: scatterAttrs.selected.marker.opacity, @@ -66787,7 +67246,7 @@ module.exports = { } }; -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/font_attributes":239,"../scatter/attributes":367,"./constants.js":269}],268:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/font_attributes":238,"../scatter/attributes":366,"./constants.js":268}],267:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66852,7 +67311,7 @@ module.exports = function calc(gd, trace) { return cd; }; -},{"../../components/colorscale/calc":59,"../../components/colorscale/helpers":62,"../../plots/cartesian/axes":212,"../scatter/calc_selection":369,"./arrays_to_calcdata":266}],269:[function(_dereq_,module,exports){ +},{"../../components/colorscale/calc":59,"../../components/colorscale/helpers":62,"../../plots/cartesian/axes":212,"../scatter/calc_selection":368,"./arrays_to_calcdata":265}],268:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66868,7 +67327,7 @@ module.exports = { eventDataKeys: [] }; -},{}],270:[function(_dereq_,module,exports){ +},{}],269:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -66885,6 +67344,7 @@ var BADNUM = _dereq_('../../constants/numerical').BADNUM; var Registry = _dereq_('../../registry'); var Axes = _dereq_('../../plots/cartesian/axes'); +var getAxisGroup = _dereq_('../../plots/cartesian/axis_ids').getAxisGroup; var Sieve = _dereq_('./sieve.js'); /* @@ -66927,52 +67387,57 @@ function setGroupPositions(gd, pa, sa, calcTraces) { if(!calcTraces.length) return; var barmode = gd._fullLayout.barmode; - var overlay = (barmode === 'overlay'); - var group = (barmode === 'group'); var excluded; var included; var i, calcTrace, fullTrace; initBase(gd, pa, sa, calcTraces); - if(overlay) { - setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces); - } else if(group) { - // exclude from the group those traces for which the user set an offset - excluded = []; - included = []; - for(i = 0; i < calcTraces.length; i++) { - calcTrace = calcTraces[i]; - fullTrace = calcTrace[0].trace; + switch(barmode) { + case 'overlay': + setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces); + break; - if(fullTrace.offset === undefined) included.push(calcTrace); - else excluded.push(calcTrace); - } + case 'group': + // exclude from the group those traces for which the user set an offset + excluded = []; + included = []; + for(i = 0; i < calcTraces.length; i++) { + calcTrace = calcTraces[i]; + fullTrace = calcTrace[0].trace; - if(included.length) { - setGroupPositionsInGroupMode(gd, pa, sa, included); - } - if(excluded.length) { - setGroupPositionsInOverlayMode(gd, pa, sa, excluded); - } - } else { - // exclude from the stack those traces for which the user set a base - excluded = []; - included = []; - for(i = 0; i < calcTraces.length; i++) { - calcTrace = calcTraces[i]; - fullTrace = calcTrace[0].trace; + if(fullTrace.offset === undefined) included.push(calcTrace); + else excluded.push(calcTrace); + } - if(fullTrace.base === undefined) included.push(calcTrace); - else excluded.push(calcTrace); - } + if(included.length) { + setGroupPositionsInGroupMode(gd, pa, sa, included); + } + if(excluded.length) { + setGroupPositionsInOverlayMode(gd, pa, sa, excluded); + } + break; - if(included.length) { - setGroupPositionsInStackOrRelativeMode(gd, pa, sa, included); - } - if(excluded.length) { - setGroupPositionsInOverlayMode(gd, pa, sa, excluded); - } + case 'stack': + case 'relative': + // exclude from the stack those traces for which the user set a base + excluded = []; + included = []; + for(i = 0; i < calcTraces.length; i++) { + calcTrace = calcTraces[i]; + fullTrace = calcTrace[0].trace; + + if(fullTrace.base === undefined) included.push(calcTrace); + else excluded.push(calcTrace); + } + + if(included.length) { + setGroupPositionsInStackOrRelativeMode(gd, pa, sa, included); + } + if(excluded.length) { + setGroupPositionsInOverlayMode(gd, pa, sa, excluded); + } + break; } collectExtents(calcTraces, pa); @@ -67024,13 +67489,15 @@ function initBase(gd, pa, sa, calcTraces) { function setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces) { var barnorm = gd._fullLayout.barnorm; - var separateNegativeValues = false; - var dontMergeOverlappingData = !barnorm; // update position axis and set bar offsets and widths for(var i = 0; i < calcTraces.length; i++) { var calcTrace = calcTraces[i]; - var sieve = new Sieve([calcTrace], separateNegativeValues, dontMergeOverlappingData); + + var sieve = new Sieve([calcTrace], { + sepNegVal: false, + overlapNoMerge: !barnorm + }); // set bar offsets and widths, and update position axis setOffsetAndWidth(gd, pa, sieve); @@ -67052,13 +67519,19 @@ function setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces) { function setGroupPositionsInGroupMode(gd, pa, sa, calcTraces) { var fullLayout = gd._fullLayout; var barnorm = fullLayout.barnorm; - var separateNegativeValues = false; - var dontMergeOverlappingData = !barnorm; - var sieve = new Sieve(calcTraces, separateNegativeValues, dontMergeOverlappingData); + + var sieve = new Sieve(calcTraces, { + sepNegVal: false, + overlapNoMerge: !barnorm + }); // set bar offsets and widths, and update position axis setOffsetAndWidthInGroupMode(gd, pa, sieve); + // relative-stack bars within the same trace that would otherwise + // be hidden + unhideBarsWithinTrace(gd, sa, sieve); + // set bar bases and sizes, and update size axis if(barnorm) { sieveBars(gd, sa, sieve); @@ -67071,12 +67544,12 @@ function setGroupPositionsInGroupMode(gd, pa, sa, calcTraces) { function setGroupPositionsInStackOrRelativeMode(gd, pa, sa, calcTraces) { var fullLayout = gd._fullLayout; var barmode = fullLayout.barmode; - var stack = barmode === 'stack'; - var relative = barmode === 'relative'; var barnorm = fullLayout.barnorm; - var separateNegativeValues = relative; - var dontMergeOverlappingData = !(barnorm || stack || relative); - var sieve = new Sieve(calcTraces, separateNegativeValues, dontMergeOverlappingData); + + var sieve = new Sieve(calcTraces, { + sepNegVal: barmode === 'relative', + overlapNoMerge: !(barnorm || barmode === 'stack' || barmode === 'relative') + }); // set bar offsets and widths, and update position axis setOffsetAndWidth(gd, pa, sieve); @@ -67107,6 +67580,7 @@ function setOffsetAndWidth(gd, pa, sieve) { var fullLayout = gd._fullLayout; var bargap = fullLayout.bargap; var bargroupgap = fullLayout.bargroupgap || 0; + var minDiff = sieve.minDiff; var calcTraces = sieve.traces; @@ -67150,26 +67624,42 @@ function setOffsetAndWidthInGroupMode(gd, pa, sieve) { var distinctPositions = sieve.distinctPositions; var minDiff = sieve.minDiff; var calcTraces = sieve.traces; + var nTraces = calcTraces.length; // if there aren't any overlapping positions, // let them have full width even if mode is group var overlap = (positions.length !== distinctPositions.length); - - var nTraces = calcTraces.length; var barGroupWidth = minDiff * (1 - bargap); - var barWidthPlusGap = (overlap) ? barGroupWidth / nTraces : barGroupWidth; - var barWidth = barWidthPlusGap * (1 - bargroupgap); + + var groupId = getAxisGroup(fullLayout, pa._id) + calcTraces[0][0].trace.orientation; + var alignmentGroups = fullLayout._alignmentOpts[groupId] || {}; for(var i = 0; i < nTraces; i++) { var calcTrace = calcTraces[i]; + var trace = calcTrace[0].trace; + + var alignmentGroupOpts = alignmentGroups[trace.alignmentgroup] || {}; + var nOffsetGroups = Object.keys(alignmentGroupOpts.offsetGroups || {}).length; + + var barWidthPlusGap; + if(nOffsetGroups) { + barWidthPlusGap = barGroupWidth / nOffsetGroups; + } else { + barWidthPlusGap = overlap ? barGroupWidth / nTraces : barGroupWidth; + } + + var barWidth = barWidthPlusGap * (1 - bargroupgap); + + var offsetFromCenter; + if(nOffsetGroups) { + offsetFromCenter = ((2 * trace._offsetIndex + 1 - nOffsetGroups) * barWidthPlusGap - barWidth) / 2; + } else { + offsetFromCenter = overlap ? + ((2 * i + 1 - nTraces) * barWidthPlusGap - barWidth) / 2 : + -barWidth / 2; + } + var t = calcTrace[0].t; - - // computer bar group center and bar offset - var offsetFromCenter = overlap ? - ((2 * i + 1 - nTraces) * barWidthPlusGap - barWidth) / 2 : - -barWidth / 2; - - // store bar width and offset for this trace t.barwidth = barWidth; t.poffset = offsetFromCenter; t.bargroupwidth = barGroupWidth; @@ -67416,7 +67906,39 @@ function sieveBars(gd, sa, sieve) { for(var j = 0; j < calcTrace.length; j++) { var bar = calcTrace[j]; - if(bar.s !== BADNUM) sieve.put(bar.p, bar.b + bar.s); + if(bar.s !== BADNUM) { + sieve.put(bar.p, bar.b + bar.s); + } + } + } +} + +function unhideBarsWithinTrace(gd, sa, sieve) { + var calcTraces = sieve.traces; + + for(var i = 0; i < calcTraces.length; i++) { + var calcTrace = calcTraces[i]; + var fullTrace = calcTrace[0].trace; + + if(fullTrace.base === undefined) { + var inTraceSieve = new Sieve([calcTrace], { + sepNegVal: true, + overlapNoMerge: true + }); + + for(var j = 0; j < calcTrace.length; j++) { + var bar = calcTrace[j]; + + if(bar.p !== BADNUM) { + // stack current bar and get previous sum + var barBase = inTraceSieve.put(bar.p, bar.b + bar.s); + + // if previous sum if non-zero, this means: + // multiple bars have same starting point are potentially hidden, + // shift them vertically so that all bars are visible by default + if(barBase) bar.b = barBase; + } + } } } } @@ -67551,7 +68073,7 @@ module.exports = { setGroupPositions: setGroupPositions }; -},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":257,"./sieve.js":279,"fast-isnumeric":18}],271:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"../../plots/cartesian/axis_ids":215,"../../registry":256,"./sieve.js":278,"fast-isnumeric":18}],270:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67560,7 +68082,6 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Lib = _dereq_('../../lib'); @@ -67568,16 +68089,17 @@ var Color = _dereq_('../../components/color'); var Registry = _dereq_('../../registry'); var handleXYDefaults = _dereq_('../scatter/xy_defaults'); -var handleStyleDefaults = _dereq_('../bar/style_defaults'); +var handleStyleDefaults = _dereq_('./style_defaults'); +var getAxisGroup = _dereq_('../../plots/cartesian/axis_ids').getAxisGroup; var attributes = _dereq_('./attributes'); -module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) { +var coerceFont = Lib.coerceFont; + +function supplyDefaults(traceIn, traceOut, defaultColor, layout) { function coerce(attr, dflt) { return Lib.coerce(traceIn, traceOut, attributes, attr, dflt); } - var coerceFont = Lib.coerceFont; - var len = handleXYDefaults(traceIn, traceOut, layout, coerce); if(!len) { traceOut.visible = false; @@ -67593,8 +68115,80 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('hovertext'); coerce('hovertemplate'); - var textPosition = coerce('textposition'); + handleText(traceIn, traceOut, layout, coerce, true); + handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout); + + var lineColor = (traceOut.marker.line || {}).color; + + // override defaultColor for error bars with defaultLine + var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults'); + errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'y'}); + errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'}); + + Lib.coerceSelectionMarkerOpacity(traceOut, coerce); +} + +function handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce) { + var orientation = traceOut.orientation; + // N.B. grouping is done across all trace trace types that support it + var posAxId = traceOut[{v: 'x', h: 'y'}[orientation] + 'axis']; + var groupId = getAxisGroup(fullLayout, posAxId) + orientation; + + var alignmentOpts = fullLayout._alignmentOpts || {}; + var alignmentgroup = coerce('alignmentgroup'); + + var alignmentGroups = alignmentOpts[groupId]; + if(!alignmentGroups) alignmentGroups = alignmentOpts[groupId] = {}; + + var alignmentGroupOpts = alignmentGroups[alignmentgroup]; + + if(alignmentGroupOpts) { + alignmentGroupOpts.traces.push(traceOut); + } else { + alignmentGroupOpts = alignmentGroups[alignmentgroup] = { + traces: [traceOut], + alignmentIndex: Object.keys(alignmentGroups).length, + offsetGroups: {} + }; + } + + var offsetgroup = coerce('offsetgroup'); + var offsetGroups = alignmentGroupOpts.offsetGroups; + var offsetGroupOpts = offsetGroups[offsetgroup]; + + if(offsetgroup) { + if(!offsetGroupOpts) { + offsetGroupOpts = offsetGroups[offsetgroup] = { + offsetIndex: Object.keys(offsetGroups).length + }; + } + + traceOut._offsetIndex = offsetGroupOpts.offsetIndex; + } +} + +function crossTraceDefaults(fullData, fullLayout) { + var traceIn, traceOut; + + function coerce(attr) { + return Lib.coerce(traceOut._input, traceOut, attributes, attr); + } + + if(fullLayout.barmode === 'group') { + for(var i = 0; i < fullData.length; i++) { + traceOut = fullData[i]; + + if(traceOut.type === 'bar') { + traceIn = traceOut._input; + handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce); + } + } + } +} + +function handleText(traceIn, traceOut, layout, coerce, moduleHasSelUnselected) { + var textPosition = coerce('textposition'); var hasBoth = Array.isArray(textPosition) || textPosition === 'auto'; var hasInside = hasBoth || textPosition === 'inside'; var hasOutside = hasBoth || textPosition === 'outside'; @@ -67617,24 +68211,24 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout if(hasOutside) coerceFont(coerce, 'outsidetextfont', textFont); coerce('constraintext'); - coerce('selected.textfont.color'); - coerce('unselected.textfont.color'); + + if(moduleHasSelUnselected) { + coerce('selected.textfont.color'); + coerce('unselected.textfont.color'); + } + coerce('cliponaxis'); } +} - handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout); - - var lineColor = (traceOut.marker.line || {}).color; - - // override defaultColor for error bars with defaultLine - var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults'); - errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'y'}); - errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'}); - - Lib.coerceSelectionMarkerOpacity(traceOut, coerce); +module.exports = { + supplyDefaults: supplyDefaults, + crossTraceDefaults: crossTraceDefaults, + handleGroupingDefaults: handleGroupingDefaults, + handleText: handleText }; -},{"../../components/color":51,"../../lib":168,"../../registry":257,"../bar/style_defaults":281,"../scatter/xy_defaults":393,"./attributes":267}],272:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../../plots/cartesian/axis_ids":215,"../../registry":256,"../scatter/xy_defaults":392,"./attributes":266,"./style_defaults":280}],271:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67702,7 +68296,7 @@ exports.getValue = function(arrayOrScalar, index) { return value; }; -},{"fast-isnumeric":18,"tinycolor2":34}],273:[function(_dereq_,module,exports){ +},{"fast-isnumeric":18,"tinycolor2":34}],272:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67720,6 +68314,21 @@ var Color = _dereq_('../../components/color'); var fillHoverText = _dereq_('../scatter/fill_hover_text'); function hoverPoints(pointData, xval, yval, hovermode) { + var barPointData = hoverOnBars(pointData, xval, yval, hovermode); + + if(barPointData) { + var cd = barPointData.cd; + var trace = cd[0].trace; + var di = cd[barPointData.index]; + + barPointData.color = getTraceColor(trace, di); + Registry.getComponentMethod('errorbars', 'hoverInfo')(di, trace, barPointData); + + return [barPointData]; + } +} + +function hoverOnBars(pointData, xval, yval, hovermode) { var cd = pointData.cd; var trace = cd[0].trace; var t = cd[0].t; @@ -67838,12 +68447,10 @@ function hoverPoints(pointData, xval, yval, hovermode) { // in case of bars shifted within groups pointData[posLetter + 'Spike'] = pa.c2p(di.p, true); - pointData.color = getTraceColor(trace, di); fillHoverText(di, trace, pointData); - Registry.getComponentMethod('errorbars', 'hoverInfo')(di, trace, pointData); - pointData.hovertemplate = trace.hovertemplate; - return [pointData]; + + return pointData; } function getTraceColor(trace, di) { @@ -67857,10 +68464,11 @@ function getTraceColor(trace, di) { module.exports = { hoverPoints: hoverPoints, + hoverOnBars: hoverOnBars, getTraceColor: getTraceColor }; -},{"../../components/color":51,"../../components/fx":90,"../../registry":257,"../scatter/fill_hover_text":375}],274:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/fx":90,"../../registry":256,"../scatter/fill_hover_text":374}],273:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67869,14 +68477,14 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Bar = {}; Bar.attributes = _dereq_('./attributes'); Bar.layoutAttributes = _dereq_('./layout_attributes'); -Bar.supplyDefaults = _dereq_('./defaults'); +Bar.supplyDefaults = _dereq_('./defaults').supplyDefaults; +Bar.crossTraceDefaults = _dereq_('./defaults').crossTraceDefaults; Bar.supplyLayoutDefaults = _dereq_('./layout_defaults'); Bar.calc = _dereq_('./calc'); Bar.crossTraceCalc = _dereq_('./cross_trace_calc').crossTraceCalc; @@ -67898,7 +68506,7 @@ Bar.meta = { module.exports = Bar; -},{"../../plots/cartesian":224,"../scatter/marker_colorbar":385,"./arrays_to_calcdata":266,"./attributes":267,"./calc":268,"./cross_trace_calc":270,"./defaults":271,"./hover":273,"./layout_attributes":275,"./layout_defaults":276,"./plot":277,"./select":278,"./style":280}],275:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"../scatter/marker_colorbar":384,"./arrays_to_calcdata":265,"./attributes":266,"./calc":267,"./cross_trace_calc":269,"./defaults":270,"./hover":272,"./layout_attributes":274,"./layout_defaults":275,"./plot":276,"./select":277,"./style":279}],274:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67946,7 +68554,7 @@ module.exports = { } }; -},{}],276:[function(_dereq_,module,exports){ +},{}],275:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -67955,7 +68563,6 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Registry = _dereq_('../../registry'); @@ -67964,7 +68571,6 @@ var Lib = _dereq_('../../lib'); var layoutAttributes = _dereq_('./layout_attributes'); - module.exports = function(layoutIn, layoutOut, fullData) { function coerce(attr, dflt) { return Lib.coerce(layoutIn, layoutOut, layoutAttributes, attr, dflt); @@ -67975,6 +68581,8 @@ module.exports = function(layoutIn, layoutOut, fullData) { var gappedAnyway = false; var usedSubplots = {}; + var mode = coerce('barmode'); + for(var i = 0; i < fullData.length; i++) { var trace = fullData[i]; if(Registry.traceIs(trace, 'bar') && trace.visible) hasBars = true; @@ -67982,7 +68590,7 @@ module.exports = function(layoutIn, layoutOut, fullData) { // if we have at least 2 grouped bar traces on the same subplot, // we should default to a gap anyway, even if the data is histograms - if(layoutIn.barmode !== 'overlay' && layoutIn.barmode !== 'stack') { + if(mode === 'group') { var subploti = trace.xaxis + trace.yaxis; if(usedSubplots[subploti]) gappedAnyway = true; usedSubplots[subploti] = true; @@ -67995,16 +68603,18 @@ module.exports = function(layoutIn, layoutOut, fullData) { } } - if(!hasBars) return; + if(!hasBars) { + delete layoutOut.barmode; + return; + } - var mode = coerce('barmode'); if(mode !== 'overlay') coerce('barnorm'); coerce('bargap', (shouldBeGapless && !gappedAnyway) ? 0 : 0.2); coerce('bargroupgap'); }; -},{"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":257,"./layout_attributes":275}],277:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":256,"./layout_attributes":274}],276:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68035,16 +68645,24 @@ var style = _dereq_('./style'); // padding in pixels around text var TEXTPAD = 3; -module.exports = function plot(gd, plotinfo, cdbar, barLayer) { +module.exports = function plot(gd, plotinfo, cdModule, traceLayer) { var xa = plotinfo.xaxis; var ya = plotinfo.yaxis; var fullLayout = gd._fullLayout; - var bartraces = Lib.makeTraceGroups(barLayer, cdbar, 'trace bars').each(function(cd) { + var bartraces = Lib.makeTraceGroups(traceLayer, cdModule, 'trace bars').each(function(cd) { var plotGroup = d3.select(this); var cd0 = cd[0]; var trace = cd0.trace; + var adjustDir; + var adjustPixel = 0; + if(trace.type === 'waterfall' && trace.connector.visible && trace.connector.mode === 'between') { + adjustPixel = trace.connector.line.width / 2; + } + + var isHorizontal = (trace.orientation === 'h'); + if(!plotinfo.isRangePlot) cd0.node3 = plotGroup; var pointGroup = Lib.ensureSingle(plotGroup, 'g', 'points'); @@ -68064,7 +68682,7 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { // log values go off-screen by plotwidth // so you see them continue if you drag the plot var x0, x1, y0, y1; - if(trace.orientation === 'h') { + if(isHorizontal) { y0 = ya.c2p(di.p0, true); y1 = ya.c2p(di.p1, true); x0 = xa.c2p(di.s0, true); @@ -68072,8 +68690,7 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { // for selections di.ct = [x1, (y0 + y1) / 2]; - } - else { + } else { x0 = xa.c2p(di.p0, true); x1 = xa.c2p(di.p1, true); y0 = ya.c2p(di.s0, true); @@ -68083,21 +68700,49 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { di.ct = [(x0 + x1) / 2, y1]; } - if(!isNumeric(x0) || !isNumeric(x1) || - !isNumeric(y0) || !isNumeric(y1) || - x0 === x1 || y0 === y1) { - bar.remove(); - return; + var isBlank = di.isBlank = ( + !isNumeric(x0) || !isNumeric(x1) || + !isNumeric(y0) || !isNumeric(y1) || + x0 === x1 || y0 === y1 + ); + + // in waterfall mode `between` we need to adjust bar end points to match the connector width + if(adjustPixel) { + if(isHorizontal) { + adjustDir = (x1 < x0) ? -1 : 1; + x0 -= adjustDir * adjustPixel; + x1 += adjustDir * adjustPixel; + } else { + adjustDir = (y1 < y0) ? -1 : 1; + y0 -= adjustDir * adjustPixel; + y1 += adjustDir * adjustPixel; + } } - var lw = (di.mlw + 1 || trace.marker.line.width + 1 || + var lw; + var mc; + var prefix; + + if(trace.type === 'waterfall') { + var cont = trace[di.dir].marker; + lw = cont.line.width; + mc = cont.color; + prefix = 'waterfall'; + } else { + lw = (di.mlw + 1 || trace.marker.line.width + 1 || (di.trace ? di.trace.marker.line.width : 0) + 1) - 1; + mc = di.mc || trace.marker.color; + prefix = 'bar'; + } + var offset = d3.round((lw / 2) % 1, 2); + var bargap = fullLayout[prefix + 'gap']; + var bargroupgap = fullLayout[prefix + 'groupgap']; function roundWithLine(v) { // if there are explicit gaps, don't round, // it can make the gaps look crappy - return (fullLayout.bargap === 0 && fullLayout.bargroupgap === 0) ? + return (bargap === 0 && bargroupgap === 0) ? d3.round(Math.round(v) - offset, 2) : v; } @@ -68118,7 +68763,8 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { // pixelation. if the bars ARE fully opaque and have // no line, expand to a full pixel to make sure we // can see them - var op = Color.opacity(di.mc || trace.marker.color); + + var op = Color.opacity(mc); var fixpx = (op < 1 || lw > 0.01) ? roundWithLine : expandToVisible; x0 = fixpx(x0, x1); x1 = fixpx(x1, x0); @@ -68128,8 +68774,7 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { Lib.ensureSingle(bar, 'path') .style('vector-effect', 'non-scaling-stroke') - .attr('d', - 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z') + .attr('d', isBlank ? 'M0,0Z' : 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z') .call(Drawing.setClipUrl, plotinfo.layerClipId, gd); appendBarText(gd, bar, cd, i, x0, x1, y0, y1); @@ -68150,6 +68795,7 @@ module.exports = function plot(gd, plotinfo, cdbar, barLayer) { }; function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { + var fullLayout = gd._fullLayout; var textPosition; function appendTextNode(bar, text, textFont) { @@ -68176,27 +68822,28 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { var text = getText(trace, i); textPosition = getTextPosition(trace, i); - if(!text || textPosition === 'none') { - bar.select('text').remove(); - return; - } - - var layoutFont = gd._fullLayout.font; + var layoutFont = fullLayout.font; var barColor = style.getBarColor(calcTrace[i], trace); var insideTextFont = style.getInsideTextFont(trace, i, layoutFont, barColor); var outsideTextFont = style.getOutsideTextFont(trace, i, layoutFont); // compute text position - var barmode = gd._fullLayout.barmode; - var inStackMode = (barmode === 'stack'); - var inRelativeMode = (barmode === 'relative'); - var inStackOrRelativeMode = inStackMode || inRelativeMode; + var prefix = trace.type === 'waterfall' ? 'waterfall' : 'bar'; + var barmode = fullLayout[prefix + 'mode']; + var inStackOrRelativeMode = barmode === 'stack' || barmode === 'relative'; var calcBar = calcTrace[i]; var isOutmostBar = !inStackOrRelativeMode || calcBar._outmost; - var barWidth = Math.abs(x1 - x0) - 2 * TEXTPAD; // padding excluded - var barHeight = Math.abs(y1 - y0) - 2 * TEXTPAD; // padding excluded + // padding excluded + var barWidth = Math.abs(x1 - x0) - 2 * TEXTPAD; + var barHeight = Math.abs(y1 - y0) - 2 * TEXTPAD; + + if(!text || textPosition === 'none' || + (calcBar.isBlank && (textPosition === 'auto' || textPosition === 'inside'))) { + bar.select('text').remove(); + return; + } var textSelection; var textBB; @@ -68227,14 +68874,14 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { if(textHasSize && (fitsInside || fitsInsideIfRotated || fitsInsideIfShrunk)) { textPosition = 'inside'; - } - else { + } else { textPosition = 'outside'; textSelection.remove(); textSelection = null; } + } else { + textPosition = 'inside'; } - else textPosition = 'inside'; } if(!textSelection) { @@ -68258,8 +68905,7 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) { constrained = trace.constraintext === 'both' || trace.constraintext === 'outside'; transform = getTransformToMoveOutsideBar(x0, x1, y0, y1, textBB, orientation, constrained); - } - else { + } else { constrained = trace.constraintext === 'both' || trace.constraintext === 'inside'; transform = getTransformToMoveInsideBar(x0, x1, y0, y1, textBB, orientation, constrained); @@ -68287,8 +68933,7 @@ function getTransformToMoveInsideBar(x0, x1, y0, y1, textBB, orientation, constr textpad = TEXTPAD; barWidth -= 2 * textpad; barHeight -= 2 * textpad; - } - else textpad = 0; + } else textpad = 0; // compute rotation and scale var rotate, @@ -68298,18 +68943,15 @@ function getTransformToMoveInsideBar(x0, x1, y0, y1, textBB, orientation, constr // no scale or rotation is required rotate = false; scale = 1; - } - else if(textWidth <= barHeight && textHeight <= barWidth) { + } else if(textWidth <= barHeight && textHeight <= barWidth) { // only rotation is required rotate = true; scale = 1; - } - else if((textWidth < textHeight) === (barWidth < barHeight)) { + } else if((textWidth < textHeight) === (barWidth < barHeight)) { // only scale is required rotate = false; scale = constrained ? Math.min(barWidth / textWidth, barHeight / textHeight) : 1; - } - else { + } else { // both scale and rotation are required rotate = true; scale = constrained ? Math.min(barHeight / textWidth, barWidth / textHeight) : 1; @@ -68321,8 +68963,7 @@ function getTransformToMoveInsideBar(x0, x1, y0, y1, textBB, orientation, constr if(rotate) { targetWidth = scale * textHeight; targetHeight = scale * textWidth; - } - else { + } else { targetWidth = scale * textWidth; targetHeight = scale * textHeight; } @@ -68332,19 +68973,16 @@ function getTransformToMoveInsideBar(x0, x1, y0, y1, textBB, orientation, constr // bar end is on the left hand side targetX = x1 + textpad + targetWidth / 2; targetY = (y0 + y1) / 2; - } - else { + } else { targetX = x1 - textpad - targetWidth / 2; targetY = (y0 + y1) / 2; } - } - else { + } else { if(y1 > y0) { // bar end is on the bottom targetX = (x0 + x1) / 2; targetY = y1 - textpad - targetHeight / 2; - } - else { + } else { targetX = (x0 + x1) / 2; targetY = y1 + textpad + targetHeight / 2; } @@ -68389,19 +69027,16 @@ function getTransformToMoveOutsideBar(x0, x1, y0, y1, textBB, orientation, const // bar end is on the left hand side targetX = x1 - textpad - targetWidth / 2; targetY = (y0 + y1) / 2; - } - else { + } else { targetX = x1 + textpad + targetWidth / 2; targetY = (y0 + y1) / 2; } - } - else { + } else { if(y1 > y0) { // bar end is on the bottom targetX = (x0 + x1) / 2; targetY = y1 + textpad + targetHeight / 2; - } - else { + } else { targetX = (x0 + x1) / 2; targetY = y1 - textpad - targetHeight / 2; } @@ -68442,7 +69077,7 @@ function getTextPosition(trace, index) { return helpers.coerceEnumerated(attributeTextPosition, value); } -},{"../../components/color":51,"../../components/drawing":72,"../../lib":168,"../../lib/svg_text_utils":189,"../../registry":257,"./attributes":267,"./helpers":272,"./style":280,"d3":16,"fast-isnumeric":18}],278:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/drawing":72,"../../lib":168,"../../lib/svg_text_utils":189,"../../registry":256,"./attributes":266,"./helpers":271,"./style":279,"d3":16,"fast-isnumeric":18}],277:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68485,7 +69120,7 @@ module.exports = function selectPoints(searchInfo, selectionTester) { return selection; }; -},{}],279:[function(_dereq_,module,exports){ +},{}],278:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68505,18 +69140,20 @@ var BADNUM = _dereq_('../../constants/numerical').BADNUM; * Helper class to sieve data from traces into bins * * @class - * @param {Array} traces - * Array of calculated traces - * @param {boolean} [separateNegativeValues] - * If true, then split data at the same position into a bar - * for positive values and another for negative values - * @param {boolean} [dontMergeOverlappingData] - * If true, then don't merge overlapping bars into a single bar + * + * @param {Array} traces +* Array of calculated traces + * @param {object} opts + * - @param {boolean} [sepNegVal] + * If true, then split data at the same position into a bar + * for positive values and another for negative values + * - @param {boolean} [overlapNoMerge] + * If true, then don't merge overlapping bars into a single bar */ -function Sieve(traces, separateNegativeValues, dontMergeOverlappingData) { +function Sieve(traces, opts) { this.traces = traces; - this.separateNegativeValues = separateNegativeValues; - this.dontMergeOverlappingData = dontMergeOverlappingData; + this.sepNegVal = opts.sepNegVal; + this.overlapNoMerge = opts.overlapNoMerge; // for single-bin histograms - see histogram/calc var width1 = Infinity; @@ -68567,7 +69204,7 @@ Sieve.prototype.put = function put(position, value) { * @method * @param {number} position Position of datum * @param {number} [value] Value of datum - * (required if this.separateNegativeValues is true) + * (required if this.sepNegVal is true) * @returns {number} Current bin value */ Sieve.prototype.get = function put(position, value) { @@ -68581,20 +69218,20 @@ Sieve.prototype.get = function put(position, value) { * @method * @param {number} position Position of datum * @param {number} [value] Value of datum - * (required if this.separateNegativeValues is true) + * (required if this.sepNegVal is true) * @returns {string} Bin label - * (prefixed with a 'v' if value is negative and this.separateNegativeValues is + * (prefixed with a 'v' if value is negative and this.sepNegVal is * true; otherwise prefixed with '^') */ Sieve.prototype.getLabel = function getLabel(position, value) { - var prefix = (value < 0 && this.separateNegativeValues) ? 'v' : '^'; - var label = (this.dontMergeOverlappingData) ? + var prefix = (value < 0 && this.sepNegVal) ? 'v' : '^'; + var label = (this.overlapNoMerge) ? position : Math.round(position / this.binWidth); return prefix + label; }; -},{"../../constants/numerical":149,"../../lib":168}],280:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168}],279:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68603,7 +69240,6 @@ Sieve.prototype.getLabel = function getLabel(position, value) { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var d3 = _dereq_('d3'); @@ -68619,7 +69255,7 @@ var attributeOutsideTextFont = attributes.outsidetextfont; var helpers = _dereq_('./helpers'); function style(gd, cd) { - var s = cd ? cd[0].node3 : d3.select(gd).selectAll('g.trace.bars'); + var s = cd ? cd[0].node3 : d3.select(gd).selectAll('g.barlayer').selectAll('g.trace'); var barcount = s.size(); var fullLayout = gd._fullLayout; @@ -68648,12 +69284,12 @@ function style(gd, cd) { } function stylePoints(sel, trace, gd) { - var pts = sel.selectAll('path'); - var txs = sel.selectAll('text'); + Drawing.pointStyle(sel.selectAll('path'), trace, gd); + styleTextPoints(sel, trace, gd); +} - Drawing.pointStyle(pts, trace, gd); - - txs.each(function(d) { +function styleTextPoints(sel, trace, gd) { + sel.selectAll('text').each(function(d) { var tx = d3.select(this); var font = determineFont(tx, d, trace, gd); Drawing.font(tx, font); @@ -68757,18 +69393,22 @@ function getFontValue(attributeDefinition, attributeValue, index, defaultValue) } function getBarColor(cd, trace) { + if(trace.type === 'waterfall') { + return trace[cd.dir].marker.color; + } return cd.mc || trace.marker.color; } module.exports = { style: style, + styleTextPoints: styleTextPoints, styleOnSelect: styleOnSelect, getInsideTextFont: getInsideTextFont, getOutsideTextFont: getOutsideTextFont, getBarColor: getBarColor }; -},{"../../components/color":51,"../../components/drawing":72,"../../lib":168,"../../registry":257,"./attributes":267,"./helpers":272,"d3":16}],281:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/drawing":72,"../../lib":168,"../../registry":256,"./attributes":266,"./helpers":271,"d3":16}],280:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68806,7 +69446,7 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, default coerce('unselected.marker.color'); }; -},{"../../components/color":51,"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62}],282:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62}],281:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -68818,7 +69458,9 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, default 'use strict'; var scatterAttrs = _dereq_('../scatter/attributes'); +var barAttrs = _dereq_('../bar/attributes'); var colorAttrs = _dereq_('../../components/color/attributes'); +var hovertemplateAttrs = _dereq_('../../components/fx/hovertemplate_attributes'); var extendFlat = _dereq_('../../lib/extend').extendFlat; var scatterMarkerAttrs = scatterAttrs.marker; @@ -68855,6 +69497,12 @@ module.exports = { }, text: extendFlat({}, scatterAttrs.text, { + }), + hovertext: extendFlat({}, scatterAttrs.hovertext, { + + }), + hovertemplate: hovertemplateAttrs({ + }), whiskerwidth: { valType: 'number', @@ -68989,6 +69637,9 @@ module.exports = { }, fillcolor: scatterAttrs.fillcolor, + offsetgroup: barAttrs.offsetgroup, + alignmentgroup: barAttrs.alignmentgroup, + selected: { marker: scatterAttrs.selected.marker, editType: 'style' @@ -69007,7 +69658,7 @@ module.exports = { } }; -},{"../../components/color/attributes":50,"../../lib/extend":162,"../scatter/attributes":367}],283:[function(_dereq_,module,exports){ +},{"../../components/color/attributes":50,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../bar/attributes":266,"../scatter/attributes":366}],282:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69222,7 +69873,8 @@ function initNestedArray(len) { function arraysToCalcdata(pt, trace, i) { var trace2calc = { - text: 'tx' + text: 'tx', + hovertext: 'htx' }; for(var k in trace2calc) { @@ -69251,7 +69903,7 @@ function sortByVal(a, b) { return a.v - b.v; } function extractVal(o) { return o.v; } -},{"../../lib":168,"../../plots/cartesian/axes":212,"fast-isnumeric":18}],284:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"fast-isnumeric":18}],283:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69264,6 +69916,7 @@ function extractVal(o) { return o.v; } var Axes = _dereq_('../../plots/cartesian/axes'); var Lib = _dereq_('../../lib'); +var getAxisGroup = _dereq_('../../plots/cartesian/axis_ids').getAxisGroup; var orientations = ['v', 'h']; @@ -69305,9 +69958,6 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { var axId = posAxis._id; var axLetter = axId.charAt(0); - // N.B. reused in violin - var numKey = traceType === 'violin' ? '_numViolins' : '_numBoxes'; - var i, j, calcTrace; var pointList = []; var shownPts = 0; @@ -69330,8 +69980,9 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { // check for forced minimum dtick Axes.minDtick(posAxis, boxdv.minDiff, boxdv.vals[0], true); - var num = fullLayout[numKey]; - var group = (fullLayout[traceType + 'mode'] === 'group' && num > 1); + var numKey = traceType === 'violin' ? '_numViolins' : '_numBoxes'; + var numTotal = fullLayout[numKey]; + var group = fullLayout[traceType + 'mode'] === 'group' && numTotal > 1; var groupFraction = 1 - fullLayout[traceType + 'gap']; var groupGapFraction = 1 - fullLayout[traceType + 'groupgap']; @@ -69358,9 +70009,23 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { bPos = 0; } else { dPos = dPos0; - bdPos = dPos * groupFraction * groupGapFraction / (group ? num : 1); - bPos = group ? 2 * dPos * (-0.5 + (t.num + 0.5) / num) * groupFraction : 0; - wHover = dPos * (group ? groupFraction / num : 1); + + if(group) { + var groupId = getAxisGroup(fullLayout, posAxis._id) + trace.orientation; + var alignmentGroups = fullLayout._alignmentOpts[groupId] || {}; + var alignmentGroupOpts = alignmentGroups[trace.alignmentgroup] || {}; + var nOffsetGroups = Object.keys(alignmentGroupOpts.offsetGroups || {}).length; + var num = nOffsetGroups || numTotal; + var shift = nOffsetGroups ? trace._offsetIndex : t.num; + + bdPos = dPos * groupFraction * groupGapFraction / num; + bPos = 2 * dPos * (-0.5 + (shift + 0.5) / num) * groupFraction; + wHover = dPos * groupFraction / num; + } else { + bdPos = dPos * groupFraction * groupGapFraction; + bPos = 0; + wHover = dPos; + } } t.dPos = dPos; t.bPos = bPos; @@ -69446,11 +70111,12 @@ function setPositionOffset(traceType, gd, boxList, posAxis) { vpadminus = pushminus; } - // calcdata[i][j] are in ascending order - var firstPos = calcTrace[0].pos; - var lastPos = calcTrace[calcTrace.length - 1].pos; + var pos = new Array(calcTrace.length); + for(j = 0; j < calcTrace.length; j++) { + pos[j] = calcTrace[j].pos; + } - trace._extremes[axId] = Axes.findExtremes(posAxis, [firstPos, lastPos], { + trace._extremes[axId] = Axes.findExtremes(posAxis, pos, { padded: padded, vpadminus: vpadminus, vpadplus: vpadplus, @@ -69466,7 +70132,7 @@ module.exports = { setPositionOffset: setPositionOffset }; -},{"../../lib":168,"../../plots/cartesian/axes":212}],285:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../../plots/cartesian/axis_ids":215}],284:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69480,7 +70146,7 @@ module.exports = { var Lib = _dereq_('../../lib'); var Registry = _dereq_('../../registry'); var Color = _dereq_('../../components/color'); - +var handleGroupingDefaults = _dereq_('../bar/defaults').handleGroupingDefaults; var attributes = _dereq_('./attributes'); function supplyDefaults(traceIn, traceOut, defaultColor, layout) { @@ -69569,22 +70235,48 @@ function handlePointsDefaults(traceIn, traceOut, coerce, opts) { coerce('unselected.marker.size'); coerce('text'); + coerce('hovertext'); } else { delete traceOut.marker; } - coerce('hoveron'); + var hoveron = coerce('hoveron'); + if(hoveron === 'all' || hoveron.indexOf('points') !== -1) { + coerce('hovertemplate'); + } Lib.coerceSelectionMarkerOpacity(traceOut, coerce); } +function crossTraceDefaults(fullData, fullLayout) { + var traceIn, traceOut; + + function coerce(attr) { + return Lib.coerce(traceOut._input, traceOut, attributes, attr); + } + + for(var i = 0; i < fullData.length; i++) { + traceOut = fullData[i]; + var traceType = traceOut.type; + + if(traceType === 'box' || traceType === 'violin') { + traceIn = traceOut._input; + if(fullLayout[traceType + 'mode'] === 'group') { + handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce); + } + } + } +} + module.exports = { supplyDefaults: supplyDefaults, + crossTraceDefaults: crossTraceDefaults, + handleSampleDefaults: handleSampleDefaults, handlePointsDefaults: handlePointsDefaults }; -},{"../../components/color":51,"../../lib":168,"../../registry":257,"./attributes":282}],286:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../../registry":256,"../bar/defaults":270,"./attributes":281}],285:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69596,7 +70288,6 @@ module.exports = { 'use strict'; module.exports = function eventData(out, pt) { - // Note: hoverOnBox property is needed for click-to-select // to ignore when a box was clicked. This is the reason box // implements this custom eventData function. @@ -69610,7 +70301,7 @@ module.exports = function eventData(out, pt) { return out; }; -},{}],287:[function(_dereq_,module,exports){ +},{}],286:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69789,11 +70480,15 @@ function hoverOnBoxes(pointData, xval, yval, hovermode) { if(attr === 'mean' && ('sd' in di) && trace.boxmean === 'sd') { pointData2[vLetter + 'err'] = di.sd; } + // only keep name and spikes on the first item (median) pointData.name = ''; pointData.spikeDistance = undefined; pointData[spikePosAttr] = undefined; + // no hovertemplate support yet + pointData2.hovertemplate = false; + closeBoxData.push(pointData2); } @@ -69855,7 +70550,8 @@ function hoverOnPoints(pointData, xval, yval) { x1: xc + rad, y0: yc - rad, y1: yc + rad, - spikeDistance: pointData.distance + spikeDistance: pointData.distance, + hovertemplate: trace.hovertemplate }); var pa; @@ -69883,7 +70579,7 @@ module.exports = { hoverOnPoints: hoverOnPoints }; -},{"../../components/color":51,"../../components/fx":90,"../../lib":168,"../../plots/cartesian/axes":212,"../scatter/fill_hover_text":375}],288:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/fx":90,"../../lib":168,"../../plots/cartesian/axes":212,"../scatter/fill_hover_text":374}],287:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69899,6 +70595,7 @@ var Box = {}; Box.attributes = _dereq_('./attributes'); Box.layoutAttributes = _dereq_('./layout_attributes'); Box.supplyDefaults = _dereq_('./defaults').supplyDefaults; +Box.crossTraceDefaults = _dereq_('./defaults').crossTraceDefaults; Box.supplyLayoutDefaults = _dereq_('./layout_defaults').supplyLayoutDefaults; Box.calc = _dereq_('./calc'); Box.crossTraceCalc = _dereq_('./cross_trace_calc').crossTraceCalc; @@ -69919,7 +70616,7 @@ Box.meta = { module.exports = Box; -},{"../../plots/cartesian":224,"./attributes":282,"./calc":283,"./cross_trace_calc":284,"./defaults":285,"./event_data":286,"./hover":287,"./layout_attributes":289,"./layout_defaults":290,"./plot":291,"./select":292,"./style":293}],289:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"./attributes":281,"./calc":282,"./cross_trace_calc":283,"./defaults":284,"./event_data":285,"./hover":286,"./layout_attributes":288,"./layout_defaults":289,"./plot":290,"./select":291,"./style":292}],288:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69960,7 +70657,7 @@ module.exports = { } }; -},{}],290:[function(_dereq_,module,exports){ +},{}],289:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -69976,10 +70673,13 @@ var Lib = _dereq_('../../lib'); var layoutAttributes = _dereq_('./layout_attributes'); function _supply(layoutIn, layoutOut, fullData, coerce, traceType) { - var hasTraceType; var category = traceType + 'Layout'; + var hasTraceType = false; + for(var i = 0; i < fullData.length; i++) { - if(Registry.traceIs(fullData[i], category)) { + var trace = fullData[i]; + + if(Registry.traceIs(trace, category)) { hasTraceType = true; break; } @@ -70003,7 +70703,7 @@ module.exports = { _supply: _supply }; -},{"../../lib":168,"../../registry":257,"./layout_attributes":289}],291:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"./layout_attributes":288}],290:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70327,7 +71027,7 @@ module.exports = { plotBoxMean: plotBoxMean }; -},{"../../components/drawing":72,"../../lib":168,"d3":16}],292:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../lib":168,"d3":16}],291:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70376,7 +71076,7 @@ module.exports = function selectPoints(searchInfo, selectionTester) { return selection; }; -},{}],293:[function(_dereq_,module,exports){ +},{}],292:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70451,7 +71151,7 @@ module.exports = { styleOnSelect: styleOnSelect }; -},{"../../components/color":51,"../../components/drawing":72,"d3":16}],294:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/drawing":72,"d3":16}],293:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70485,10 +71185,12 @@ module.exports = extendFlat({ y0: heatmapAttrs.y0, dy: heatmapAttrs.dy, text: heatmapAttrs.text, + hovertext: heatmapAttrs.hovertext, transpose: heatmapAttrs.transpose, xtype: heatmapAttrs.xtype, ytype: heatmapAttrs.ytype, zhoverformat: heatmapAttrs.zhoverformat, + hovertemplate: heatmapAttrs.hovertemplate, connectgaps: heatmapAttrs.connectgaps, @@ -70630,7 +71332,7 @@ module.exports = extendFlat({ { colorbar: colorbarAttrs } ); -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing/attributes":71,"../../constants/filter_ops":147,"../../lib/extend":162,"../../plots/font_attributes":239,"../heatmap/attributes":316,"../scatter/attributes":367}],295:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing/attributes":71,"../../constants/filter_ops":147,"../../lib/extend":162,"../../plots/font_attributes":238,"../heatmap/attributes":315,"../scatter/attributes":366}],294:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70654,7 +71356,7 @@ module.exports = function calc(gd, trace) { return cd; }; -},{"../heatmap/calc":317,"./set_contours":313}],296:[function(_dereq_,module,exports){ +},{"../heatmap/calc":316,"./set_contours":312}],295:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70721,7 +71423,7 @@ module.exports = function(pathinfo, operation, perimeter, trace) { } }; -},{}],297:[function(_dereq_,module,exports){ +},{}],296:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70772,7 +71474,7 @@ module.exports = function colorbar(gd, cd) { .options(trace.colorbar)(); }; -},{"../../components/colorbar/draw":56,"./end_plus":305,"./make_color_map":310}],298:[function(_dereq_,module,exports){ +},{"../../components/colorbar/draw":56,"./end_plus":304,"./make_color_map":309}],297:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70850,7 +71552,7 @@ module.exports = { } }; -},{}],299:[function(_dereq_,module,exports){ +},{}],298:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -70945,7 +71647,7 @@ function handleConstraintValueDefaults(coerce, contours) { } } -},{"../../components/color":51,"../../constants/filter_ops":147,"./label_defaults":309,"fast-isnumeric":18}],300:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../constants/filter_ops":147,"./label_defaults":308,"fast-isnumeric":18}],299:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71024,7 +71726,7 @@ function makeInequalitySettings(operation) { }; } -},{"../../constants/filter_ops":147,"fast-isnumeric":18}],301:[function(_dereq_,module,exports){ +},{"../../constants/filter_ops":147,"fast-isnumeric":18}],300:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71053,7 +71755,7 @@ module.exports = function handleContourDefaults(traceIn, traceOut, coerce, coerc if(autoContour || !contourSize) coerce('ncontours'); }; -},{}],302:[function(_dereq_,module,exports){ +},{}],301:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71141,7 +71843,7 @@ function copyPathinfo(pi) { }); } -},{"../../lib":168}],303:[function(_dereq_,module,exports){ +},{"../../lib":168}],302:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71150,7 +71852,6 @@ function copyPathinfo(pi) { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Lib = _dereq_('../../lib'); @@ -71178,6 +71879,9 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } coerce('text'); + coerce('hovertext'); + coerce('hovertemplate'); + var isConstraint = (coerce('contours.type') === 'constraint'); coerce('connectgaps', Lib.isArray1D(traceOut.z)); @@ -71190,7 +71894,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } }; -},{"../../lib":168,"../heatmap/xyz_defaults":330,"./attributes":294,"./constraint_defaults":299,"./contours_defaults":301,"./style_defaults":315}],304:[function(_dereq_,module,exports){ +},{"../../lib":168,"../heatmap/xyz_defaults":329,"./attributes":293,"./constraint_defaults":298,"./contours_defaults":300,"./style_defaults":314}],303:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71254,7 +71958,7 @@ module.exports = function emptyPathinfo(contours, plotinfo, cd0) { return pathinfo; }; -},{"../../lib":168,"./constraint_mapping":300,"./end_plus":305}],305:[function(_dereq_,module,exports){ +},{"../../lib":168,"./constraint_mapping":299,"./end_plus":304}],304:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71274,7 +71978,7 @@ module.exports = function endPlus(contours) { return contours.end + contours.size / 1e6; }; -},{}],306:[function(_dereq_,module,exports){ +},{}],305:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71574,7 +72278,7 @@ function getInterpPx(pi, loc, step) { } } -},{"../../lib":168,"./constants":298}],307:[function(_dereq_,module,exports){ +},{"../../lib":168,"./constants":297}],306:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71610,7 +72314,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay return hoverData; }; -},{"../../components/color":51,"../heatmap/hover":323}],308:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../heatmap/hover":322}],307:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71642,7 +72346,7 @@ Contour.meta = { module.exports = Contour; -},{"../../plots/cartesian":224,"./attributes":294,"./calc":295,"./colorbar":297,"./defaults":303,"./hover":307,"./plot":312,"./style":314}],309:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"./attributes":293,"./calc":294,"./colorbar":296,"./defaults":302,"./hover":306,"./plot":311,"./style":313}],308:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71672,7 +72376,7 @@ module.exports = function handleLabelDefaults(coerce, layout, lineColor, opts) { if(opts.hasHover !== false) coerce('zhoverformat'); }; -},{"../../lib":168}],310:[function(_dereq_,module,exports){ +},{"../../lib":168}],309:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71762,7 +72466,7 @@ module.exports = function makeColorMap(trace) { }); }; -},{"../../components/colorscale":63,"./end_plus":305,"d3":16}],311:[function(_dereq_,module,exports){ +},{"../../components/colorscale":63,"./end_plus":304,"d3":16}],310:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -71854,7 +72558,7 @@ function getMarchingIndex(val, corners) { return (mi === 15) ? 0 : mi; } -},{"./constants":298}],312:[function(_dereq_,module,exports){ +},{"./constants":297}],311:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72540,7 +73244,7 @@ function makeClipMask(cd0) { return z; } -},{"../../components/drawing":72,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../plots/cartesian/set_convert":231,"../heatmap/plot":327,"./close_boundaries":296,"./constants":298,"./convert_to_constraints":302,"./empty_pathinfo":304,"./find_all_paths":306,"./make_crossings":311,"d3":16}],313:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../lib":168,"../../lib/svg_text_utils":189,"../../plots/cartesian/axes":212,"../../plots/cartesian/set_convert":230,"../heatmap/plot":326,"./close_boundaries":295,"./constants":297,"./convert_to_constraints":301,"./empty_pathinfo":303,"./find_all_paths":305,"./make_crossings":310,"d3":16}],312:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72644,7 +73348,7 @@ function autoContours(start, end, ncontours) { return dummyAx; } -},{"../../lib":168,"../../plots/cartesian/axes":212}],314:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212}],313:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72726,7 +73430,7 @@ module.exports = function style(gd) { heatmapStyle(gd); }; -},{"../../components/drawing":72,"../heatmap/style":328,"./make_color_map":310,"d3":16}],315:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../heatmap/style":327,"./make_color_map":309,"d3":16}],314:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72771,7 +73475,7 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, layout, handleLabelDefaults(coerce, layout, lineColor, opts); }; -},{"../../components/colorscale/defaults":61,"./label_defaults":309}],316:[function(_dereq_,module,exports){ +},{"../../components/colorscale/defaults":61,"./label_defaults":308}],315:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72783,6 +73487,7 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, layout, 'use strict'; var scatterAttrs = _dereq_('../scatter/attributes'); +var hovertemplateAttrs = _dereq_('../../components/fx/hovertemplate_attributes'); var colorscaleAttrs = _dereq_('../../components/colorscale/attributes'); var colorbarAttrs = _dereq_('../../components/colorbar/attributes'); @@ -72805,6 +73510,11 @@ module.exports = extendFlat({ valType: 'data_array', editType: 'calc', + }, + hovertext: { + valType: 'data_array', + editType: 'calc', + }, transpose: { valType: 'boolean', @@ -72865,6 +73575,8 @@ module.exports = extendFlat({ editType: 'none', }, + hovertemplate: hovertemplateAttrs() +}, { transforms: undefined }, colorscaleAttrs('', { @@ -72874,7 +73586,7 @@ module.exports = extendFlat({ { colorbar: colorbarAttrs } ); -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../lib/extend":162,"../scatter/attributes":367}],317:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../scatter/attributes":366}],316:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -72944,10 +73656,10 @@ module.exports = function calc(gd, trace) { y = trace.y ? ya.makeCalcdata(trace, 'y') : []; } - x0 = trace.x0 || 0; - dx = trace.dx || 1; - y0 = trace.y0 || 0; - dy = trace.dy || 1; + x0 = trace.x0; + dx = trace.dx; + y0 = trace.y0; + dy = trace.dy; z = clean2dArray(zIn, trace.transpose); @@ -73008,7 +73720,8 @@ module.exports = function calc(gd, trace) { x: xArray, y: yArray, z: z, - text: trace._text || trace.text + text: trace._text || trace.text, + hovertext: trace._hovertext || trace.hovertext }; if(xIn && xIn.length === xArray.length - 1) cd0.xCenter = xIn; @@ -73042,7 +73755,7 @@ module.exports = function calc(gd, trace) { return [cd0]; }; -},{"../../components/colorscale/calc":59,"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":257,"../histogram2d/calc":345,"./clean_2d_array":318,"./convert_column_xyz":320,"./find_empties":322,"./interp2d":325,"./make_bound_array":326}],318:[function(_dereq_,module,exports){ +},{"../../components/colorscale/calc":59,"../../lib":168,"../../plots/cartesian/axes":212,"../../registry":256,"../histogram2d/calc":344,"./clean_2d_array":317,"./convert_column_xyz":319,"./find_empties":321,"./interp2d":324,"./make_bound_array":325}],317:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73087,7 +73800,7 @@ module.exports = function clean2dArray(zOld, transpose) { return zNew; }; -},{"fast-isnumeric":18}],319:[function(_dereq_,module,exports){ +},{"fast-isnumeric":18}],318:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73103,7 +73816,7 @@ module.exports = { max: 'zmax' }; -},{}],320:[function(_dereq_,module,exports){ +},{}],319:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73124,6 +73837,8 @@ module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, var col2 = ax2.makeCalcdata(trace, var2Name); var textCol = trace.text; var hasColumnText = (textCol !== undefined && Lib.isArray1D(textCol)); + var hoverTextCol = trace.hovertext; + var hasColumnHoverText = (hoverTextCol !== undefined && Lib.isArray1D(hoverTextCol)); var i, j; var col1dv = Lib.distinctVals(col1); @@ -73132,6 +73847,7 @@ module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, var col2vals = col2dv.vals; var newArrays = []; var text; + var hovertext; for(i = 0; i < arrayVarNames.length; i++) { newArrays[i] = Lib.init2dArray(col2vals.length, col1vals.length); @@ -73140,6 +73856,9 @@ module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, if(hasColumnText) { text = Lib.init2dArray(col2vals.length, col1vals.length); } + if(hasColumnHoverText) { + hovertext = Lib.init2dArray(col2vals.length, col1vals.length); + } for(i = 0; i < colLen; i++) { if(col1[i] !== BADNUM && col2[i] !== BADNUM) { @@ -73154,6 +73873,7 @@ module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, } if(hasColumnText) text[i2][i1] = textCol[i]; + if(hasColumnHoverText) hovertext[i2][i1] = hoverTextCol[i]; } } @@ -73163,9 +73883,10 @@ module.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, trace['_' + arrayVarNames[j]] = newArrays[j]; } if(hasColumnText) trace._text = text; + if(hasColumnHoverText) trace._hovertext = hovertext; }; -},{"../../constants/numerical":149,"../../lib":168}],321:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168}],320:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73197,6 +73918,8 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } coerce('text'); + coerce('hovertext'); + coerce('hovertemplate'); handleStyleDefaults(traceIn, traceOut, coerce, layout); @@ -73205,7 +73928,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'}); }; -},{"../../components/colorscale/defaults":61,"../../lib":168,"./attributes":316,"./style_defaults":329,"./xyz_defaults":330}],322:[function(_dereq_,module,exports){ +},{"../../components/colorscale/defaults":61,"../../lib":168,"./attributes":315,"./style_defaults":328,"./xyz_defaults":329}],321:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73311,7 +74034,7 @@ module.exports = function findEmpties(z) { return empties.sort(function(a, b) { return b[2] - a[2]; }); }; -},{"../../lib":168}],323:[function(_dereq_,module,exports){ +},{"../../lib":168}],322:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73407,7 +74130,9 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay if(zmask && !zmask[ny][nx]) zVal = undefined; var text; - if(Array.isArray(cd0.text) && Array.isArray(cd0.text[ny])) { + if(Array.isArray(cd0.hovertext) && Array.isArray(cd0.hovertext[ny])) { + text = cd0.hovertext[ny][nx]; + } else if(Array.isArray(cd0.text) && Array.isArray(cd0.text[ny])) { text = cd0.text[ny][nx]; } @@ -73440,7 +74165,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay })]; }; -},{"../../components/fx":90,"../../lib":168,"../../plots/cartesian/axes":212}],324:[function(_dereq_,module,exports){ +},{"../../components/fx":90,"../../lib":168,"../../plots/cartesian/axes":212}],323:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73472,7 +74197,7 @@ Heatmap.meta = { module.exports = Heatmap; -},{"../../plots/cartesian":224,"./attributes":316,"./calc":317,"./colorbar":319,"./defaults":321,"./hover":323,"./plot":327,"./style":328}],325:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"./attributes":315,"./calc":316,"./colorbar":318,"./defaults":320,"./hover":322,"./plot":326,"./style":327}],324:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73607,7 +74332,7 @@ function iterateInterp2d(z, emptyPoints, overshoot) { return maxFractionalChange; } -},{"../../lib":168}],326:[function(_dereq_,module,exports){ +},{"../../lib":168}],325:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73673,20 +74398,20 @@ module.exports = function makeBoundArray(trace, arrayIn, v0In, dvIn, numbricks, } } else { - dv = dvIn || 1; - var calendar = trace[ax._id.charAt(0) + 'calendar']; - if(isHist || ax.type === 'category' || ax.type === 'multicategory') { - v0 = ax.r2c(v0In, 0, calendar) || 0; - } else if(isArrayOrTypedArray(arrayIn) && arrayIn.length === 1) { + if(isArrayOrTypedArray(arrayIn) && arrayIn.length === 1) { v0 = arrayIn[0]; } else if(v0In === undefined) { v0 = 0; + } else if(isHist || ax.type === 'category' || ax.type === 'multicategory') { + v0 = ax.r2c(v0In, 0, calendar); } else { v0 = ax.d2c(v0In, 0, calendar); } + dv = dvIn || 1; + for(i = (isContour || isGL2D) ? 0 : -0.5; i < numbricks; i++) { arrayOut.push(v0 + dv * i); } @@ -73695,7 +74420,7 @@ module.exports = function makeBoundArray(trace, arrayIn, v0In, dvIn, numbricks, return arrayOut; }; -},{"../../lib":168,"../../registry":257}],327:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],326:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -73990,7 +74715,6 @@ module.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) { context.putImageData(imageData, 0, 0); } else { // zsmooth = false -> filling potentially large bricks works fastest with fillRect - // gaps do not need to be exact integers, but if they *are* we will get // cleaner edges by rounding at least one edge var xGap = trace.xgap; @@ -74108,7 +74832,7 @@ function putColor(pixels, pxIndex, c) { pixels[pxIndex + 3] = Math.round(c[3] * 255); } -},{"../../components/colorscale":63,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../registry":257,"d3":16,"tinycolor2":34}],328:[function(_dereq_,module,exports){ +},{"../../components/colorscale":63,"../../constants/xmlns_namespaces":150,"../../lib":168,"../../registry":256,"d3":16,"tinycolor2":34}],327:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74129,7 +74853,7 @@ module.exports = function style(gd) { }); }; -},{"d3":16}],329:[function(_dereq_,module,exports){ +},{"d3":16}],328:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74152,7 +74876,7 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce) { coerce('zhoverformat'); }; -},{}],330:[function(_dereq_,module,exports){ +},{}],329:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74250,7 +74974,7 @@ function isValidZ(z) { return (allRowsAreArrays && oneRowIsFilled && hasOneNumber); } -},{"../../lib":168,"../../registry":257,"fast-isnumeric":18}],331:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"fast-isnumeric":18}],330:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74265,6 +74989,7 @@ var barAttrs = _dereq_('../bar/attributes'); var hovertemplateAttrs = _dereq_('../../components/fx/hovertemplate_attributes'); var makeBinAttrs = _dereq_('./bin_attributes'); var constants = _dereq_('./constants'); +var extendFlat = _dereq_('../../lib/extend').extendFlat; module.exports = { x: { @@ -74278,7 +75003,12 @@ module.exports = { }, - text: barAttrs.text, + text: extendFlat({}, barAttrs.text, { + + }), + hovertext: extendFlat({}, barAttrs.hovertext, { + + }), orientation: barAttrs.orientation, histfunc: { @@ -74366,6 +75096,9 @@ module.exports = { marker: barAttrs.marker, + offsetgroup: barAttrs.offsetgroup, + alignmentgroup: barAttrs.alignmentgroup, + selected: barAttrs.selected, unselected: barAttrs.unselected, @@ -74374,7 +75107,7 @@ module.exports = { } }; -},{"../../components/fx/hovertemplate_attributes":89,"../bar/attributes":267,"./bin_attributes":333,"./constants":337}],332:[function(_dereq_,module,exports){ +},{"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../bar/attributes":266,"./bin_attributes":332,"./constants":336}],331:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74400,7 +75133,7 @@ module.exports = function doAvg(size, counts) { return total; }; -},{}],333:[function(_dereq_,module,exports){ +},{}],332:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74435,7 +75168,7 @@ module.exports = function makeBinAttrs(axLetter, match) { }; }; -},{}],334:[function(_dereq_,module,exports){ +},{}],333:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74511,7 +75244,7 @@ module.exports = { } }; -},{"fast-isnumeric":18}],335:[function(_dereq_,module,exports){ +},{"fast-isnumeric":18}],334:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -74675,7 +75408,6 @@ function didDigitChange(digit, v1, v2, isDate, pa, calendar) { var dateParts2 = dateParts(v2, pa, calendar); var parti = (digit === oneYear) ? 0 : 1; return dateParts1[parti] !== dateParts2[parti]; - } return Math.floor(v2 / digit) - Math.floor(v1 / digit) > 0.1; } @@ -74689,7 +75421,7 @@ function dateParts(v, pa, calendar) { return parts; } -},{"../../constants/numerical":149,"../../plots/cartesian/axes":212}],336:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../plots/cartesian/axes":212}],335:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75185,7 +75917,6 @@ function cdf(size, direction, currentBin) { } if(currentBin === 'half') { - if(direction === 'increasing') { firstHalfPoint(0); for(i = 1; i < size.length; i++) { @@ -75222,7 +75953,7 @@ function cdf(size, direction, currentBin) { } } -},{"../../lib":168,"../../plots/cartesian/axes":212,"../bar/arrays_to_calcdata":266,"./average":332,"./bin_functions":334,"./bin_label_vals":335,"./norm_functions":343,"fast-isnumeric":18}],337:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../bar/arrays_to_calcdata":265,"./average":331,"./bin_functions":333,"./bin_label_vals":334,"./norm_functions":342,"fast-isnumeric":18}],336:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75238,7 +75969,7 @@ module.exports = { eventDataKeys: ['binNumber'] }; -},{}],338:[function(_dereq_,module,exports){ +},{}],337:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75247,12 +75978,13 @@ module.exports = { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Lib = _dereq_('../../lib'); var nestedProperty = Lib.nestedProperty; +var handleGroupingDefaults = _dereq_('../bar/defaults').handleGroupingDefaults; +var getAxisGroup = _dereq_('../../plots/cartesian/axis_ids').getAxisGroup; var attributes = _dereq_('./attributes'); var BINATTRS = { @@ -75291,20 +76023,23 @@ module.exports = function crossTraceDefaults(fullData, fullLayout) { binDirection = traceOut.orientation === 'v' ? 'x' : 'y'; // in overlay mode make a separate group for each trace // otherwise collect all traces of the same subplot & orientation - group = isOverlay ? traceOut.uid : (traceOut.xaxis + traceOut.yaxis + binDirection); - traceOut._groupName = group; - + group = traceOut._groupName = isOverlay ? traceOut.uid : ( + getAxisGroup(fullLayout, traceOut.xaxis) + + getAxisGroup(fullLayout, traceOut.yaxis) + + binDirection + ); binOpts = allBinOpts[group]; if(binOpts) { binOpts.traces.push(traceOut); - } - else { + } else { binOpts = allBinOpts[group] = { traces: [traceOut], direction: binDirection }; } + + handleGroupingDefaults(traceOut._input, traceOut, fullLayout, coerce); } for(group in allBinOpts) { @@ -75352,7 +76087,7 @@ module.exports = function crossTraceDefaults(fullData, fullLayout) { } }; -},{"../../lib":168,"./attributes":331}],339:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axis_ids":215,"../bar/defaults":270,"./attributes":330}],338:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75361,7 +76096,6 @@ module.exports = function crossTraceDefaults(fullData, fullLayout) { * LICENSE file in the root directory of this source tree. */ - 'use strict'; var Registry = _dereq_('../../registry'); @@ -75386,6 +76120,8 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout } coerce('text'); + coerce('hovertext'); + coerce('hovertemplate'); var orientation = coerce('orientation', (y && !x) ? 'h' : 'v'); var sampleLetter = orientation === 'v' ? 'x' : 'y'; @@ -75413,8 +76149,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout // autobin(x|y) are only included here to appease Plotly.validate coerce('autobin' + sampleLetter); - coerce('hovertemplate'); - handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout); Lib.coerceSelectionMarkerOpacity(traceOut, coerce); @@ -75427,7 +76161,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'}); }; -},{"../../components/color":51,"../../lib":168,"../../registry":257,"../bar/style_defaults":281,"./attributes":331}],340:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../../registry":256,"../bar/style_defaults":280,"./attributes":330}],339:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75443,6 +76177,9 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { out.x = 'xVal' in pt ? pt.xVal : pt.x; out.y = 'yVal' in pt ? pt.yVal : pt.y; + // for 2d histograms + if('zLabelVal' in pt) out.z = pt.zLabelVal; + if(pt.xa) out.xaxis = pt.xa; if(pt.ya) out.yaxis = pt.ya; @@ -75473,7 +76210,7 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { return out; }; -},{}],341:[function(_dereq_,module,exports){ +},{}],340:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75508,7 +76245,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { return pts; }; -},{"../../plots/cartesian/axes":212,"../bar/hover":273}],342:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/axes":212,"../bar/hover":272}],341:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75562,7 +76299,7 @@ Histogram.meta = { module.exports = Histogram; -},{"../../plots/cartesian":224,"../bar/cross_trace_calc":270,"../bar/layout_attributes":275,"../bar/layout_defaults":276,"../bar/plot":277,"../bar/select":278,"../bar/style":280,"../scatter/marker_colorbar":385,"./attributes":331,"./calc":336,"./cross_trace_defaults":338,"./defaults":339,"./event_data":340,"./hover":341}],343:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"../bar/cross_trace_calc":269,"../bar/layout_attributes":274,"../bar/layout_defaults":275,"../bar/plot":276,"../bar/select":277,"../bar/style":279,"../scatter/marker_colorbar":384,"./attributes":330,"./calc":335,"./cross_trace_defaults":337,"./defaults":338,"./event_data":339,"./hover":340}],342:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75597,7 +76334,7 @@ module.exports = { } }; -},{}],344:[function(_dereq_,module,exports){ +},{}],343:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75611,6 +76348,7 @@ module.exports = { var histogramAttrs = _dereq_('../histogram/attributes'); var makeBinAttrs = _dereq_('../histogram/bin_attributes'); var heatmapAttrs = _dereq_('../heatmap/attributes'); +var hovertemplateAttrs = _dereq_('../../components/fx/hovertemplate_attributes'); var colorscaleAttrs = _dereq_('../../components/colorscale/attributes'); var colorbarAttrs = _dereq_('../../components/colorbar/attributes'); @@ -75647,7 +76385,8 @@ module.exports = extendFlat( xgap: heatmapAttrs.xgap, ygap: heatmapAttrs.ygap, zsmooth: heatmapAttrs.zsmooth, - zhoverformat: heatmapAttrs.zhoverformat + zhoverformat: heatmapAttrs.zhoverformat, + hovertemplate: hovertemplateAttrs({}, {keys: 'z'}) }, colorscaleAttrs('', { cLetter: 'z', @@ -75656,7 +76395,7 @@ module.exports = extendFlat( { colorbar: colorbarAttrs } ); -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../lib/extend":162,"../heatmap/attributes":316,"../histogram/attributes":331,"../histogram/bin_attributes":333}],345:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../heatmap/attributes":315,"../histogram/attributes":330,"../histogram/bin_attributes":332}],344:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -75921,7 +76660,7 @@ function getRanges(edges, uniqueVals, gapLow, gapHigh, ax, calendar) { return out; } -},{"../../lib":168,"../../plots/cartesian/axes":212,"../histogram/average":332,"../histogram/bin_functions":334,"../histogram/bin_label_vals":335,"../histogram/norm_functions":343}],346:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../histogram/average":331,"../histogram/bin_functions":333,"../histogram/bin_label_vals":334,"../histogram/norm_functions":342}],345:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76016,7 +76755,7 @@ function cleanBins(trace, binDirection, fullLayout, autoBins) { } } -},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axis_ids":215,"./attributes":344,"fast-isnumeric":18}],347:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axis_ids":215,"./attributes":343,"fast-isnumeric":18}],346:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76048,9 +76787,10 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout colorscaleDefaults( traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'} ); + coerce('hovertemplate'); }; -},{"../../components/colorscale/defaults":61,"../../lib":168,"../heatmap/style_defaults":329,"./attributes":344,"./sample_defaults":350}],348:[function(_dereq_,module,exports){ +},{"../../components/colorscale/defaults":61,"../../lib":168,"../heatmap/style_defaults":328,"./attributes":343,"./sample_defaults":349}],347:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76084,7 +76824,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay return pts; }; -},{"../../plots/cartesian/axes":212,"../heatmap/hover":323}],349:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/axes":212,"../heatmap/hover":322}],348:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76120,7 +76860,7 @@ Histogram2D.meta = { module.exports = Histogram2D; -},{"../../plots/cartesian":224,"../heatmap/calc":317,"../heatmap/colorbar":319,"../heatmap/plot":327,"../heatmap/style":328,"../histogram/event_data":340,"./attributes":344,"./cross_trace_defaults":346,"./defaults":347,"./hover":348}],350:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"../heatmap/calc":316,"../heatmap/colorbar":318,"../heatmap/plot":326,"../heatmap/style":327,"../histogram/event_data":339,"./attributes":343,"./cross_trace_defaults":345,"./defaults":346,"./hover":347}],349:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76165,7 +76905,7 @@ module.exports = function handleSampleDefaults(traceIn, traceOut, coerce, layout coerce('autobiny'); }; -},{"../../lib":168,"../../registry":257}],351:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],350:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76202,7 +76942,8 @@ module.exports = extendFlat({ ncontours: contourAttrs.ncontours, contours: contourAttrs.contours, line: contourAttrs.line, - zhoverformat: histogram2dAttrs.zhoverformat + zhoverformat: histogram2dAttrs.zhoverformat, + hovertemplate: histogram2dAttrs.hovertemplate }, colorscaleAttrs('', { cLetter: 'z', @@ -76211,7 +76952,7 @@ module.exports = extendFlat({ { colorbar: colorbarAttrs } ); -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../lib/extend":162,"../contour/attributes":294,"../histogram2d/attributes":344}],352:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../lib/extend":162,"../contour/attributes":293,"../histogram2d/attributes":343}],351:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76245,9 +76986,10 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout handleContoursDefaults(traceIn, traceOut, coerce, coerce2); handleStyleDefaults(traceIn, traceOut, coerce, layout); + coerce('hovertemplate'); }; -},{"../../lib":168,"../contour/contours_defaults":301,"../contour/style_defaults":315,"../histogram2d/sample_defaults":350,"./attributes":351}],353:[function(_dereq_,module,exports){ +},{"../../lib":168,"../contour/contours_defaults":300,"../contour/style_defaults":314,"../histogram2d/sample_defaults":349,"./attributes":350}],352:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76282,7 +77024,7 @@ Histogram2dContour.meta = { module.exports = Histogram2dContour; -},{"../../plots/cartesian":224,"../contour/calc":295,"../contour/colorbar":297,"../contour/hover":307,"../contour/plot":312,"../contour/style":314,"../histogram2d/cross_trace_defaults":346,"./attributes":351,"./defaults":352}],354:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"../contour/calc":294,"../contour/colorbar":296,"../contour/hover":306,"../contour/plot":311,"../contour/style":313,"../histogram2d/cross_trace_defaults":345,"./attributes":350,"./defaults":351}],353:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76534,7 +77276,7 @@ module.exports = { } }; -},{"../../components/color/attributes":50,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/attributes":209,"../../plots/domain":238,"../../plots/font_attributes":239}],355:[function(_dereq_,module,exports){ +},{"../../components/color/attributes":50,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/attributes":209,"../../plots/domain":237,"../../plots/font_attributes":238}],354:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76553,8 +77295,7 @@ exports.name = 'pie'; exports.plot = function(gd) { var Pie = Registry.getModule('pie'); var cdPie = getModuleCalcData(gd.calcdata, Pie)[0]; - - if(cdPie.length) Pie.plot(gd, cdPie); + Pie.plot(gd, cdPie); }; exports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout) { @@ -76566,7 +77307,7 @@ exports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout) } }; -},{"../../plots/get_data":241,"../../registry":257}],356:[function(_dereq_,module,exports){ +},{"../../plots/get_data":240,"../../registry":256}],355:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76584,14 +77325,15 @@ var tinycolor = _dereq_('tinycolor2'); var Color = _dereq_('../../components/color'); var helpers = _dereq_('./helpers'); -exports.calc = function calc(gd, trace) { +var pieExtendedColorWays = {}; + +function calc(gd, trace) { var vals = trace.values; var hasVals = isArrayOrTypedArray(vals) && vals.length; var labels = trace.labels; var colors = trace.marker.colors || []; var cd = []; var fullLayout = gd._fullLayout; - var colorMap = fullLayout._piecolormap; var allThisTraceLabels = {}; var vTotal = 0; var hiddenLabels = fullLayout.hiddenlabels || []; @@ -76605,18 +77347,7 @@ exports.calc = function calc(gd, trace) { } } - function pullColor(color, label) { - if(!color) return false; - - color = tinycolor(color); - if(!color.isValid()) return false; - - color = Color.addOpacity(color, color.getAlpha()); - if(!colorMap[label]) colorMap[label] = color; - - return color; - } - + var pullColor = makePullColorFn(fullLayout._piecolormap); var seriesLen = (hasVals ? vals : labels).length; for(i = 0; i < seriesLen; i++) { @@ -76690,7 +77421,21 @@ exports.calc = function calc(gd, trace) { } return cd; -}; +} + +function makePullColorFn(colorMap) { + return function pullColor(color, id) { + if(!color) return false; + + color = tinycolor(color); + if(!color.isValid()) return false; + + color = Color.addOpacity(color, color.getAlpha()); + if(!colorMap[id]) colorMap[id] = color; + + return color; + }; +} /* * `calc` filled in (and collated) explicit colors. @@ -76699,45 +77444,41 @@ exports.calc = function calc(gd, trace) { * This is done after sorting, so we pick defaults * in the order slices will be displayed */ -exports.crossTraceCalc = function(gd) { +function crossTraceCalc(gd) { var fullLayout = gd._fullLayout; var calcdata = gd.calcdata; var pieColorWay = fullLayout.piecolorway; var colorMap = fullLayout._piecolormap; if(fullLayout.extendpiecolors) { - pieColorWay = generateExtendedColors(pieColorWay); + pieColorWay = generateExtendedColors(pieColorWay, pieExtendedColorWays); } var dfltColorCount = 0; - var i, j, cd, pt; - for(i = 0; i < calcdata.length; i++) { - cd = calcdata[i]; + for(var i = 0; i < calcdata.length; i++) { + var cd = calcdata[i]; if(cd[0].trace.type !== 'pie') continue; - for(j = 0; j < cd.length; j++) { - pt = cd[j]; + for(var j = 0; j < cd.length; j++) { + var pt = cd[j]; if(pt.color === false) { // have we seen this label and assigned a color to it in a previous trace? if(colorMap[pt.label]) { pt.color = colorMap[pt.label]; - } - else { + } else { colorMap[pt.label] = pt.color = pieColorWay[dfltColorCount % pieColorWay.length]; dfltColorCount++; } } } } -}; +} /** * pick a default color from the main default set, augmented by * itself lighter then darker before repeating */ -var extendedColorWays = {}; - -function generateExtendedColors(colorList) { +function generateExtendedColors(colorList, extendedColorWays) { var i; var colorString = JSON.stringify(colorList); var pieColors = extendedColorWays[colorString]; @@ -76757,7 +77498,15 @@ function generateExtendedColors(colorList) { return pieColors; } -},{"../../components/color":51,"../../lib":168,"./helpers":359,"fast-isnumeric":18,"tinycolor2":34}],357:[function(_dereq_,module,exports){ +module.exports = { + calc: calc, + crossTraceCalc: crossTraceCalc, + + makePullColorFn: makePullColorFn, + generateExtendedColors: generateExtendedColors +}; + +},{"../../components/color":51,"../../lib":168,"./helpers":358,"fast-isnumeric":18,"tinycolor2":34}],356:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76851,7 +77600,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('pull'); }; -},{"../../lib":168,"../../plots/domain":238,"./attributes":354}],358:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/domain":237,"./attributes":353}],357:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76896,7 +77645,7 @@ module.exports = function eventData(pt, trace) { return out; }; -},{"../../components/fx/helpers":86}],359:[function(_dereq_,module,exports){ +},{"../../components/fx/helpers":86}],358:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76938,7 +77687,7 @@ exports.castOption = function castOption(item, indices) { else if(item) return item; }; -},{"../../lib":168}],360:[function(_dereq_,module,exports){ +},{"../../lib":168}],359:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -76960,7 +77709,7 @@ var calcModule = _dereq_('./calc'); Pie.calc = calcModule.calc; Pie.crossTraceCalc = calcModule.crossTraceCalc; -Pie.plot = _dereq_('./plot'); +Pie.plot = _dereq_('./plot').plot; Pie.style = _dereq_('./style'); Pie.styleOne = _dereq_('./style_one'); @@ -76974,7 +77723,7 @@ Pie.meta = { module.exports = Pie; -},{"./attributes":354,"./base_plot":355,"./calc":356,"./defaults":357,"./layout_attributes":361,"./layout_defaults":362,"./plot":363,"./style":364,"./style_one":365}],361:[function(_dereq_,module,exports){ +},{"./attributes":353,"./base_plot":354,"./calc":355,"./defaults":356,"./layout_attributes":360,"./layout_defaults":361,"./plot":362,"./style":363,"./style_one":364}],360:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77010,7 +77759,7 @@ module.exports = { } }; -},{}],362:[function(_dereq_,module,exports){ +},{}],361:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77034,7 +77783,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) { coerce('extendpiecolors'); }; -},{"../../lib":168,"./layout_attributes":361}],363:[function(_dereq_,module,exports){ +},{"../../lib":168,"./layout_attributes":360}],362:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77056,7 +77805,7 @@ var svgTextUtils = _dereq_('../../lib/svg_text_utils'); var helpers = _dereq_('./helpers'); var eventData = _dereq_('./event_data'); -module.exports = function plot(gd, cdpie) { +function plot(gd, cdpie) { var fullLayout = gd._fullLayout; prerenderTitles(cdpie, gd); @@ -77103,139 +77852,11 @@ module.exports = function plot(gd, cdpie) { var sliceTop = d3.select(this); var slicePath = sliceTop.selectAll('path.surface').data([pt]); - // hover state vars - // have we drawn a hover label, so it should be cleared later - var hasHoverLabel = false; - // have we emitted a hover event, so later an unhover event should be emitted - // note that click events do not depend on this - you can still get them - // with hovermode: false or if you were earlier dragging, then clicked - // in the same slice that you moused up in - var hasHoverEvent = false; - - function handleMouseOver() { - // in case fullLayout or fullData has changed without a replot - var fullLayout2 = gd._fullLayout; - var trace2 = gd._fullData[trace.index]; - - if(gd._dragging || fullLayout2.hovermode === false) return; - - var hoverinfo = trace2.hoverinfo; - if(Array.isArray(hoverinfo)) { - // super hacky: we need to pull out the *first* hoverinfo from - // pt.pts, then put it back into an array in a dummy trace - // and call castHoverinfo on that. - // TODO: do we want to have Fx.castHoverinfo somehow handle this? - // it already takes an array for index, for 2D, so this seems tricky. - hoverinfo = Fx.castHoverinfo({ - hoverinfo: [helpers.castOption(hoverinfo, pt.pts)], - _module: trace._module - }, fullLayout2, 0); - } - - if(hoverinfo === 'all') hoverinfo = 'label+text+value+percent+name'; - - // in case we dragged over the pie from another subplot, - // or if hover is turned off - if(trace2.hovertemplate || (hoverinfo !== 'none' && hoverinfo !== 'skip' && hoverinfo)) { - var rInscribed = getInscribedRadiusFraction(pt, cd0); - var hoverCenterX = cx + pt.pxmid[0] * (1 - rInscribed); - var hoverCenterY = cy + pt.pxmid[1] * (1 - rInscribed); - var separators = fullLayout.separators; - var thisText = []; - - if(hoverinfo && hoverinfo.indexOf('label') !== -1) thisText.push(pt.label); - pt.text = helpers.castOption(trace2.hovertext || trace2.text, pt.pts); - if(hoverinfo && hoverinfo.indexOf('text') !== -1) { - var texti = pt.text; - if(texti) thisText.push(texti); - } - pt.value = pt.v; - pt.valueLabel = helpers.formatPieValue(pt.v, separators); - if(hoverinfo && hoverinfo.indexOf('value') !== -1) thisText.push(pt.valueLabel); - pt.percent = pt.v / cd0.vTotal; - pt.percentLabel = helpers.formatPiePercent(pt.percent, separators); - if(hoverinfo && hoverinfo.indexOf('percent') !== -1) thisText.push(pt.percentLabel); - - var hoverLabel = trace.hoverlabel; - var hoverFont = hoverLabel.font; - - Fx.loneHover({ - x0: hoverCenterX - rInscribed * cd0.r, - x1: hoverCenterX + rInscribed * cd0.r, - y: hoverCenterY, - text: thisText.join('
'), - name: (trace2.hovertemplate || hoverinfo.indexOf('name') !== -1) ? trace2.name : undefined, - idealAlign: pt.pxmid[0] < 0 ? 'left' : 'right', - color: helpers.castOption(hoverLabel.bgcolor, pt.pts) || pt.color, - borderColor: helpers.castOption(hoverLabel.bordercolor, pt.pts), - fontFamily: helpers.castOption(hoverFont.family, pt.pts), - fontSize: helpers.castOption(hoverFont.size, pt.pts), - fontColor: helpers.castOption(hoverFont.color, pt.pts), - - trace: trace2, - hovertemplate: helpers.castOption(trace2.hovertemplate, pt.pts), - hovertemplateLabels: pt, - eventData: [eventData(pt, trace2)] - }, { - container: fullLayout2._hoverlayer.node(), - outerContainer: fullLayout2._paper.node(), - gd: gd - }); - - hasHoverLabel = true; - } - - gd.emit('plotly_hover', { - points: [eventData(pt, trace2)], - event: d3.event - }); - hasHoverEvent = true; - } - - function handleMouseOut(evt) { - var fullLayout2 = gd._fullLayout; - var trace2 = gd._fullData[trace.index]; - - if(hasHoverEvent) { - evt.originalEvent = d3.event; - gd.emit('plotly_unhover', { - points: [eventData(pt, trace2)], - event: d3.event - }); - hasHoverEvent = false; - } - - if(hasHoverLabel) { - Fx.loneUnhover(fullLayout2._hoverlayer.node()); - hasHoverLabel = false; - } - } - - function handleClick() { - // TODO: this does not support right-click. If we want to support it, we - // would likely need to change pie to use dragElement instead of straight - // mapbox event binding. Or perhaps better, make a simple wrapper with the - // right mousedown, mousemove, and mouseup handlers just for a left/right click - // mapbox would use this too. - var fullLayout2 = gd._fullLayout; - var trace2 = gd._fullData[trace.index]; - - if(gd._dragging || fullLayout2.hovermode === false) return; - - gd._hoverdata = [eventData(pt, trace2)]; - Fx.click(gd, d3.event); - } - slicePath.enter().append('path') .classed('surface', true) .style({'pointer-events': 'all'}); - sliceTop.select('path.textline').remove(); - - sliceTop - .on('mouseover', handleMouseOver) - .on('mouseout', handleMouseOut) - .on('click', handleClick); + sliceTop.call(attachFxHandlers, gd, cd); if(trace.pull) { var pull = +helpers.castOption(trace.pull, pt.pts) || 0; @@ -77268,7 +77889,6 @@ module.exports = function plot(gd, cdpie) { } else slicePath.attr('d', outerCircle); } else { - var outerArc = arc(pt.px0, pt.px1, true, 1); if(hole) { @@ -77400,50 +78020,8 @@ module.exports = function plot(gd, cdpie) { // now make sure no labels overlap (at least within one pie) if(hasOutsideText) scootLabels(quadrants, trace); - slices.each(function(pt) { - if(pt.labelExtraX || pt.labelExtraY) { - // first move the text to its new location - var sliceTop = d3.select(this); - var sliceText = sliceTop.select('g.slicetext text'); - sliceText.attr('transform', 'translate(' + pt.labelExtraX + ',' + pt.labelExtraY + ')' + - sliceText.attr('transform')); - - // then add a line to the new location - var lineStartX = pt.cxFinal + pt.pxmid[0]; - var lineStartY = pt.cyFinal + pt.pxmid[1]; - var textLinePath = 'M' + lineStartX + ',' + lineStartY; - var finalX = (pt.yLabelMax - pt.yLabelMin) * (pt.pxmid[0] < 0 ? -1 : 1) / 4; - - if(pt.labelExtraX) { - var yFromX = pt.labelExtraX * pt.pxmid[1] / pt.pxmid[0]; - var yNet = pt.yLabelMid + pt.labelExtraY - (pt.cyFinal + pt.pxmid[1]); - - if(Math.abs(yFromX) > Math.abs(yNet)) { - textLinePath += - 'l' + (yNet * pt.pxmid[0] / pt.pxmid[1]) + ',' + yNet + - 'H' + (lineStartX + pt.labelExtraX + finalX); - } else { - textLinePath += 'l' + pt.labelExtraX + ',' + yFromX + - 'v' + (yNet - yFromX) + - 'h' + finalX; - } - } else { - textLinePath += - 'V' + (pt.yLabelMid + pt.labelExtraY) + - 'h' + finalX; - } - - sliceTop.append('path') - .classed('textline', true) - .call(Color.stroke, trace.outsidetextfont.color) - .attr({ - 'stroke-width': Math.min(2, trace.outsidetextfont.size / 8), - d: textLinePath, - fill: 'none' - }); - } - }); + plotTextLines(slices, trace); }); }); @@ -77459,7 +78037,189 @@ module.exports = function plot(gd, cdpie) { if(s.attr('dy')) s.attr('dy', s.attr('dy')); }); }, 0); -}; +} + +// TODO add support for transition +function plotTextLines(slices, trace) { + slices.each(function(pt) { + var sliceTop = d3.select(this); + + if(!pt.labelExtraX && !pt.labelExtraY) { + sliceTop.select('path.textline').remove(); + return; + } + + // first move the text to its new location + var sliceText = sliceTop.select('g.slicetext text'); + + sliceText.attr('transform', 'translate(' + pt.labelExtraX + ',' + pt.labelExtraY + ')' + + sliceText.attr('transform')); + + // then add a line to the new location + var lineStartX = pt.cxFinal + pt.pxmid[0]; + var lineStartY = pt.cyFinal + pt.pxmid[1]; + var textLinePath = 'M' + lineStartX + ',' + lineStartY; + var finalX = (pt.yLabelMax - pt.yLabelMin) * (pt.pxmid[0] < 0 ? -1 : 1) / 4; + + if(pt.labelExtraX) { + var yFromX = pt.labelExtraX * pt.pxmid[1] / pt.pxmid[0]; + var yNet = pt.yLabelMid + pt.labelExtraY - (pt.cyFinal + pt.pxmid[1]); + + if(Math.abs(yFromX) > Math.abs(yNet)) { + textLinePath += + 'l' + (yNet * pt.pxmid[0] / pt.pxmid[1]) + ',' + yNet + + 'H' + (lineStartX + pt.labelExtraX + finalX); + } else { + textLinePath += 'l' + pt.labelExtraX + ',' + yFromX + + 'v' + (yNet - yFromX) + + 'h' + finalX; + } + } else { + textLinePath += + 'V' + (pt.yLabelMid + pt.labelExtraY) + + 'h' + finalX; + } + + Lib.ensureSingle(sliceTop, 'path', 'textline') + .call(Color.stroke, trace.outsidetextfont.color) + .attr({ + 'stroke-width': Math.min(2, trace.outsidetextfont.size / 8), + d: textLinePath, + fill: 'none' + }); + }); +} + +function attachFxHandlers(sliceTop, gd, cd) { + var cd0 = cd[0]; + var trace = cd0.trace; + var cx = cd0.cx; + var cy = cd0.cy; + + // hover state vars + // have we drawn a hover label, so it should be cleared later + if(!('_hasHoverLabel' in trace)) trace._hasHoverLabel = false; + // have we emitted a hover event, so later an unhover event should be emitted + // note that click events do not depend on this - you can still get them + // with hovermode: false or if you were earlier dragging, then clicked + // in the same slice that you moused up in + if(!('_hasHoverEvent' in trace)) trace._hasHoverEvent = false; + + sliceTop.on('mouseover', function(pt) { + // in case fullLayout or fullData has changed without a replot + var fullLayout2 = gd._fullLayout; + var trace2 = gd._fullData[trace.index]; + + if(gd._dragging || fullLayout2.hovermode === false) return; + + var hoverinfo = trace2.hoverinfo; + if(Array.isArray(hoverinfo)) { + // super hacky: we need to pull out the *first* hoverinfo from + // pt.pts, then put it back into an array in a dummy trace + // and call castHoverinfo on that. + // TODO: do we want to have Fx.castHoverinfo somehow handle this? + // it already takes an array for index, for 2D, so this seems tricky. + hoverinfo = Fx.castHoverinfo({ + hoverinfo: [helpers.castOption(hoverinfo, pt.pts)], + _module: trace._module + }, fullLayout2, 0); + } + + if(hoverinfo === 'all') hoverinfo = 'label+text+value+percent+name'; + + // in case we dragged over the pie from another subplot, + // or if hover is turned off + if(trace2.hovertemplate || (hoverinfo !== 'none' && hoverinfo !== 'skip' && hoverinfo)) { + var rInscribed = pt.rInscribed; + var hoverCenterX = cx + pt.pxmid[0] * (1 - rInscribed); + var hoverCenterY = cy + pt.pxmid[1] * (1 - rInscribed); + var separators = fullLayout2.separators; + var thisText = []; + + if(hoverinfo && hoverinfo.indexOf('label') !== -1) thisText.push(pt.label); + pt.text = helpers.castOption(trace2.hovertext || trace2.text, pt.pts); + if(hoverinfo && hoverinfo.indexOf('text') !== -1) { + var texti = pt.text; + if(texti) thisText.push(texti); + } + pt.value = pt.v; + pt.valueLabel = helpers.formatPieValue(pt.v, separators); + if(hoverinfo && hoverinfo.indexOf('value') !== -1) thisText.push(pt.valueLabel); + pt.percent = pt.v / cd0.vTotal; + pt.percentLabel = helpers.formatPiePercent(pt.percent, separators); + if(hoverinfo && hoverinfo.indexOf('percent') !== -1) thisText.push(pt.percentLabel); + + var hoverLabel = trace.hoverlabel; + var hoverFont = hoverLabel.font; + + Fx.loneHover({ + x0: hoverCenterX - rInscribed * cd0.r, + x1: hoverCenterX + rInscribed * cd0.r, + y: hoverCenterY, + text: thisText.join('
'), + name: (trace2.hovertemplate || hoverinfo.indexOf('name') !== -1) ? trace2.name : undefined, + idealAlign: pt.pxmid[0] < 0 ? 'left' : 'right', + color: helpers.castOption(hoverLabel.bgcolor, pt.pts) || pt.color, + borderColor: helpers.castOption(hoverLabel.bordercolor, pt.pts), + fontFamily: helpers.castOption(hoverFont.family, pt.pts), + fontSize: helpers.castOption(hoverFont.size, pt.pts), + fontColor: helpers.castOption(hoverFont.color, pt.pts), + + trace: trace2, + hovertemplate: helpers.castOption(trace2.hovertemplate, pt.pts), + hovertemplateLabels: pt, + eventData: [eventData(pt, trace2)] + }, { + container: fullLayout2._hoverlayer.node(), + outerContainer: fullLayout2._paper.node(), + gd: gd + }); + + trace._hasHoverLabel = true; + } + + trace._hasHoverEvent = true; + gd.emit('plotly_hover', { + points: [eventData(pt, trace2)], + event: d3.event + }); + }); + + sliceTop.on('mouseout', function(evt) { + var fullLayout2 = gd._fullLayout; + var trace2 = gd._fullData[trace.index]; + var pt = d3.select(this).datum(); + + if(trace._hasHoverEvent) { + evt.originalEvent = d3.event; + gd.emit('plotly_unhover', { + points: [eventData(pt, trace2)], + event: d3.event + }); + trace._hasHoverEvent = false; + } + + if(trace._hasHoverLabel) { + Fx.loneUnhover(fullLayout2._hoverlayer.node()); + trace._hasHoverLabel = false; + } + }); + + sliceTop.on('click', function(pt) { + // TODO: this does not support right-click. If we want to support it, we + // would likely need to change pie to use dragElement instead of straight + // mapbox event binding. Or perhaps better, make a simple wrapper with the + // right mousedown, mousemove, and mouseup handlers just for a left/right click + // mapbox would use this too. + var fullLayout2 = gd._fullLayout; + var trace2 = gd._fullData[trace.index]; + + if(gd._dragging || fullLayout2.hovermode === false) return; + + gd._hoverdata = [eventData(pt, trace2)]; + Fx.click(gd, d3.event); + }); +} function determineOutsideTextFont(trace, pt, layoutFont) { var color = helpers.castOption(trace.outsidetextfont.color, pt.pts) || @@ -77484,7 +78244,6 @@ function determineOutsideTextFont(trace, pt, layoutFont) { function determineInsideTextFont(trace, pt, layoutFont) { var customColor = helpers.castOption(trace.insidetextfont.color, pt.pts); if(!customColor && trace._input.textfont) { - // Why not simply using trace.textfont? Because if not set, it // defaults to layout.font which has a default color. But if // textfont.color and insidetextfont.color don't supply a value, @@ -77539,16 +78298,17 @@ function prerenderTitles(cdpie, gd) { function transformInsideText(textBB, pt, cd0) { var textDiameter = Math.sqrt(textBB.width * textBB.width + textBB.height * textBB.height); var textAspect = textBB.width / textBB.height; - var halfAngle = Math.PI * Math.min(pt.v / cd0.vTotal, 0.5); - var ring = 1 - cd0.trace.hole; - var rInscribed = getInscribedRadiusFraction(pt, cd0); + var halfAngle = pt.halfangle; + var ring = pt.ring; + var rInscribed = pt.rInscribed; + var r = cd0.r || pt.rpx1; // max size text can be inserted inside without rotating it // this inscribes the text rectangle in a circle, which is then inscribed // in the slice, so it will be an underestimate, which some day we may want // to improve so this case can get more use var transform = { - scale: rInscribed * cd0.r * 2 / textDiameter, + scale: rInscribed * r * 2 / textDiameter, // and the center position and rotation in this case rCenter: 1 - rInscribed, @@ -77557,30 +78317,30 @@ function transformInsideText(textBB, pt, cd0) { if(transform.scale >= 1) return transform; - // max size if text is rotated radially + // max size if text is rotated radially var Qr = textAspect + 1 / (2 * Math.tan(halfAngle)); - var maxHalfHeightRotRadial = cd0.r * Math.min( + var maxHalfHeightRotRadial = r * Math.min( 1 / (Math.sqrt(Qr * Qr + 0.5) + Qr), ring / (Math.sqrt(textAspect * textAspect + ring / 2) + textAspect) ); var radialTransform = { scale: maxHalfHeightRotRadial * 2 / textBB.height, - rCenter: Math.cos(maxHalfHeightRotRadial / cd0.r) - - maxHalfHeightRotRadial * textAspect / cd0.r, + rCenter: Math.cos(maxHalfHeightRotRadial / r) - + maxHalfHeightRotRadial * textAspect / r, rotate: (180 / Math.PI * pt.midangle + 720) % 180 - 90 }; - // max size if text is rotated tangentially + // max size if text is rotated tangentially var aspectInv = 1 / textAspect; var Qt = aspectInv + 1 / (2 * Math.tan(halfAngle)); - var maxHalfWidthTangential = cd0.r * Math.min( + var maxHalfWidthTangential = r * Math.min( 1 / (Math.sqrt(Qt * Qt + 0.5) + Qt), ring / (Math.sqrt(aspectInv * aspectInv + ring / 2) + aspectInv) ); var tangentialTransform = { scale: maxHalfWidthTangential * 2 / textBB.width, - rCenter: Math.cos(maxHalfWidthTangential / cd0.r) - - maxHalfWidthTangential / textAspect / cd0.r, + rCenter: Math.cos(maxHalfWidthTangential / r) - + maxHalfWidthTangential / textAspect / r, rotate: (180 / Math.PI * pt.midangle + 810) % 180 - 90 }; // if we need a rotated transform, pick the biggest one @@ -77595,8 +78355,7 @@ function transformInsideText(textBB, pt, cd0) { function getInscribedRadiusFraction(pt, cd0) { if(pt.v === cd0.vTotal && !cd0.trace.hole) return 1;// special case of 100% with no hole - var halfAngle = Math.PI * Math.min(pt.v / cd0.vTotal, 0.5); - return Math.min(1 / (1 + 1 / Math.sin(halfAngle)), (1 - cd0.trace.hole) / 2); + return Math.min(1 / (1 + 1 / Math.sin(pt.halfangle)), pt.ring / 2); } function transformOutsideText(textBB, pt) { @@ -77749,7 +78508,6 @@ function scootLabels(quadrants, trace) { newExtraY = otherOuterY - thisInnerY - thisPt.labelExtraY; if(newExtraY * yDiffSign > 0) thisPt.labelExtraY += newExtraY; - } else if((thisOuterY + thisPt.labelExtraY - thisSliceOuterY) * yDiffSign > 0) { // farther from the equator - happens after we've done all the // vertical moving we're going to do @@ -77864,7 +78622,6 @@ function scalePies(cdpie, plotSize) { } } } - } function setCoords(cd) { @@ -77911,10 +78668,19 @@ function setCoords(cd) { cdi[lastPt] = currentCoords; cdi.largeArc = (cdi.v > cd0.vTotal / 2) ? 1 : 0; + + cdi.halfangle = Math.PI * Math.min(cdi.v / cd0.vTotal, 0.5); + cdi.ring = 1 - trace.hole; + cdi.rInscribed = getInscribedRadiusFraction(cdi, cd0); } } -},{"../../components/color":51,"../../components/drawing":72,"../../components/fx":90,"../../lib":168,"../../lib/svg_text_utils":189,"./event_data":358,"./helpers":359,"d3":16}],364:[function(_dereq_,module,exports){ +module.exports = { + plot: plot, + transformInsideText: transformInsideText +}; + +},{"../../components/color":51,"../../components/drawing":72,"../../components/fx":90,"../../lib":168,"../../lib/svg_text_utils":189,"./event_data":357,"./helpers":358,"d3":16}],363:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77943,7 +78709,7 @@ module.exports = function style(gd) { }); }; -},{"./style_one":365,"d3":16}],365:[function(_dereq_,module,exports){ +},{"./style_one":364,"d3":16}],364:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77967,7 +78733,7 @@ module.exports = function styleOne(s, pt, trace) { .call(Color.stroke, lineColor); }; -},{"../../components/color":51,"./helpers":359}],366:[function(_dereq_,module,exports){ +},{"../../components/color":51,"./helpers":358}],365:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -77984,7 +78750,6 @@ var Lib = _dereq_('../../lib'); // arrayOk attributes, merge them into calcdata array module.exports = function arraysToCalcdata(cd, trace) { - // so each point knows which index it originally came from for(var i = 0; i < cd.length; i++) cd[i].i = i; @@ -78019,7 +78784,7 @@ module.exports = function arraysToCalcdata(cd, trace) { } }; -},{"../../lib":168}],367:[function(_dereq_,module,exports){ +},{"../../lib":168}],366:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78431,7 +79196,7 @@ module.exports = { } }; -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing":72,"../../components/drawing/attributes":71,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/font_attributes":239,"./constants":371}],368:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing":72,"../../components/drawing/attributes":71,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/font_attributes":238,"./constants":370}],367:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78472,8 +79237,9 @@ function calc(gd, trace) { var yAttr = 'y'; var posAttr; if(stackGroupOpts) { - stackGroupOpts.traceIndices.push(trace.index); + Lib.pushUnique(stackGroupOpts.traceIndices, trace._expandedIndex); isV = stackGroupOpts.orientation === 'v'; + // size, like we use for bar if(isV) { yAttr = 's'; @@ -78677,7 +79443,6 @@ function calcMarkerSize(trace, serieslen) { sizeOut[i] = markerTrans(s[i]); } return sizeOut; - } else { return markerTrans(marker.size); } @@ -78721,7 +79486,7 @@ module.exports = { getStackOpts: getStackOpts }; -},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"./arrays_to_calcdata":366,"./calc_selection":369,"./colorscale_calc":370,"./subtypes":391,"fast-isnumeric":18}],369:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"./arrays_to_calcdata":365,"./calc_selection":368,"./colorscale_calc":369,"./subtypes":390,"fast-isnumeric":18}],368:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78740,7 +79505,7 @@ module.exports = function calcSelection(cd, trace) { } }; -},{"../../lib":168}],370:[function(_dereq_,module,exports){ +},{"../../lib":168}],369:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78783,7 +79548,7 @@ module.exports = function calcMarkerColorscale(gd, trace) { } }; -},{"../../components/colorscale/calc":59,"../../components/colorscale/helpers":62,"./subtypes":391}],371:[function(_dereq_,module,exports){ +},{"../../components/colorscale/calc":59,"../../components/colorscale/helpers":62,"./subtypes":390}],370:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78812,7 +79577,7 @@ module.exports = { eventDataKeys: [] }; -},{}],372:[function(_dereq_,module,exports){ +},{}],371:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -78995,7 +79760,7 @@ function getInterp(calcTrace, index, position, posAttr) { return pt0.s + (pt1.s - pt0.s) * (position - pt0[posAttr]) / (pt1[posAttr] - pt0[posAttr]); } -},{"./calc":368}],373:[function(_dereq_,module,exports){ +},{"./calc":367}],372:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79034,7 +79799,7 @@ module.exports = function crossTraceDefaults(fullData) { } }; -},{}],374:[function(_dereq_,module,exports){ +},{}],373:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79123,7 +79888,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; -},{"../../lib":168,"../../registry":257,"./attributes":367,"./constants":371,"./fillcolor_defaults":376,"./line_defaults":380,"./line_shape_defaults":382,"./marker_defaults":386,"./stack_defaults":389,"./subtypes":391,"./text_defaults":392,"./xy_defaults":393}],375:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256,"./attributes":366,"./constants":370,"./fillcolor_defaults":375,"./line_defaults":379,"./line_shape_defaults":381,"./marker_defaults":385,"./stack_defaults":388,"./subtypes":390,"./text_defaults":391,"./xy_defaults":392}],374:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79166,7 +79931,7 @@ function isValid(v) { return v || v === 0; } -},{"../../lib":168}],376:[function(_dereq_,module,exports){ +},{"../../lib":168}],375:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79204,7 +79969,7 @@ module.exports = function fillColorDefaults(traceIn, traceOut, defaultColor, coe )); }; -},{"../../components/color":51,"../../lib":168}],377:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168}],376:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79257,7 +80022,7 @@ module.exports = function getTraceColor(trace, di) { } }; -},{"../../components/color":51,"./subtypes":391}],378:[function(_dereq_,module,exports){ +},{"../../components/color":51,"./subtypes":390}],377:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79321,7 +80086,6 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { // skip the rest (for this trace) if we didn't find a close point if(pointData.index !== false) { - // the closest data point var di = cd[pointData.index]; var xc = xa.c2p(di.x, true); @@ -79439,7 +80203,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { y0: yAvg, y1: yAvg, color: color, - hovertemplate: '%{name}' + hovertemplate: false }); delete pointData.index; @@ -79454,7 +80218,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { } }; -},{"../../components/color":51,"../../components/fx":90,"../../lib":168,"../../registry":257,"./fill_hover_text":375,"./get_trace_color":377}],379:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/fx":90,"../../lib":168,"../../registry":256,"./fill_hover_text":374,"./get_trace_color":376}],378:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79501,7 +80265,7 @@ Scatter.meta = { module.exports = Scatter; -},{"../../plots/cartesian":224,"./arrays_to_calcdata":366,"./attributes":367,"./calc":368,"./cross_trace_calc":372,"./cross_trace_defaults":373,"./defaults":374,"./hover":378,"./marker_colorbar":385,"./plot":387,"./select":388,"./style":390,"./subtypes":391}],380:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"./arrays_to_calcdata":365,"./attributes":366,"./calc":367,"./cross_trace_calc":371,"./cross_trace_defaults":372,"./defaults":373,"./hover":377,"./marker_colorbar":384,"./plot":386,"./select":387,"./style":389,"./subtypes":390}],379:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79532,7 +80296,7 @@ module.exports = function lineDefaults(traceIn, traceOut, defaultColor, layout, if(!(opts || {}).noDash) coerce('line.dash'); }; -},{"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62,"../../lib":168}],381:[function(_dereq_,module,exports){ +},{"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62,"../../lib":168}],380:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -79566,9 +80330,11 @@ module.exports = function linePoints(d, opts) { var baseTolerance = opts.baseTolerance; var shape = opts.shape; var linear = shape === 'linear'; + var fill = opts.fill && opts.fill !== 'none'; var segments = []; var minTolerance = constants.minTolerance; - var pts = new Array(d.length); + var len = d.length; + var pts = new Array(len); var pti = 0; var i; @@ -79695,8 +80461,10 @@ module.exports = function linePoints(d, opts) { var ptCount = 0; for(var i = 0; i < 4; i++) { var edge = edges[i]; - var ptInt = segmentsIntersect(pt1[0], pt1[1], pt2[0], pt2[1], - edge[0], edge[1], edge[2], edge[3]); + var ptInt = segmentsIntersect( + pt1[0], pt1[1], pt2[0], pt2[1], + edge[0], edge[1], edge[2], edge[3] + ); if(ptInt && (!ptCount || Math.abs(ptInt.x - out[0][0]) > 1 || Math.abs(ptInt.y - out[0][1]) > 1 @@ -79894,7 +80662,7 @@ module.exports = function linePoints(d, opts) { } // loop over ALL points in this trace - for(i = 0; i < d.length; i++) { + for(i = 0; i < len; i++) { clusterStartPt = getPt(i); if(!clusterStartPt) continue; @@ -79903,7 +80671,7 @@ module.exports = function linePoints(d, opts) { addPt(clusterStartPt); // loop over one segment of the trace - for(i++; i < d.length; i++) { + for(i++; i < len; i++) { clusterHighPt = getPt(i); if(!clusterHighPt) { if(connectGaps) continue; @@ -79922,7 +80690,9 @@ module.exports = function linePoints(d, opts) { clusterRefDist = ptDist(clusterHighPt, clusterStartPt); - if(clusterRefDist < getTolerance(clusterHighPt, nextPt) * minTolerance) continue; + // #3147 - always include the very first and last points for fills + if(!(fill && (pti === 0 || pti === len - 1)) && + clusterRefDist < getTolerance(clusterHighPt, nextPt) * minTolerance) continue; clusterUnitVector = [ (clusterHighPt[0] - clusterStartPt[0]) / clusterRefDist, @@ -79997,7 +80767,7 @@ module.exports = function linePoints(d, opts) { return segments; }; -},{"../../constants/numerical":149,"../../lib":168,"./constants":371}],382:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"./constants":370}],381:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80016,7 +80786,7 @@ module.exports = function handleLineShapeDefaults(traceIn, traceOut, coerce) { if(shape === 'spline') coerce('line.smoothing'); }; -},{}],383:[function(_dereq_,module,exports){ +},{}],382:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80109,7 +80879,7 @@ module.exports = function linkTraces(gd, plotinfo, cdscatter) { return cdscatterSorted; }; -},{}],384:[function(_dereq_,module,exports){ +},{}],383:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80151,7 +80921,7 @@ module.exports = function makeBubbleSizeFn(trace) { }; }; -},{"fast-isnumeric":18}],385:[function(_dereq_,module,exports){ +},{"fast-isnumeric":18}],384:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80169,7 +80939,7 @@ module.exports = { max: 'cmax' }; -},{}],386:[function(_dereq_,module,exports){ +},{}],385:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80251,7 +81021,7 @@ module.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout } }; -},{"../../components/color":51,"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62,"./subtypes":391}],387:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../components/colorscale/defaults":61,"../../components/colorscale/helpers":62,"./subtypes":390}],386:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80437,7 +81207,6 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition ownFillEl3 = trace._ownFill; if(subTypes.hasLines(trace) || trace.fill !== 'none') { - if(tonext) { // This tells .style which trace to use for fill information: tonext.datum(cdscatter); @@ -80479,7 +81248,8 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition connectGaps: trace.connectgaps, baseTolerance: Math.max(line.width || 1, 3) / 4, shape: line.shape, - simplify: line.simplify + simplify: line.simplify, + fill: trace.fill }); // since we already have the pixel segments here, use them to make @@ -80823,7 +81593,7 @@ function selectMarkers(gd, idx, plotinfo, cdscatter, cdscatterAll) { }); } -},{"../../components/drawing":72,"../../lib":168,"../../lib/polygon":180,"../../registry":257,"./line_points":381,"./link_traces":383,"./subtypes":391,"d3":16}],388:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../lib":168,"../../lib/polygon":180,"../../registry":256,"./line_points":380,"./link_traces":382,"./subtypes":390,"d3":16}],387:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80878,7 +81648,7 @@ module.exports = function selectPoints(searchInfo, selectionTester) { return selection; }; -},{"./subtypes":391}],389:[function(_dereq_,module,exports){ +},{"./subtypes":390}],388:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -80984,7 +81754,7 @@ module.exports = function handleStackDefaults(traceIn, traceOut, layout, coerce) } }; -},{}],390:[function(_dereq_,module,exports){ +},{}],389:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81056,7 +81826,7 @@ module.exports = { styleOnSelect: styleOnSelect }; -},{"../../components/drawing":72,"../../registry":257,"d3":16}],391:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../registry":256,"d3":16}],390:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81095,7 +81865,7 @@ module.exports = { } }; -},{"../../lib":168}],392:[function(_dereq_,module,exports){ +},{"../../lib":168}],391:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81125,7 +81895,7 @@ module.exports = function(traceIn, traceOut, layout, coerce, opts) { } }; -},{"../../lib":168}],393:[function(_dereq_,module,exports){ +},{"../../lib":168}],392:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81169,7 +81939,7 @@ module.exports = function handleXYDefaults(traceIn, traceOut, layout, coerce) { return len; }; -},{"../../lib":168,"../../registry":257}],394:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../registry":256}],393:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81274,7 +82044,7 @@ module.exports = { hovertemplate: hovertemplateAttrs(), }; -},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing/attributes":71,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/attributes":209,"../scatter/attributes":367}],395:[function(_dereq_,module,exports){ +},{"../../components/colorbar/attributes":52,"../../components/colorscale/attributes":58,"../../components/drawing/attributes":71,"../../components/fx/hovertemplate_attributes":89,"../../lib/extend":162,"../../plots/attributes":209,"../scatter/attributes":366}],394:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81356,7 +82126,7 @@ module.exports = function calc(gd, trace) { return cd; }; -},{"../scatter/arrays_to_calcdata":366,"../scatter/calc":368,"../scatter/calc_selection":369,"../scatter/colorscale_calc":370,"fast-isnumeric":18}],396:[function(_dereq_,module,exports){ +},{"../scatter/arrays_to_calcdata":365,"../scatter/calc":367,"../scatter/calc_selection":368,"../scatter/colorscale_calc":369,"fast-isnumeric":18}],395:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81461,7 +82231,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout Lib.coerceSelectionMarkerOpacity(traceOut, coerce); }; -},{"../../lib":168,"../scatter/constants":371,"../scatter/fillcolor_defaults":376,"../scatter/line_defaults":380,"../scatter/line_shape_defaults":382,"../scatter/marker_defaults":386,"../scatter/subtypes":391,"../scatter/text_defaults":392,"./attributes":394}],397:[function(_dereq_,module,exports){ +},{"../../lib":168,"../scatter/constants":370,"../scatter/fillcolor_defaults":375,"../scatter/line_defaults":379,"../scatter/line_shape_defaults":381,"../scatter/marker_defaults":385,"../scatter/subtypes":390,"../scatter/text_defaults":391,"./attributes":393}],396:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81493,7 +82263,7 @@ module.exports = function eventData(out, pt, trace, cd, pointNumber) { return out; }; -},{}],398:[function(_dereq_,module,exports){ +},{}],397:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81564,7 +82334,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { return scatterPointData; }; -},{"../../plots/cartesian/axes":212,"../scatter/hover":378}],399:[function(_dereq_,module,exports){ +},{"../../plots/cartesian/axes":212,"../scatter/hover":377}],398:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81599,7 +82369,7 @@ ScatterTernary.meta = { module.exports = ScatterTernary; -},{"../../plots/ternary":253,"../scatter/marker_colorbar":385,"../scatter/select":388,"../scatter/style":390,"./attributes":394,"./calc":395,"./defaults":396,"./event_data":397,"./hover":398,"./plot":400}],400:[function(_dereq_,module,exports){ +},{"../../plots/ternary":252,"../scatter/marker_colorbar":384,"../scatter/select":387,"../scatter/style":389,"./attributes":393,"./calc":394,"./defaults":395,"./event_data":396,"./hover":397,"./plot":399}],399:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81632,7 +82402,7 @@ module.exports = function plot(gd, ternary, moduleCalcData) { scatterPlot(gd, plotinfo, moduleCalcData, scatterLayer); }; -},{"../scatter/plot":387}],401:[function(_dereq_,module,exports){ +},{"../scatter/plot":386}],400:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81651,7 +82421,9 @@ module.exports = { x: boxAttrs.x, x0: boxAttrs.x0, y0: boxAttrs.y0, - name: boxAttrs.name, + name: extendFlat({}, boxAttrs.name, { + + }), orientation: extendFlat({}, boxAttrs.orientation, { }), @@ -81734,6 +82506,8 @@ module.exports = { marker: boxAttrs.marker, text: boxAttrs.text, + hovertext: boxAttrs.hovertext, + hovertemplate: boxAttrs.hovertemplate, box: { visible: { @@ -81810,6 +82584,9 @@ module.exports = { }, + offsetgroup: boxAttrs.offsetgroup, + alignmentgroup: boxAttrs.alignmentgroup, + selected: boxAttrs.selected, unselected: boxAttrs.unselected, @@ -81824,7 +82601,7 @@ module.exports = { } }; -},{"../../lib/extend":162,"../box/attributes":282}],402:[function(_dereq_,module,exports){ +},{"../../lib/extend":162,"../box/attributes":281}],401:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -81864,24 +82641,32 @@ module.exports = function calc(gd, trace) { var bandwidth = cdi.bandwidth = calcBandwidth(trace, cdi, vals); var span = cdi.span = calcSpan(trace, cdi, valAxis, bandwidth); - // step that well covers the bandwidth and is multiple of span distance - var dist = span[1] - span[0]; - var n = Math.ceil(dist / (bandwidth / 3)); - var step = dist / n; + if(cdi.min === cdi.max && bandwidth === 0) { + // if span is zero and bandwidth is zero, we want a violin with zero width + span = cdi.span = [cdi.min, cdi.max]; + cdi.density = [{v: 1, t: span[0]}]; + cdi.bandwidth = bandwidth; + maxKDE = Math.max(maxKDE, 1); + } else { + // step that well covers the bandwidth and is multiple of span distance + var dist = span[1] - span[0]; + var n = Math.ceil(dist / (bandwidth / 3)); + var step = dist / n; - if(!isFinite(step) || !isFinite(n)) { - Lib.error('Something went wrong with computing the violin span'); - cd[0].t.empty = true; - return cd; - } + if(!isFinite(step) || !isFinite(n)) { + Lib.error('Something went wrong with computing the violin span'); + cd[0].t.empty = true; + return cd; + } - var kde = helpers.makeKDE(cdi, trace, vals); - cdi.density = new Array(n); + var kde = helpers.makeKDE(cdi, trace, vals); + cdi.density = new Array(n); - for(var k = 0, t = span[0]; t < (span[1] + step / 2); k++, t += step) { - var v = kde(t); - cdi.density[k] = {v: v, t: t}; - maxKDE = Math.max(maxKDE, v); + for(var k = 0, t = span[0]; t < (span[1] + step / 2); k++, t += step) { + var v = kde(t); + cdi.density[k] = {v: v, t: t}; + maxKDE = Math.max(maxKDE, v); + } } maxCount = Math.max(maxCount, vals.length); @@ -81927,8 +82712,16 @@ function silvermanRule(len, ssd, iqr) { function calcBandwidth(trace, cdi, vals) { var span = cdi.max - cdi.min; - // plot single-value violin with bandwidth of 1 - if(!span) return 1; + // If span is zero + if(!span) { + if(trace.bandwidth) { + return trace.bandwidth; + } else { + // if span is zero and no bandwidth is specified + // it returns zero bandwidth which is a special case + return 0; + } + } // Limit how small the bandwidth can be. // @@ -81984,7 +82777,7 @@ function calcSpan(trace, cdi, valAxis, bandwidth) { return spanOut; } -},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"../box/calc":283,"./helpers":405}],403:[function(_dereq_,module,exports){ +},{"../../constants/numerical":149,"../../lib":168,"../../plots/cartesian/axes":212,"../box/calc":282,"./helpers":404}],402:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82027,7 +82820,7 @@ module.exports = function crossTraceCalc(gd, plotinfo) { } }; -},{"../box/cross_trace_calc":284}],404:[function(_dereq_,module,exports){ +},{"../box/cross_trace_calc":283}],403:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82088,7 +82881,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout if(!meanLineVisible) traceOut.meanline = {visible: false}; }; -},{"../../components/color":51,"../../lib":168,"../box/defaults":285,"./attributes":401}],405:[function(_dereq_,module,exports){ +},{"../../components/color":51,"../../lib":168,"../box/defaults":284,"./attributes":400}],404:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82161,7 +82954,7 @@ exports.getKdeValue = function(calcItem, trace, valueDist) { exports.extractVal = function(o) { return o.v; }; -},{"../../lib":168}],406:[function(_dereq_,module,exports){ +},{"../../lib":168}],405:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82235,6 +83028,9 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay closeBoxData[0].spikeDistance = undefined; closeBoxData[0][spikePosAttr] = undefined; + // no hovertemplate support yet + kdePointData.hovertemplate = false; + closeData.push(kdePointData); violinLineAttrs = {stroke: pointData.color}; @@ -82270,7 +83066,7 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode, hoverLay return closeData; }; -},{"../../lib":168,"../../plots/cartesian/axes":212,"../box/hover":287,"./helpers":405}],407:[function(_dereq_,module,exports){ +},{"../../lib":168,"../../plots/cartesian/axes":212,"../box/hover":286,"./helpers":404}],406:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82285,6 +83081,7 @@ module.exports = { attributes: _dereq_('./attributes'), layoutAttributes: _dereq_('./layout_attributes'), supplyDefaults: _dereq_('./defaults'), + crossTraceDefaults: _dereq_('../box/defaults').crossTraceDefaults, supplyLayoutDefaults: _dereq_('./layout_defaults'), calc: _dereq_('./calc'), crossTraceCalc: _dereq_('./cross_trace_calc'), @@ -82303,7 +83100,7 @@ module.exports = { } }; -},{"../../plots/cartesian":224,"../box/select":292,"../scatter/style":390,"./attributes":401,"./calc":402,"./cross_trace_calc":403,"./defaults":404,"./hover":406,"./layout_attributes":408,"./layout_defaults":409,"./plot":410,"./style":411}],408:[function(_dereq_,module,exports){ +},{"../../plots/cartesian":223,"../box/defaults":284,"../box/select":291,"../scatter/style":389,"./attributes":400,"./calc":401,"./cross_trace_calc":402,"./defaults":403,"./hover":405,"./layout_attributes":407,"./layout_defaults":408,"./plot":409,"./style":410}],407:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82329,7 +83126,7 @@ module.exports = { }) }; -},{"../../lib":168,"../box/layout_attributes":289}],409:[function(_dereq_,module,exports){ +},{"../../lib":168,"../box/layout_attributes":288}],408:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82351,7 +83148,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, fullData) { boxLayoutDefaults._supply(layoutIn, layoutOut, fullData, coerce, 'violin'); }; -},{"../../lib":168,"../box/layout_defaults":290,"./layout_attributes":408}],410:[function(_dereq_,module,exports){ +},{"../../lib":168,"../box/layout_defaults":289,"./layout_attributes":407}],409:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82542,7 +83339,7 @@ module.exports = function plot(gd, plotinfo, cdViolins, violinLayer) { }); }; -},{"../../components/drawing":72,"../../lib":168,"../box/plot":291,"../scatter/line_points":381,"./helpers":405,"d3":16}],411:[function(_dereq_,module,exports){ +},{"../../components/drawing":72,"../../lib":168,"../box/plot":290,"../scatter/line_points":380,"./helpers":404,"d3":16}],410:[function(_dereq_,module,exports){ /** * Copyright 2012-2019, Plotly, Inc. * All rights reserved. @@ -82597,5 +83394,5 @@ module.exports = function style(gd, cd) { }); }; -},{"../../components/color":51,"../scatter/style":390,"d3":16}]},{},[11])(11) +},{"../../components/color":51,"../scatter/style":389,"d3":16}]},{},[11])(11) }); diff --git a/static/babybuddy/js/graph.js.gz b/static/babybuddy/js/graph.js.gz index cb6f2e06..dcdde0a7 100644 Binary files a/static/babybuddy/js/graph.js.gz and b/static/babybuddy/js/graph.js.gz differ diff --git a/static/staticfiles.json b/static/staticfiles.json index 61009f33..a6491abd 100644 --- a/static/staticfiles.json +++ b/static/staticfiles.json @@ -1 +1 @@ -{"paths": {"admin/js/vendor/select2/i18n/ar.js": "admin/js/vendor/select2/i18n/ar.a8bb27ec698c.js", "admin/js/vendor/select2/i18n/az.js": "admin/js/vendor/select2/i18n/az.498dc667b34e.js", "admin/js/vendor/select2/i18n/bg.js": "admin/js/vendor/select2/i18n/bg.89cba4df3c86.js", "admin/js/vendor/select2/i18n/ca.js": "admin/js/vendor/select2/i18n/ca.2eaad4eb1950.js", "admin/js/vendor/select2/i18n/cs.js": "admin/js/vendor/select2/i18n/cs.a68bcd293adc.js", "admin/js/vendor/select2/i18n/da.js": "admin/js/vendor/select2/i18n/da.cbf897a0ae53.js", "admin/js/vendor/select2/i18n/de.js": "admin/js/vendor/select2/i18n/de.366d0aacb55f.js", "admin/js/vendor/select2/i18n/el.js": "admin/js/vendor/select2/i18n/el.5629ce65500f.js", "admin/js/vendor/select2/i18n/en.js": "admin/js/vendor/select2/i18n/en.05649b26c086.js", "admin/js/vendor/select2/i18n/es.js": "admin/js/vendor/select2/i18n/es.dc9dbf9d65df.js", "admin/js/vendor/select2/i18n/et.js": "admin/js/vendor/select2/i18n/et.c3953fb90b6b.js", "admin/js/vendor/select2/i18n/eu.js": "admin/js/vendor/select2/i18n/eu.11b925456433.js", "admin/js/vendor/select2/i18n/fa.js": "admin/js/vendor/select2/i18n/fa.98e52839b583.js", "admin/js/vendor/select2/i18n/fi.js": "admin/js/vendor/select2/i18n/fi.659847deefdc.js", "admin/js/vendor/select2/i18n/fr.js": "admin/js/vendor/select2/i18n/fr.b06a3340de45.js", "admin/js/vendor/select2/i18n/gl.js": "admin/js/vendor/select2/i18n/gl.78a87f7c0a51.js", "admin/js/vendor/select2/i18n/he.js": "admin/js/vendor/select2/i18n/he.222d90ee0344.js", "admin/js/vendor/select2/i18n/hi.js": "admin/js/vendor/select2/i18n/hi.116a90b7111b.js", "admin/js/vendor/select2/i18n/hr.js": "admin/js/vendor/select2/i18n/hr.e1d2c70b4df5.js", "admin/js/vendor/select2/i18n/hu.js": "admin/js/vendor/select2/i18n/hu.db45641f10b2.js", "admin/js/vendor/select2/i18n/id.js": "admin/js/vendor/select2/i18n/id.6ee6c9c64b94.js", "admin/js/vendor/select2/i18n/is.js": "admin/js/vendor/select2/i18n/is.808c7d47acb5.js", "admin/js/vendor/select2/i18n/it.js": "admin/js/vendor/select2/i18n/it.bae1661dbb77.js", "admin/js/vendor/select2/i18n/ja.js": "admin/js/vendor/select2/i18n/ja.19cf1ce8a03d.js", "admin/js/vendor/select2/i18n/km.js": "admin/js/vendor/select2/i18n/km.6074a9c5575c.js", "admin/js/vendor/select2/i18n/ko.js": "admin/js/vendor/select2/i18n/ko.74b17541834f.js", "admin/js/vendor/select2/i18n/lt.js": "admin/js/vendor/select2/i18n/lt.a0783b1bd159.js", "admin/js/vendor/select2/i18n/lv.js": "admin/js/vendor/select2/i18n/lv.07fe2a580d17.js", "admin/js/vendor/select2/i18n/mk.js": "admin/js/vendor/select2/i18n/mk.4986d7fc3ff3.js", "admin/js/vendor/select2/i18n/ms.js": "admin/js/vendor/select2/i18n/ms.23e7b4369579.js", "admin/js/vendor/select2/i18n/nb.js": "admin/js/vendor/select2/i18n/nb.137e184004aa.js", "admin/js/vendor/select2/i18n/nl.js": "admin/js/vendor/select2/i18n/nl.c363ace8aa05.js", "admin/js/vendor/select2/i18n/pl.js": "admin/js/vendor/select2/i18n/pl.76465b54a6b0.js", "admin/js/vendor/select2/i18n/pt-BR.js": "admin/js/vendor/select2/i18n/pt-BR.9efbbac4fda8.js", "admin/js/vendor/select2/i18n/pt.js": "admin/js/vendor/select2/i18n/pt.5d6ccc53b347.js", "admin/js/vendor/select2/i18n/ro.js": "admin/js/vendor/select2/i18n/ro.1ddc2b9980dc.js", "admin/js/vendor/select2/i18n/ru.js": "admin/js/vendor/select2/i18n/ru.d83609abf2e0.js", "admin/js/vendor/select2/i18n/sk.js": "admin/js/vendor/select2/i18n/sk.a0f1a818d092.js", "admin/js/vendor/select2/i18n/sr-Cyrl.js": "admin/js/vendor/select2/i18n/sr-Cyrl.2f3047aad49e.js", "admin/js/vendor/select2/i18n/sr.js": "admin/js/vendor/select2/i18n/sr.157bc6eb978e.js", "admin/js/vendor/select2/i18n/sv.js": "admin/js/vendor/select2/i18n/sv.2b21bb3f6110.js", "admin/js/vendor/select2/i18n/th.js": "admin/js/vendor/select2/i18n/th.2a4ece4c4355.js", "admin/js/vendor/select2/i18n/tr.js": "admin/js/vendor/select2/i18n/tr.c1925d8817db.js", "admin/js/vendor/select2/i18n/uk.js": "admin/js/vendor/select2/i18n/uk.3d56f311192d.js", "admin/js/vendor/select2/i18n/vi.js": "admin/js/vendor/select2/i18n/vi.3520aa7bdea8.js", "admin/js/vendor/select2/i18n/zh-CN.js": "admin/js/vendor/select2/i18n/zh-CN.419002d3c6c1.js", "admin/js/vendor/select2/i18n/zh-TW.js": "admin/js/vendor/select2/i18n/zh-TW.c021537edf2c.js", "admin/css/vendor/select2/LICENSE-SELECT2.md": "admin/css/vendor/select2/LICENSE-SELECT2.7cf1de939f3b.md", "admin/css/vendor/select2/select2.css": "admin/css/vendor/select2/select2.3805311d5fc1.css", "admin/css/vendor/select2/select2.min.css": "admin/css/vendor/select2/select2.min.d44571114a90.css", "admin/js/vendor/jquery/jquery.js": "admin/js/vendor/jquery/jquery.6a07da9fae93.js", "admin/js/vendor/jquery/jquery.min.js": "admin/js/vendor/jquery/jquery.min.a09e13ee94d5.js", "admin/js/vendor/jquery/LICENSE.txt": "admin/js/vendor/jquery/LICENSE.a158210a2737.txt", "admin/js/vendor/select2/LICENSE.md": "admin/js/vendor/select2/LICENSE.7cf1de939f3b.md", "admin/js/vendor/select2/select2.full.js": "admin/js/vendor/select2/select2.full.a95323cb4760.js", "admin/js/vendor/select2/select2.full.min.js": "admin/js/vendor/select2/select2.full.min.da607360bcc6.js", "admin/js/vendor/xregexp/LICENSE.txt": "admin/js/vendor/xregexp/LICENSE.d64cecf4f157.txt", "admin/js/vendor/xregexp/xregexp.js": "admin/js/vendor/xregexp/xregexp.1865b1cf5085.js", "admin/js/vendor/xregexp/xregexp.min.js": "admin/js/vendor/xregexp/xregexp.min.c95393b8ca4d.js", "babybuddy/img/core/child-placeholder.png": "babybuddy/img/core/child-placeholder.7c0a81f0d7f0.png", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.d9cd17260641.css", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/js/api.js": "rest_framework/docs/js/api.c9743eab7a4f.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "admin/img/gis/move_vertex_off.svg": "admin/img/gis/move_vertex_off.7a23bf31ef8a.svg", "admin/img/gis/move_vertex_on.svg": "admin/img/gis/move_vertex_on.0047eba25b67.svg", "admin/js/admin/DateTimeShortcuts.js": "admin/js/admin/DateTimeShortcuts.e3407a6ea666.js", "admin/js/admin/RelatedObjectLookups.js": "admin/js/admin/RelatedObjectLookups.ea0683bea064.js", "babybuddy/css/app.css": "babybuddy/css/app.73d068e09b53.css", "babybuddy/css/vendor.css": "babybuddy/css/vendor.be1a1448dd86.css", "babybuddy/fonts/fontawesome-webfont.eot": "babybuddy/fonts/fontawesome-webfont.674f50d287a8.eot", "babybuddy/fonts/fontawesome-webfont.svg": "babybuddy/fonts/fontawesome-webfont.912ec66d7572.svg", "babybuddy/fonts/fontawesome-webfont.ttf": "babybuddy/fonts/fontawesome-webfont.b06871f281fe.ttf", "babybuddy/fonts/fontawesome-webfont.woff": "babybuddy/fonts/fontawesome-webfont.fee66e712a8a.woff", "babybuddy/fonts/fontawesome-webfont.woff2": "babybuddy/fonts/fontawesome-webfont.af7ae505a9ee.woff2", "babybuddy/fonts/FontAwesome.otf": "babybuddy/fonts/FontAwesome.0d2717cd5d85.otf", "babybuddy/js/app.js": "babybuddy/js/app.818b5a7636cd.js", "babybuddy/js/graph.js": "babybuddy/js/graph.9d17ed9a2576.js", "babybuddy/js/vendor.js": "babybuddy/js/vendor.9c126bd7589e.js", "babybuddy/logo/icon-brand.png": "babybuddy/logo/icon-brand.96e4491f2209.png", "babybuddy/logo/icon.png": "babybuddy/logo/icon.6377611bf399.png", "babybuddy/logo/icon2.png": "babybuddy/logo/icon2.be48fd16c53f.png", "babybuddy/logo/logo.png": "babybuddy/logo/logo.62870041cc83.png", "babybuddy/root/android-chrome-192x192.png": "babybuddy/root/android-chrome-192x192.484bd0e8cb66.png", "babybuddy/root/android-chrome-384x384.png": "babybuddy/root/android-chrome-384x384.7849615a1e26.png", "babybuddy/root/android-chrome-512x512.png": "babybuddy/root/android-chrome-512x512.89ee40b783cd.png", "babybuddy/root/apple-touch-icon.png": "babybuddy/root/apple-touch-icon.33416748f239.png", "babybuddy/root/browserconfig.xml": "babybuddy/root/browserconfig.118acb4bca3d.xml", "babybuddy/root/favicon-16x16.png": "babybuddy/root/favicon-16x16.12c501486484.png", "babybuddy/root/favicon-32x32.png": "babybuddy/root/favicon-32x32.076f1340f1cf.png", "babybuddy/root/favicon.ico": "babybuddy/root/favicon.1b19cfd81791.ico", "babybuddy/root/mstile-150x150.png": "babybuddy/root/mstile-150x150.f231c8ff6157.png", "babybuddy/root/safari-pinned-tab.svg": "babybuddy/root/safari-pinned-tab.3de51db2baf2.svg", "babybuddy/root/site.webmanifest.json": "babybuddy/root/site.webmanifest.5d647514e2b7.json", "rest_framework/css/bootstrap-theme.css": "rest_framework/css/bootstrap-theme.a279820bbeb5.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.66b84a04375e.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.46ed116b0edd.css", "rest_framework/css/bootstrap.css": "rest_framework/css/bootstrap.23773f1bb199.css", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.77017a69879a.css", "rest_framework/css/default.css": "rest_framework/css/default.8d5591a6aabc.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.0ea6e6052ab5.js", "rest_framework/js/bootstrap.js": "rest_framework/js/bootstrap.4919e6382103.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.3d8308804264.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.753b7a1f2ee7.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/jquery-3.3.1.min.js": "rest_framework/js/jquery-3.3.1.min.a09e13ee94d5.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "admin/css/autocomplete.css": "admin/css/autocomplete.781713f30664.css", "admin/css/base.css": "admin/css/base.4e3bba263270.css", "admin/css/changelists.css": "admin/css/changelists.f6dc691f8d62.css", "admin/css/dashboard.css": "admin/css/dashboard.7ac78187c567.css", "admin/css/fonts.css": "admin/css/fonts.494e4ec545c9.css", "admin/css/forms.css": "admin/css/forms.2da17328804f.css", "admin/css/login.css": "admin/css/login.a846c0e2ef65.css", "admin/css/responsive.css": "admin/css/responsive.d1e3572cb104.css", "admin/css/responsive_rtl.css": "admin/css/responsive_rtl.2a6652327ccd.css", "admin/css/rtl.css": "admin/css/rtl.306dbf6d5df6.css", "admin/css/widgets.css": "admin/css/widgets.5e372b41c483.css", "admin/fonts/LICENSE.txt": "admin/fonts/LICENSE.d273d63619c9.txt", "admin/fonts/README.txt": "admin/fonts/README.2c3d0bcdede2.txt", "admin/fonts/Roboto-Bold-webfont.woff": "admin/fonts/Roboto-Bold-webfont.2ad99072841e.woff", "admin/fonts/Roboto-Light-webfont.woff": "admin/fonts/Roboto-Light-webfont.b446c2399bb6.woff", "admin/fonts/Roboto-Regular-webfont.woff": "admin/fonts/Roboto-Regular-webfont.ec39515ae8c6.woff", "admin/img/calendar-icons.svg": "admin/img/calendar-icons.39b290681a8b.svg", "admin/img/icon-addlink.svg": "admin/img/icon-addlink.d519b3bab011.svg", "admin/img/icon-alert.svg": "admin/img/icon-alert.034cc7d8a67f.svg", "admin/img/icon-calendar.svg": "admin/img/icon-calendar.ac7aea671bea.svg", "admin/img/icon-changelink.svg": "admin/img/icon-changelink.18d2fd706348.svg", "admin/img/icon-clock.svg": "admin/img/icon-clock.e1d4dfac3f2b.svg", "admin/img/icon-deletelink.svg": "admin/img/icon-deletelink.564ef9dc3854.svg", "admin/img/icon-no.svg": "admin/img/icon-no.439e821418cd.svg", "admin/img/icon-unknown-alt.svg": "admin/img/icon-unknown-alt.81536e128bb6.svg", "admin/img/icon-unknown.svg": "admin/img/icon-unknown.a18cb4398978.svg", "admin/img/icon-viewlink.svg": "admin/img/icon-viewlink.41eb31f7826e.svg", "admin/img/icon-yes.svg": "admin/img/icon-yes.d2f9f035226a.svg", "admin/img/inline-delete.svg": "admin/img/inline-delete.fec1b761f254.svg", "admin/img/LICENSE": "admin/img/LICENSE.2c54f4e1ca1c", "admin/img/README.txt": "admin/img/README.a70711a38d87.txt", "admin/img/search.svg": "admin/img/search.7cf54ff789c6.svg", "admin/img/selector-icons.svg": "admin/img/selector-icons.b4555096cea2.svg", "admin/img/sorting-icons.svg": "admin/img/sorting-icons.3a097b59f104.svg", "admin/img/tooltag-add.svg": "admin/img/tooltag-add.e59d620a9742.svg", "admin/img/tooltag-arrowright.svg": "admin/img/tooltag-arrowright.bbfb788a849e.svg", "admin/js/actions.js": "admin/js/actions.2fb8e8349c22.js", "admin/js/actions.min.js": "admin/js/actions.min.5fa8cb0403f1.js", "admin/js/autocomplete.js": "admin/js/autocomplete.cfd2c4dc8981.js", "admin/js/calendar.js": "admin/js/calendar.aae57adab5f6.js", "admin/js/cancel.js": "admin/js/cancel.d6b4b556c3aa.js", "admin/js/change_form.js": "admin/js/change_form.9e85003a1a38.js", "admin/js/collapse.js": "admin/js/collapse.acba97a53595.js", "admin/js/collapse.min.js": "admin/js/collapse.min.2ee8a0086864.js", "admin/js/core.js": "admin/js/core.9c3bce7d1006.js", "admin/js/inlines.js": "admin/js/inlines.3b3fb199b064.js", "admin/js/inlines.min.js": "admin/js/inlines.min.4d23f8660b21.js", "admin/js/jquery.init.js": "admin/js/jquery.init.95b62fa19378.js", "admin/js/popup_response.js": "admin/js/popup_response.6ce3197f8fc8.js", "admin/js/prepopulate.js": "admin/js/prepopulate.2f90da7170ec.js", "admin/js/prepopulate.min.js": "admin/js/prepopulate.min.85fd5e0fb706.js", "admin/js/prepopulate_init.js": "admin/js/prepopulate_init.0d3b53c37074.js", "admin/js/SelectBox.js": "admin/js/SelectBox.b49f008d186b.js", "admin/js/SelectFilter2.js": "admin/js/SelectFilter2.bf63c55b78f6.js", "admin/js/timeparse.js": "admin/js/timeparse.51258861a46a.js", "admin/js/urlify.js": "admin/js/urlify.4087f3e18796.js"}, "version": "1.0"} \ No newline at end of file +{"paths": {"admin/js/vendor/select2/i18n/ar.js": "admin/js/vendor/select2/i18n/ar.a8bb27ec698c.js", "admin/js/vendor/select2/i18n/az.js": "admin/js/vendor/select2/i18n/az.498dc667b34e.js", "admin/js/vendor/select2/i18n/bg.js": "admin/js/vendor/select2/i18n/bg.89cba4df3c86.js", "admin/js/vendor/select2/i18n/ca.js": "admin/js/vendor/select2/i18n/ca.2eaad4eb1950.js", "admin/js/vendor/select2/i18n/cs.js": "admin/js/vendor/select2/i18n/cs.a68bcd293adc.js", "admin/js/vendor/select2/i18n/da.js": "admin/js/vendor/select2/i18n/da.cbf897a0ae53.js", "admin/js/vendor/select2/i18n/de.js": "admin/js/vendor/select2/i18n/de.366d0aacb55f.js", "admin/js/vendor/select2/i18n/el.js": "admin/js/vendor/select2/i18n/el.5629ce65500f.js", "admin/js/vendor/select2/i18n/en.js": "admin/js/vendor/select2/i18n/en.05649b26c086.js", "admin/js/vendor/select2/i18n/es.js": "admin/js/vendor/select2/i18n/es.dc9dbf9d65df.js", "admin/js/vendor/select2/i18n/et.js": "admin/js/vendor/select2/i18n/et.c3953fb90b6b.js", "admin/js/vendor/select2/i18n/eu.js": "admin/js/vendor/select2/i18n/eu.11b925456433.js", "admin/js/vendor/select2/i18n/fa.js": "admin/js/vendor/select2/i18n/fa.98e52839b583.js", "admin/js/vendor/select2/i18n/fi.js": "admin/js/vendor/select2/i18n/fi.659847deefdc.js", "admin/js/vendor/select2/i18n/fr.js": "admin/js/vendor/select2/i18n/fr.b06a3340de45.js", "admin/js/vendor/select2/i18n/gl.js": "admin/js/vendor/select2/i18n/gl.78a87f7c0a51.js", "admin/js/vendor/select2/i18n/he.js": "admin/js/vendor/select2/i18n/he.222d90ee0344.js", "admin/js/vendor/select2/i18n/hi.js": "admin/js/vendor/select2/i18n/hi.116a90b7111b.js", "admin/js/vendor/select2/i18n/hr.js": "admin/js/vendor/select2/i18n/hr.e1d2c70b4df5.js", "admin/js/vendor/select2/i18n/hu.js": "admin/js/vendor/select2/i18n/hu.db45641f10b2.js", "admin/js/vendor/select2/i18n/id.js": "admin/js/vendor/select2/i18n/id.6ee6c9c64b94.js", "admin/js/vendor/select2/i18n/is.js": "admin/js/vendor/select2/i18n/is.808c7d47acb5.js", "admin/js/vendor/select2/i18n/it.js": "admin/js/vendor/select2/i18n/it.bae1661dbb77.js", "admin/js/vendor/select2/i18n/ja.js": "admin/js/vendor/select2/i18n/ja.19cf1ce8a03d.js", "admin/js/vendor/select2/i18n/km.js": "admin/js/vendor/select2/i18n/km.6074a9c5575c.js", "admin/js/vendor/select2/i18n/ko.js": "admin/js/vendor/select2/i18n/ko.74b17541834f.js", "admin/js/vendor/select2/i18n/lt.js": "admin/js/vendor/select2/i18n/lt.a0783b1bd159.js", "admin/js/vendor/select2/i18n/lv.js": "admin/js/vendor/select2/i18n/lv.07fe2a580d17.js", "admin/js/vendor/select2/i18n/mk.js": "admin/js/vendor/select2/i18n/mk.4986d7fc3ff3.js", "admin/js/vendor/select2/i18n/ms.js": "admin/js/vendor/select2/i18n/ms.23e7b4369579.js", "admin/js/vendor/select2/i18n/nb.js": "admin/js/vendor/select2/i18n/nb.137e184004aa.js", "admin/js/vendor/select2/i18n/nl.js": "admin/js/vendor/select2/i18n/nl.c363ace8aa05.js", "admin/js/vendor/select2/i18n/pl.js": "admin/js/vendor/select2/i18n/pl.76465b54a6b0.js", "admin/js/vendor/select2/i18n/pt-BR.js": "admin/js/vendor/select2/i18n/pt-BR.9efbbac4fda8.js", "admin/js/vendor/select2/i18n/pt.js": "admin/js/vendor/select2/i18n/pt.5d6ccc53b347.js", "admin/js/vendor/select2/i18n/ro.js": "admin/js/vendor/select2/i18n/ro.1ddc2b9980dc.js", "admin/js/vendor/select2/i18n/ru.js": "admin/js/vendor/select2/i18n/ru.d83609abf2e0.js", "admin/js/vendor/select2/i18n/sk.js": "admin/js/vendor/select2/i18n/sk.a0f1a818d092.js", "admin/js/vendor/select2/i18n/sr-Cyrl.js": "admin/js/vendor/select2/i18n/sr-Cyrl.2f3047aad49e.js", "admin/js/vendor/select2/i18n/sr.js": "admin/js/vendor/select2/i18n/sr.157bc6eb978e.js", "admin/js/vendor/select2/i18n/sv.js": "admin/js/vendor/select2/i18n/sv.2b21bb3f6110.js", "admin/js/vendor/select2/i18n/th.js": "admin/js/vendor/select2/i18n/th.2a4ece4c4355.js", "admin/js/vendor/select2/i18n/tr.js": "admin/js/vendor/select2/i18n/tr.c1925d8817db.js", "admin/js/vendor/select2/i18n/uk.js": "admin/js/vendor/select2/i18n/uk.3d56f311192d.js", "admin/js/vendor/select2/i18n/vi.js": "admin/js/vendor/select2/i18n/vi.3520aa7bdea8.js", "admin/js/vendor/select2/i18n/zh-CN.js": "admin/js/vendor/select2/i18n/zh-CN.419002d3c6c1.js", "admin/js/vendor/select2/i18n/zh-TW.js": "admin/js/vendor/select2/i18n/zh-TW.c021537edf2c.js", "admin/css/vendor/select2/LICENSE-SELECT2.md": "admin/css/vendor/select2/LICENSE-SELECT2.7cf1de939f3b.md", "admin/css/vendor/select2/select2.css": "admin/css/vendor/select2/select2.3805311d5fc1.css", "admin/css/vendor/select2/select2.min.css": "admin/css/vendor/select2/select2.min.d44571114a90.css", "admin/js/vendor/jquery/jquery.js": "admin/js/vendor/jquery/jquery.6a07da9fae93.js", "admin/js/vendor/jquery/jquery.min.js": "admin/js/vendor/jquery/jquery.min.a09e13ee94d5.js", "admin/js/vendor/jquery/LICENSE.txt": "admin/js/vendor/jquery/LICENSE.a158210a2737.txt", "admin/js/vendor/select2/LICENSE.md": "admin/js/vendor/select2/LICENSE.7cf1de939f3b.md", "admin/js/vendor/select2/select2.full.js": "admin/js/vendor/select2/select2.full.a95323cb4760.js", "admin/js/vendor/select2/select2.full.min.js": "admin/js/vendor/select2/select2.full.min.da607360bcc6.js", "admin/js/vendor/xregexp/LICENSE.txt": "admin/js/vendor/xregexp/LICENSE.d64cecf4f157.txt", "admin/js/vendor/xregexp/xregexp.js": "admin/js/vendor/xregexp/xregexp.1865b1cf5085.js", "admin/js/vendor/xregexp/xregexp.min.js": "admin/js/vendor/xregexp/xregexp.min.c95393b8ca4d.js", "babybuddy/img/core/child-placeholder.png": "babybuddy/img/core/child-placeholder.7c0a81f0d7f0.png", "rest_framework/docs/css/base.css": "rest_framework/docs/css/base.d9cd17260641.css", "rest_framework/docs/css/highlight.css": "rest_framework/docs/css/highlight.e0e4d973c6d7.css", "rest_framework/docs/css/jquery.json-view.min.css": "rest_framework/docs/css/jquery.json-view.min.a2e6beeb6710.css", "rest_framework/docs/img/favicon.ico": "rest_framework/docs/img/favicon.5195b4d0f3eb.ico", "rest_framework/docs/img/grid.png": "rest_framework/docs/img/grid.a4b938cf382b.png", "rest_framework/docs/js/api.js": "rest_framework/docs/js/api.c9743eab7a4f.js", "rest_framework/docs/js/highlight.pack.js": "rest_framework/docs/js/highlight.pack.479b5f21dcba.js", "rest_framework/docs/js/jquery.json-view.min.js": "rest_framework/docs/js/jquery.json-view.min.b7c2d6981377.js", "admin/img/gis/move_vertex_off.svg": "admin/img/gis/move_vertex_off.7a23bf31ef8a.svg", "admin/img/gis/move_vertex_on.svg": "admin/img/gis/move_vertex_on.0047eba25b67.svg", "admin/js/admin/DateTimeShortcuts.js": "admin/js/admin/DateTimeShortcuts.e3407a6ea666.js", "admin/js/admin/RelatedObjectLookups.js": "admin/js/admin/RelatedObjectLookups.ea0683bea064.js", "babybuddy/css/app.css": "babybuddy/css/app.73d068e09b53.css", "babybuddy/css/vendor.css": "babybuddy/css/vendor.be1a1448dd86.css", "babybuddy/fonts/fontawesome-webfont.eot": "babybuddy/fonts/fontawesome-webfont.674f50d287a8.eot", "babybuddy/fonts/fontawesome-webfont.svg": "babybuddy/fonts/fontawesome-webfont.912ec66d7572.svg", "babybuddy/fonts/fontawesome-webfont.ttf": "babybuddy/fonts/fontawesome-webfont.b06871f281fe.ttf", "babybuddy/fonts/fontawesome-webfont.woff": "babybuddy/fonts/fontawesome-webfont.fee66e712a8a.woff", "babybuddy/fonts/fontawesome-webfont.woff2": "babybuddy/fonts/fontawesome-webfont.af7ae505a9ee.woff2", "babybuddy/fonts/FontAwesome.otf": "babybuddy/fonts/FontAwesome.0d2717cd5d85.otf", "babybuddy/js/app.js": "babybuddy/js/app.818b5a7636cd.js", "babybuddy/js/graph.js": "babybuddy/js/graph.531e69c82303.js", "babybuddy/js/vendor.js": "babybuddy/js/vendor.9c126bd7589e.js", "babybuddy/logo/icon-brand.png": "babybuddy/logo/icon-brand.96e4491f2209.png", "babybuddy/logo/icon.png": "babybuddy/logo/icon.6377611bf399.png", "babybuddy/logo/icon2.png": "babybuddy/logo/icon2.be48fd16c53f.png", "babybuddy/logo/logo.png": "babybuddy/logo/logo.62870041cc83.png", "babybuddy/root/android-chrome-192x192.png": "babybuddy/root/android-chrome-192x192.484bd0e8cb66.png", "babybuddy/root/android-chrome-384x384.png": "babybuddy/root/android-chrome-384x384.7849615a1e26.png", "babybuddy/root/android-chrome-512x512.png": "babybuddy/root/android-chrome-512x512.89ee40b783cd.png", "babybuddy/root/apple-touch-icon.png": "babybuddy/root/apple-touch-icon.33416748f239.png", "babybuddy/root/browserconfig.xml": "babybuddy/root/browserconfig.118acb4bca3d.xml", "babybuddy/root/favicon-16x16.png": "babybuddy/root/favicon-16x16.12c501486484.png", "babybuddy/root/favicon-32x32.png": "babybuddy/root/favicon-32x32.076f1340f1cf.png", "babybuddy/root/favicon.ico": "babybuddy/root/favicon.1b19cfd81791.ico", "babybuddy/root/mstile-150x150.png": "babybuddy/root/mstile-150x150.f231c8ff6157.png", "babybuddy/root/safari-pinned-tab.svg": "babybuddy/root/safari-pinned-tab.3de51db2baf2.svg", "babybuddy/root/site.webmanifest.json": "babybuddy/root/site.webmanifest.5d647514e2b7.json", "rest_framework/css/bootstrap-theme.css": "rest_framework/css/bootstrap-theme.a279820bbeb5.css", "rest_framework/css/bootstrap-theme.min.css": "rest_framework/css/bootstrap-theme.min.66b84a04375e.css", "rest_framework/css/bootstrap-tweaks.css": "rest_framework/css/bootstrap-tweaks.46ed116b0edd.css", "rest_framework/css/bootstrap.css": "rest_framework/css/bootstrap.23773f1bb199.css", "rest_framework/css/bootstrap.min.css": "rest_framework/css/bootstrap.min.77017a69879a.css", "rest_framework/css/default.css": "rest_framework/css/default.8d5591a6aabc.css", "rest_framework/css/font-awesome-4.0.3.css": "rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css", "rest_framework/css/prettify.css": "rest_framework/css/prettify.a987f72342ee.css", "rest_framework/fonts/fontawesome-webfont.eot": "rest_framework/fonts/fontawesome-webfont.8b27bc96115c.eot", "rest_framework/fonts/fontawesome-webfont.svg": "rest_framework/fonts/fontawesome-webfont.83e37a11f9d7.svg", "rest_framework/fonts/fontawesome-webfont.ttf": "rest_framework/fonts/fontawesome-webfont.dcb26c7239d8.ttf", "rest_framework/fonts/fontawesome-webfont.woff": "rest_framework/fonts/fontawesome-webfont.3293616ec0c6.woff", "rest_framework/fonts/glyphicons-halflings-regular.eot": "rest_framework/fonts/glyphicons-halflings-regular.f4769f9bdb74.eot", "rest_framework/fonts/glyphicons-halflings-regular.svg": "rest_framework/fonts/glyphicons-halflings-regular.08eda92397ae.svg", "rest_framework/fonts/glyphicons-halflings-regular.ttf": "rest_framework/fonts/glyphicons-halflings-regular.e18bbf611f2a.ttf", "rest_framework/fonts/glyphicons-halflings-regular.woff": "rest_framework/fonts/glyphicons-halflings-regular.fa2772327f55.woff", "rest_framework/fonts/glyphicons-halflings-regular.woff2": "rest_framework/fonts/glyphicons-halflings-regular.448c34a56d69.woff2", "rest_framework/img/glyphicons-halflings-white.png": "rest_framework/img/glyphicons-halflings-white.9bbc6e960299.png", "rest_framework/img/glyphicons-halflings.png": "rest_framework/img/glyphicons-halflings.90233c9067e9.png", "rest_framework/img/grid.png": "rest_framework/img/grid.a4b938cf382b.png", "rest_framework/js/ajax-form.js": "rest_framework/js/ajax-form.0ea6e6052ab5.js", "rest_framework/js/bootstrap.js": "rest_framework/js/bootstrap.4919e6382103.js", "rest_framework/js/bootstrap.min.js": "rest_framework/js/bootstrap.min.3d8308804264.js", "rest_framework/js/coreapi-0.1.1.js": "rest_framework/js/coreapi-0.1.1.8851fb9336c9.js", "rest_framework/js/csrf.js": "rest_framework/js/csrf.753b7a1f2ee7.js", "rest_framework/js/default.js": "rest_framework/js/default.5b08897dbdc3.js", "rest_framework/js/jquery-3.3.1.min.js": "rest_framework/js/jquery-3.3.1.min.a09e13ee94d5.js", "rest_framework/js/prettify-min.js": "rest_framework/js/prettify-min.709bfcc456c6.js", "admin/css/autocomplete.css": "admin/css/autocomplete.781713f30664.css", "admin/css/base.css": "admin/css/base.4e3bba263270.css", "admin/css/changelists.css": "admin/css/changelists.f6dc691f8d62.css", "admin/css/dashboard.css": "admin/css/dashboard.7ac78187c567.css", "admin/css/fonts.css": "admin/css/fonts.494e4ec545c9.css", "admin/css/forms.css": "admin/css/forms.2da17328804f.css", "admin/css/login.css": "admin/css/login.a846c0e2ef65.css", "admin/css/responsive.css": "admin/css/responsive.d1e3572cb104.css", "admin/css/responsive_rtl.css": "admin/css/responsive_rtl.2a6652327ccd.css", "admin/css/rtl.css": "admin/css/rtl.306dbf6d5df6.css", "admin/css/widgets.css": "admin/css/widgets.5e372b41c483.css", "admin/fonts/LICENSE.txt": "admin/fonts/LICENSE.d273d63619c9.txt", "admin/fonts/README.txt": "admin/fonts/README.2c3d0bcdede2.txt", "admin/fonts/Roboto-Bold-webfont.woff": "admin/fonts/Roboto-Bold-webfont.2ad99072841e.woff", "admin/fonts/Roboto-Light-webfont.woff": "admin/fonts/Roboto-Light-webfont.b446c2399bb6.woff", "admin/fonts/Roboto-Regular-webfont.woff": "admin/fonts/Roboto-Regular-webfont.ec39515ae8c6.woff", "admin/img/calendar-icons.svg": "admin/img/calendar-icons.39b290681a8b.svg", "admin/img/icon-addlink.svg": "admin/img/icon-addlink.d519b3bab011.svg", "admin/img/icon-alert.svg": "admin/img/icon-alert.034cc7d8a67f.svg", "admin/img/icon-calendar.svg": "admin/img/icon-calendar.ac7aea671bea.svg", "admin/img/icon-changelink.svg": "admin/img/icon-changelink.18d2fd706348.svg", "admin/img/icon-clock.svg": "admin/img/icon-clock.e1d4dfac3f2b.svg", "admin/img/icon-deletelink.svg": "admin/img/icon-deletelink.564ef9dc3854.svg", "admin/img/icon-no.svg": "admin/img/icon-no.439e821418cd.svg", "admin/img/icon-unknown-alt.svg": "admin/img/icon-unknown-alt.81536e128bb6.svg", "admin/img/icon-unknown.svg": "admin/img/icon-unknown.a18cb4398978.svg", "admin/img/icon-viewlink.svg": "admin/img/icon-viewlink.41eb31f7826e.svg", "admin/img/icon-yes.svg": "admin/img/icon-yes.d2f9f035226a.svg", "admin/img/inline-delete.svg": "admin/img/inline-delete.fec1b761f254.svg", "admin/img/LICENSE": "admin/img/LICENSE.2c54f4e1ca1c", "admin/img/README.txt": "admin/img/README.a70711a38d87.txt", "admin/img/search.svg": "admin/img/search.7cf54ff789c6.svg", "admin/img/selector-icons.svg": "admin/img/selector-icons.b4555096cea2.svg", "admin/img/sorting-icons.svg": "admin/img/sorting-icons.3a097b59f104.svg", "admin/img/tooltag-add.svg": "admin/img/tooltag-add.e59d620a9742.svg", "admin/img/tooltag-arrowright.svg": "admin/img/tooltag-arrowright.bbfb788a849e.svg", "admin/js/actions.js": "admin/js/actions.2fb8e8349c22.js", "admin/js/actions.min.js": "admin/js/actions.min.5fa8cb0403f1.js", "admin/js/autocomplete.js": "admin/js/autocomplete.cfd2c4dc8981.js", "admin/js/calendar.js": "admin/js/calendar.aae57adab5f6.js", "admin/js/cancel.js": "admin/js/cancel.d6b4b556c3aa.js", "admin/js/change_form.js": "admin/js/change_form.9e85003a1a38.js", "admin/js/collapse.js": "admin/js/collapse.acba97a53595.js", "admin/js/collapse.min.js": "admin/js/collapse.min.2ee8a0086864.js", "admin/js/core.js": "admin/js/core.9c3bce7d1006.js", "admin/js/inlines.js": "admin/js/inlines.3b3fb199b064.js", "admin/js/inlines.min.js": "admin/js/inlines.min.4d23f8660b21.js", "admin/js/jquery.init.js": "admin/js/jquery.init.95b62fa19378.js", "admin/js/popup_response.js": "admin/js/popup_response.6ce3197f8fc8.js", "admin/js/prepopulate.js": "admin/js/prepopulate.2f90da7170ec.js", "admin/js/prepopulate.min.js": "admin/js/prepopulate.min.85fd5e0fb706.js", "admin/js/prepopulate_init.js": "admin/js/prepopulate_init.0d3b53c37074.js", "admin/js/SelectBox.js": "admin/js/SelectBox.b49f008d186b.js", "admin/js/SelectFilter2.js": "admin/js/SelectFilter2.bf63c55b78f6.js", "admin/js/timeparse.js": "admin/js/timeparse.51258861a46a.js", "admin/js/urlify.js": "admin/js/urlify.4087f3e18796.js"}, "version": "1.0"} \ No newline at end of file