Repository: plotly/plotly.py
Pull request #518 (2016-07-05 16:56:16)

Added _make_colorscale method and 2D Density Plot
@theengineear @jackparmer 

No new tests since `validate_colors` is already covered by another set of tests.


Patch:
diff --git a/plotly/graph_reference/default-schema.json b/plotly/graph_reference/default-schema.json
index a14218abf..ed1b04071 100644
--- a/plotly/graph_reference/default-schema.json
+++ b/plotly/graph_reference/default-schema.json
@@ -253,17 +253,37 @@
                             "valType": "number"
                         },
                         "ax": {
-                            "description": "Sets the x component of the arrow tail about the arrow head. A positive (negative) component corresponds to an arrow pointing from right to left (left to right)",
+                            "description": "Sets the x component of the arrow tail about the arrow head. If `axref` is `pixel`, a positive (negative)  component corresponds to an arrow pointing from right to left (left to right). If `axref` is an axis, this is a value on that axis.",
                             "dflt": -10,
                             "role": "info",
                             "valType": "number"
                         },
+                        "axref": {
+                            "description": "Indicates in what terms the tail of the annotation (ax,ay)  is specified. If `pixel`, `ax` is a relative offset in pixels  from `x`. If set to an x axis id (e.g. *x* or *x2*), `ax` is  specified in the same terms as that axis. This is useful  for trendline annotations which should continue to indicate  the correct trend when zoomed.",
+                            "dflt": "pixel",
+                            "role": "info",
+                            "valType": "enumerated",
+                            "values": [
+                                "pixel",
+                                "/^x([2-9]|[1-9][0-9]+)?$/"
+                            ]
+                        },
                         "ay": {
-                            "description": "Sets the y component of the arrow tail about the arrow head. A positive (negative) component corresponds to an arrow pointing from bottom to top (top to bottom)",
+                            "description": "Sets the y component of the arrow tail about the arrow head. If `ayref` is `pixel`, a positive (negative)  component corresponds to an arrow pointing from bottom to top (top to bottom). If `ayref` is an axis, this is a value on that axis.",
                             "dflt": -30,
                             "role": "info",
                             "valType": "number"
                         },
+                        "ayref": {
+                            "description": "Indicates in what terms the tail of the annotation (ax,ay)  is specified. If `pixel`, `ay` is a relative offset in pixels  from `y`. If set to a y axis id (e.g. *y* or *y2*), `ay` is  specified in the same terms as that axis. This is useful  for trendline annotations which should continue to indicate  the correct trend when zoomed.",
+                            "dflt": "pixel",
+                            "role": "info",
+                            "valType": "enumerated",
+                            "values": [
+                                "pixel",
+                                "/^y([2-9]|[1-9][0-9]+)?$/"
+                            ]
+                        },
                         "bgcolor": {
                             "description": "Sets the background color of the annotation.",
                             "dflt": "rgba(0,0,0,0)",
@@ -1494,7 +1514,7 @@
                         ]
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 0,
                         "min": 0,
                         "role": "style",
@@ -1899,7 +1919,7 @@
                         ]
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 0,
                         "min": 0,
                         "role": "style",
@@ -2304,7 +2324,7 @@
                         ]
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 0,
                         "min": 0,
                         "role": "style",
@@ -2795,7 +2815,7 @@
                         "valType": "number"
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 6,
                         "min": 1,
                         "role": "style",
@@ -3059,7 +3079,7 @@
                         "valType": "number"
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 6,
                         "min": 1,
                         "role": "style",
@@ -3329,7 +3349,7 @@
                         "valType": "number"
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 6,
                         "min": 1,
                         "role": "style",
@@ -3764,7 +3784,7 @@
                     ]
                 },
                 "nticks": {
-                    "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                    "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                     "dflt": 0,
                     "min": 0,
                     "role": "style",
@@ -4374,7 +4394,7 @@
                     ]
                 },
                 "nticks": {
-                    "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                    "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                     "dflt": 0,
                     "min": 0,
                     "role": "style",
@@ -4864,7 +4884,7 @@
                 "marker": {
                     "color": {
                         "arrayOk": true,
-                        "description": "Sets the marker color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                        "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                         "role": "style",
                         "valType": "color"
                     },
@@ -5529,13 +5549,13 @@
                 },
                 "marker": {
                     "autocolorscale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.color`.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                         "dflt": true,
                         "role": "style",
                         "valType": "boolean"
                     },
                     "cauto": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                         "dflt": true,
                         "role": "info",
                         "valType": "boolean"
@@ -5554,7 +5574,7 @@
                     },
                     "color": {
                         "arrayOk": true,
-                        "description": "Sets the marker color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                        "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                         "role": "style",
                         "valType": "color"
                     },
@@ -5616,7 +5636,7 @@
                             ]
                         },
                         "nticks": {
-                            "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                            "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                             "dflt": 0,
                             "min": 0,
                             "role": "style",
@@ -5897,7 +5917,7 @@
                         }
                     },
                     "colorscale": {
-                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`.",
+                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                         "role": "style",
                         "valType": "colorscale"
                     },
@@ -5908,13 +5928,13 @@
                     },
                     "line": {
                         "autocolorscale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.line.color`.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                             "dflt": true,
                             "role": "style",
                             "valType": "boolean"
                         },
                         "cauto": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                             "dflt": true,
                             "role": "info",
                             "valType": "boolean"
@@ -5933,12 +5953,12 @@
                         },
                         "color": {
                             "arrayOk": true,
-                            "description": "Sets the marker.line color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                            "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                             "role": "style",
                             "valType": "color"
                         },
                         "colorscale": {
-                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`.",
+                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                             "role": "style",
                             "valType": "colorscale"
                         },
@@ -5948,7 +5968,7 @@
                             "valType": "string"
                         },
                         "reversescale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the colorscale.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                             "dflt": false,
                             "role": "style",
                             "valType": "boolean"
@@ -5957,6 +5977,7 @@
                         "width": {
                             "arrayOk": true,
                             "description": "Sets the width (in px) of the lines bounding the marker points.",
+                            "dflt": 0,
                             "min": 0,
                             "role": "style",
                             "valType": "number"
@@ -5968,7 +5989,7 @@
                         }
                     },
                     "reversescale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the colorscale.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                         "dflt": false,
                         "role": "style",
                         "valType": "boolean"
@@ -6239,14 +6260,14 @@
                 "marker": {
                     "color": {
                         "arrayOk": false,
-                        "description": "Sets the marker color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                        "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                         "role": "style",
                         "valType": "color"
                     },
                     "line": {
                         "color": {
                             "arrayOk": false,
-                            "description": "Sets the marker.line color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                            "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                             "dflt": "#444",
                             "role": "style",
                             "valType": "color"
@@ -6806,7 +6827,7 @@
                         ]
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 0,
                         "min": 0,
                         "role": "style",
@@ -7144,7 +7165,7 @@
                     "line": {
                         "color": {
                             "arrayOk": true,
-                            "description": "Sets the marker.line color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                            "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                             "role": "style",
                             "valType": "color"
                         },
@@ -7346,7 +7367,7 @@
                         ]
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 0,
                         "min": 0,
                         "role": "style",
@@ -7754,7 +7775,7 @@
                     "valType": "string"
                 },
                 "ncontours": {
-                    "description": "Sets the number of contour levels. Has an effect only if `autocontour` is *true*.",
+                    "description": "Sets the maximum number of contour levels. The actual number of contours will be chosen automatically to be less than or equal to the value of `ncontours`. Has an effect only if `autocontour` is *true*.",
                     "dflt": 0,
                     "role": "style",
                     "valType": "integer"
@@ -7993,7 +8014,7 @@
                         ]
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 0,
                         "min": 0,
                         "role": "style",
@@ -8785,13 +8806,13 @@
                 },
                 "marker": {
                     "autocolorscale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.color`.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                         "dflt": true,
                         "role": "style",
                         "valType": "boolean"
                     },
                     "cauto": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                         "dflt": true,
                         "role": "info",
                         "valType": "boolean"
@@ -8810,7 +8831,7 @@
                     },
                     "color": {
                         "arrayOk": true,
-                        "description": "Sets the marker color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                        "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                         "role": "style",
                         "valType": "color"
                     },
@@ -8872,7 +8893,7 @@
                             ]
                         },
                         "nticks": {
-                            "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                            "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                             "dflt": 0,
                             "min": 0,
                             "role": "style",
@@ -9153,7 +9174,7 @@
                         }
                     },
                     "colorscale": {
-                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`.",
+                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                         "role": "style",
                         "valType": "colorscale"
                     },
@@ -9164,13 +9185,13 @@
                     },
                     "line": {
                         "autocolorscale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.line.color`.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                             "dflt": true,
                             "role": "style",
                             "valType": "boolean"
                         },
                         "cauto": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                             "dflt": true,
                             "role": "info",
                             "valType": "boolean"
@@ -9189,12 +9210,12 @@
                         },
                         "color": {
                             "arrayOk": true,
-                            "description": "Sets the marker.line color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                            "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                             "role": "style",
                             "valType": "color"
                         },
                         "colorscale": {
-                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`.",
+                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                             "role": "style",
                             "valType": "colorscale"
                         },
@@ -9204,7 +9225,7 @@
                             "valType": "string"
                         },
                         "reversescale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the colorscale.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                             "dflt": false,
                             "role": "style",
                             "valType": "boolean"
@@ -9225,7 +9246,7 @@
                         }
                     },
                     "reversescale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the colorscale.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                         "dflt": false,
                         "role": "style",
                         "valType": "boolean"
@@ -9520,7 +9541,7 @@
                         ]
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 0,
                         "min": 0,
                         "role": "style",
@@ -10146,7 +10167,7 @@
                         ]
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 0,
                         "min": 0,
                         "role": "style",
@@ -10589,7 +10610,7 @@
                     "valType": "integer"
                 },
                 "ncontours": {
-                    "description": "Sets the number of contour levels. Has an effect only if `autocontour` is *true*.",
+                    "description": "Sets the maximum number of contour levels. The actual number of contours will be chosen automatically to be less than or equal to the value of `ncontours`. Has an effect only if `autocontour` is *true*.",
                     "dflt": 0,
                     "role": "style",
                     "valType": "integer"
@@ -10830,7 +10851,7 @@
                         ]
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 0,
                         "min": 0,
                         "role": "style",
@@ -12053,6 +12074,15 @@
                     "role": "info",
                     "valType": "flaglist"
                 },
+                "hoveron": {
+                    "description": "Do the hover effects highlight individual points (markers or line points) or do they highlight filled regions? If the fill is *toself* or *tonext* and there are no markers or text, then the default is *fills*, otherwise it is *points*.",
+                    "flags": [
+                        "points",
+                        "fills"
+                    ],
+                    "role": "info",
+                    "valType": "flaglist"
+                },
                 "legendgroup": {
                     "description": "Sets the legend group for this trace. Traces part of the same legend group hide/show at the same time when toggling legend items.",
                     "dflt": "",
@@ -12112,13 +12142,13 @@
                 },
                 "marker": {
                     "autocolorscale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.color`.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                         "dflt": true,
                         "role": "style",
                         "valType": "boolean"
                     },
                     "cauto": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                         "dflt": true,
                         "role": "info",
                         "valType": "boolean"
@@ -12137,7 +12167,7 @@
                     },
                     "color": {
                         "arrayOk": true,
-                        "description": "Sets the marker color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                        "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                         "role": "style",
                         "valType": "color"
                     },
@@ -12199,7 +12229,7 @@
                             ]
                         },
                         "nticks": {
-                            "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                            "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                             "dflt": 0,
                             "min": 0,
                             "role": "style",
@@ -12480,7 +12510,7 @@
                         }
                     },
                     "colorscale": {
-                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`.",
+                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                         "role": "style",
                         "valType": "colorscale"
                     },
@@ -12491,13 +12521,13 @@
                     },
                     "line": {
                         "autocolorscale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.line.color`.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                             "dflt": true,
                             "role": "style",
                             "valType": "boolean"
                         },
                         "cauto": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                             "dflt": true,
                             "role": "info",
                             "valType": "boolean"
@@ -12516,12 +12546,12 @@
                         },
                         "color": {
                             "arrayOk": true,
-                            "description": "Sets the marker.line color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                            "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                             "role": "style",
                             "valType": "color"
                         },
                         "colorscale": {
-                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`.",
+                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                             "role": "style",
                             "valType": "colorscale"
                         },
@@ -12531,7 +12561,7 @@
                             "valType": "string"
                         },
                         "reversescale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the colorscale.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                             "dflt": false,
                             "role": "style",
                             "valType": "boolean"
@@ -12571,7 +12601,7 @@
                         "valType": "string"
                     },
                     "reversescale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the colorscale.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                         "dflt": false,
                         "role": "style",
                         "valType": "boolean"
@@ -13463,11 +13493,46 @@
                     "valType": "string"
                 },
                 "line": {
+                    "autocolorscale": {
+                        "description": "Has an effect only if `line.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `line.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
+                        "dflt": true,
+                        "role": "style",
+                        "valType": "boolean"
+                    },
+                    "cauto": {
+                        "description": "Has an effect only if `line.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
+                        "dflt": true,
+                        "role": "info",
+                        "valType": "boolean"
+                    },
+                    "cmax": {
+                        "description": "Has an effect only if `line.color` is set to a numerical array. Sets the upper bound of the color domain. Value should be associated to the `line.color` array index, and if set, `line.cmin` must be set as well.",
+                        "dflt": null,
+                        "role": "info",
+                        "valType": "number"
+                    },
+                    "cmin": {
+                        "description": "Has an effect only if `line.color` is set to a numerical array. Sets the lower bound of the color domain. Value should be associated to the `line.color` array index, and if set, `line.cmax` must be set as well.",
+                        "dflt": null,
+                        "role": "info",
+                        "valType": "number"
+                    },
                     "color": {
-                        "description": "Sets the line color.",
+                        "arrayOk": true,
+                        "description": "Sets the line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                         "role": "style",
                         "valType": "color"
                     },
+                    "colorscale": {
+                        "description": "Sets the colorscale and only has an effect if `line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `line.cmin` and `line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
+                        "role": "style",
+                        "valType": "colorscale"
+                    },
+                    "colorsrc": {
+                        "description": "Sets the source reference on plot.ly for  color .",
+                        "role": "info",
+                        "valType": "string"
+                    },
                     "dash": {
                         "description": "Sets the style of the lines. Set to a dash string type or a dash length in px.",
                         "dflt": "solid",
@@ -13482,7 +13547,19 @@
                             "longdashdot"
                         ]
                     },
+                    "reversescale": {
+                        "description": "Has an effect only if `line.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
+                        "dflt": false,
+                        "role": "style",
+                        "valType": "boolean"
+                    },
                     "role": "object",
+                    "showscale": {
+                        "description": "Has an effect only if `line.color` is set to a numerical array. Determines whether or not a colorbar is displayed.",
+                        "dflt": false,
+                        "role": "info",
+                        "valType": "boolean"
+                    },
                     "width": {
                         "description": "Sets the line width (in px).",
                         "dflt": 2,
@@ -13493,13 +13570,13 @@
                 },
                 "marker": {
                     "autocolorscale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.color`.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                         "dflt": true,
                         "role": "style",
                         "valType": "boolean"
                     },
                     "cauto": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                         "dflt": true,
                         "role": "info",
                         "valType": "boolean"
@@ -13518,7 +13595,7 @@
                     },
                     "color": {
                         "arrayOk": true,
-                        "description": "Sets the marker color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                        "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                         "role": "style",
                         "valType": "color"
                     },
@@ -13580,7 +13657,7 @@
                             ]
                         },
                         "nticks": {
-                            "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                            "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                             "dflt": 0,
                             "min": 0,
                             "role": "style",
@@ -13861,7 +13938,7 @@
                         }
                     },
                     "colorscale": {
-                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`.",
+                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                         "role": "style",
                         "valType": "colorscale"
                     },
@@ -13872,13 +13949,13 @@
                     },
                     "line": {
                         "autocolorscale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.line.color`.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                             "dflt": true,
                             "role": "style",
                             "valType": "boolean"
                         },
                         "cauto": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                             "dflt": true,
                             "role": "info",
                             "valType": "boolean"
@@ -13897,12 +13974,12 @@
                         },
                         "color": {
                             "arrayOk": true,
-                            "description": "Sets the marker.line color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                            "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                             "role": "style",
                             "valType": "color"
                         },
                         "colorscale": {
-                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`.",
+                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                             "role": "style",
                             "valType": "colorscale"
                         },
@@ -13912,7 +13989,7 @@
                             "valType": "string"
                         },
                         "reversescale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the colorscale.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                             "dflt": false,
                             "role": "style",
                             "valType": "boolean"
@@ -13935,7 +14012,7 @@
                         "valType": "number"
                     },
                     "reversescale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the colorscale.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                         "dflt": false,
                         "role": "style",
                         "valType": "boolean"
@@ -14382,13 +14459,13 @@
                 },
                 "marker": {
                     "autocolorscale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.color`.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                         "dflt": true,
                         "role": "style",
                         "valType": "boolean"
                     },
                     "cauto": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                         "dflt": true,
                         "role": "info",
                         "valType": "boolean"
@@ -14407,7 +14484,7 @@
                     },
                     "color": {
                         "arrayOk": true,
-                        "description": "Sets the marker color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                        "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                         "role": "style",
                         "valType": "color"
                     },
@@ -14469,7 +14546,7 @@
                             ]
                         },
                         "nticks": {
-                            "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                            "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                             "dflt": 0,
                             "min": 0,
                             "role": "style",
@@ -14750,7 +14827,7 @@
                         }
                     },
                     "colorscale": {
-                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`.",
+                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                         "role": "style",
                         "valType": "colorscale"
                     },
@@ -14761,13 +14838,13 @@
                     },
                     "line": {
                         "autocolorscale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.line.color`.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                             "dflt": true,
                             "role": "style",
                             "valType": "boolean"
                         },
                         "cauto": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                             "dflt": true,
                             "role": "info",
                             "valType": "boolean"
@@ -14786,12 +14863,12 @@
                         },
                         "color": {
                             "arrayOk": true,
-                            "description": "Sets the marker.line color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                            "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                             "role": "style",
                             "valType": "color"
                         },
                         "colorscale": {
-                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`.",
+                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                             "role": "style",
                             "valType": "colorscale"
                         },
@@ -14801,7 +14878,7 @@
                             "valType": "string"
                         },
                         "reversescale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the colorscale.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                             "dflt": false,
                             "role": "style",
                             "valType": "boolean"
@@ -14834,7 +14911,7 @@
                         "valType": "string"
                     },
                     "reversescale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the colorscale.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                         "dflt": false,
                         "role": "style",
                         "valType": "boolean"
@@ -15619,13 +15696,13 @@
                 },
                 "marker": {
                     "autocolorscale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.color`.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                         "dflt": true,
                         "role": "style",
                         "valType": "boolean"
                     },
                     "cauto": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                         "dflt": true,
                         "role": "info",
                         "valType": "boolean"
@@ -15644,7 +15721,7 @@
                     },
                     "color": {
                         "arrayOk": true,
-                        "description": "Sets the marker color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                        "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                         "role": "style",
                         "valType": "color"
                     },
@@ -15706,7 +15783,7 @@
                             ]
                         },
                         "nticks": {
-                            "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                            "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                             "dflt": 0,
                             "min": 0,
                             "role": "style",
@@ -15987,7 +16064,7 @@
                         }
                     },
                     "colorscale": {
-                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`.",
+                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                         "role": "style",
                         "valType": "colorscale"
                     },
@@ -15998,13 +16075,13 @@
                     },
                     "line": {
                         "autocolorscale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.line.color`.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.line.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                             "dflt": true,
                             "role": "style",
                             "valType": "boolean"
                         },
                         "cauto": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                             "dflt": true,
                             "role": "info",
                             "valType": "boolean"
@@ -16023,12 +16100,12 @@
                         },
                         "color": {
                             "arrayOk": true,
-                            "description": "Sets the marker.line color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                            "description": "Sets the marker.line color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                             "role": "style",
                             "valType": "color"
                         },
                         "colorscale": {
-                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`.",
+                            "description": "Sets the colorscale and only has an effect if `marker.line.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.line.cmin` and `marker.line.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                             "role": "style",
                             "valType": "colorscale"
                         },
@@ -16038,7 +16115,7 @@
                             "valType": "string"
                         },
                         "reversescale": {
-                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the colorscale.",
+                            "description": "Has an effect only if `marker.line.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                             "dflt": false,
                             "role": "style",
                             "valType": "boolean"
@@ -16071,7 +16148,7 @@
                         "valType": "string"
                     },
                     "reversescale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the colorscale.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                         "dflt": false,
                         "role": "style",
                         "valType": "boolean"
@@ -16336,6 +16413,15 @@
                     "role": "info",
                     "valType": "flaglist"
                 },
+                "hoveron": {
+                    "description": "Do the hover effects highlight individual points (markers or line points) or do they highlight filled regions? If the fill is *toself* or *tonext* and there are no markers or text, then the default is *fills*, otherwise it is *points*.",
+                    "flags": [
+                        "points",
+                        "fills"
+                    ],
+                    "role": "info",
+                    "valType": "flaglist"
+                },
                 "legendgroup": {
                     "description": "Sets the legend group for this trace. Traces part of the same legend group hide/show at the same time when toggling legend items.",
                     "dflt": "",
@@ -16391,13 +16477,13 @@
                 },
                 "marker": {
                     "autocolorscale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `marker.color`.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `marker.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                         "dflt": true,
                         "role": "style",
                         "valType": "boolean"
                     },
                     "cauto": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                         "dflt": true,
                         "role": "info",
                         "valType": "boolean"
@@ -16416,7 +16502,7 @@
                     },
                     "color": {
                         "arrayOk": true,
-                        "description": "Sets the marker color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                        "description": "Sets the marker color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                         "role": "style",
                         "valType": "color"
                     },
@@ -16478,7 +16564,7 @@
                             ]
                         },
                         "nticks": {
-                            "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                            "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                             "dflt": 0,
                             "min": 0,
                             "role": "style",
@@ -16759,7 +16845,7 @@
                         }
                     },
                     "colorscale": {
-                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`.",
+                        "description": "Sets the colorscale and only has an effect if `marker.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `marker.cmin` and `marker.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                         "role": "style",
                         "valType": "colorscale"
                     },
@@ -16770,13 +16856,13 @@
                     },
                     "line": {
                         "autocolorscale": {
-                            "description": "Has an effect only if `.color` is set to a numerical array. Determines whether or not the colorscale is picked using values inside `.color`.",
+                            "description": "Has an effect only if `.color` is set to a numerical array. Determines whether the colorscale is a default palette (`autocolorscale: true`) or the palette determined by `.colorscale`. In case `colorscale` is unspecified or `autocolorscale` is true, the default  palette will be chosen according to whether numbers in the `color` array are all positive, all negative or mixed.",
                             "dflt": true,
                             "role": "style",
                             "valType": "boolean"
                         },
                         "cauto": {
-                            "description": "Has an effect only if `.color` is set to a numerical array. Determines the whether or not the color domain is computed automatically.",
+                            "description": "Has an effect only if `.color` is set to a numerical array and `cmin`, `cmax` are set by the user. In this case, it controls whether the range of colors in `colorscale` is mapped to the range of values in the `color` array (`cauto: true`), or the `cmin`/`cmax` values (`cauto: false`). Defaults to `false` when `cmin`, `cmax` are set by the user.",
                             "dflt": true,
                             "role": "info",
                             "valType": "boolean"
@@ -16795,12 +16881,12 @@
                         },
                         "color": {
                             "arrayOk": true,
-                            "description": "Sets the  color. It accepts either a specific color or an array of values that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
+                            "description": "Sets the  color. It accepts either a specific color or an array of numbers that are mapped to the colorscale relative to the max and min values of the array or relative to `cmin` and `cmax` if set.",
                             "role": "style",
                             "valType": "color"
                         },
                         "colorscale": {
-                            "description": "Sets the colorscale and only has an effect if `.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `.cmin` and `.cmax`.",
+                            "description": "Sets the colorscale and only has an effect if `.color` is set to a numerical array. The colorscale must be an array containing arrays mapping a normalized value to an rgb, rgba, hex, hsl, hsv, or named color string. At minimum, a mapping for the lowest (0) and highest (1) values are required. For example, `[[0, 'rgb(0,0,255)', [1, 'rgb(255,0,0)']]`. To control the bounds of the colorscale in color space, use `.cmin` and `.cmax`. Alternatively, `colorscale` may be a palette name string of the following list: Greys, YlGnBu, Greens, YlOrRd, Bluered, RdBu, Reds, Blues, Picnic, Rainbow, Portland, Jet, Hot, Blackbody, Earth, Electric, Viridis",
                             "role": "style",
                             "valType": "colorscale"
                         },
@@ -16810,7 +16896,7 @@
                             "valType": "string"
                         },
                         "reversescale": {
-                            "description": "Has an effect only if `.color` is set to a numerical array. Reverses the colorscale.",
+                            "description": "Has an effect only if `.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                             "dflt": false,
                             "role": "style",
                             "valType": "boolean"
@@ -16850,7 +16936,7 @@
                         "valType": "string"
                     },
                     "reversescale": {
-                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the colorscale.",
+                        "description": "Has an effect only if `marker.color` is set to a numerical array. Reverses the color mapping if true (`cmin` will correspond to the last color in the array and `cmax` will correspond to the first color).",
                         "dflt": false,
                         "role": "style",
                         "valType": "boolean"
@@ -17456,7 +17542,7 @@
                         ]
                     },
                     "nticks": {
-                        "description": "Sets the number of ticks. Has an effect only if `tickmode` is set to *auto*.",
+                        "description": "Specifies the maximum number of ticks for the particular axis. The actual number of ticks will be chosen automatically to be less than or equal to `nticks`. Has an effect only if `tickmode` is set to *auto*.",
                         "dflt": 0,
                         "min": 0,
                         "role": "style",
@@ -17773,19 +17859,19 @@
                         "project": {
                             "role": "object",
                             "x": {
-                                "description": "Determines whether or not these contour lines are projected on the x axis walls. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
+                                "description": "Determines whether or not these contour lines are projected on the x plane. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
                                 "dflt": false,
                                 "role": "info",
                                 "valType": "boolean"
                             },
                             "y": {
-                                "description": "Determines whether or not these contour lines are projected on the y axis walls. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
+                                "description": "Determines whether or not these contour lines are projected on the y plane. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
                                 "dflt": false,
                                 "role": "info",
                                 "valType": "boolean"
                             },
                             "z": {
-                                "description": "Determines whether or not these contour lines are projected on the z axis walls. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
+                                "description": "Determines whether or not these contour lines are projected on the z plane. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
                                 "dflt": false,
                                 "role": "info",
                                 "valType": "boolean"
@@ -17843,19 +17929,19 @@
                         "project": {
                             "role": "object",
                             "x": {
-                                "description": "Determines whether or not these contour lines are projected on the x axis walls. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
+                                "description": "Determines whether or not these contour lines are projected on the x plane. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
                                 "dflt": false,
                                 "role": "info",
                                 "valType": "boolean"
                             },
                             "y": {
-                                "description": "Determines whether or not these contour lines are projected on the y axis walls. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
+                                "description": "Determines whether or not these contour lines are projected on the y plane. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
                                 "dflt": false,
                                 "role": "info",
                                 "valType": "boolean"
                             },
                             "z": {
-                                "description": "Determines whether or not these contour lines are projected on the z axis walls. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
+                                "description": "Determines whether or not these contour lines are projected on the z plane. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
                                 "dflt": false,
                                 "role": "info",
                                 "valType": "boolean"
@@ -17913,19 +17999,19 @@
                         "project": {
                             "role": "object",
                             "x": {
-                                "description": "Determines whether or not these contour lines are projected on the x axis walls. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
+                                "description": "Determines whether or not these contour lines are projected on the x plane. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
                                 "dflt": false,
                                 "role": "info",
                                 "valType": "boolean"
                             },
                             "y": {
-                                "description": "Determines whether or not these contour lines are projected on the y axis walls. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
+                                "description": "Determines whether or not these contour lines are projected on the y plane. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
                                 "dflt": false,
                                 "role": "info",
                                 "valType": "boolean"
                             },
                             "z": {
-                                "description": "Determines whether or not these contour lines are projected on the z axis walls. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
+                                "description": "Determines whether or not these contour lines are projected on the z plane. If `highlight` is set to *true* (the default), the projected lines are shown on hover. If `show` is set to *true*, the projected lines are shown in permanence.",
                                 "dflt": false,
                                 "role": "info",
                                 "valType": "boolean"
diff --git a/plotly/tools.py b/plotly/tools.py
index bdef4f808..4c3b7dd96 100644
--- a/plotly/tools.py
+++ b/plotly/tools.py
@@ -1476,6 +1476,161 @@ class FigureFactory(object):
     more information and examples of a specific chart type.
     """
 
+    @staticmethod
+    def _make_linear_colorscale(colors):
+        """
+        Makes a list of colors into a colorscale-acceptable form
+
+        For documentation regarding to the form of the output, see
+        https://plot.ly/python/reference/#mesh3d-colorscale
+        """
+        scale = 1./(len(colors) - 1)
+        return[[i * scale, color] for i, color in enumerate(colors)]
+
+    @staticmethod
+    def create_2D_density(x, y, colorscale='Earth', ncontours=20,
+                          hist_color=(0, 0, 0.5), point_color=(0, 0, 0.5),
+                          point_size=2, height=600, width=600):
+        """
+        Returns figure for a 2D density plot
+
+        :param (list|array) x: x-axis data for plot generation
+        :param (list|array) y: y-axis data for plot generation
+        :param (str|tuple|list) colorscale: either a plotly scale name, an rgb
+            or hex color, a color tuple or a list or tuple of colors. An rgb
+            color is of the form 'rgb(x, y, z)' where x, y, z belong to the
+            interval [0, 255] and a color tuple is a tuple of the form
+            (a, b, c) where a, b and c belong to [0, 1]. If colormap is a
+            list, it must contain the valid color types aforementioned as its
+            members.
+        :param (int) ncontours: the number of 2D contours to draw on the plot
+        :param (str) hist_color: the color of the plotted histograms
+        :param (str) point_color: the color of the scatter points
+        :param (str) point_size: the color of the scatter points
+        :param (float) height: the height of the chart
+        :param (float) width: the width of the chart
+
+        Example 1: Simple 2D Density Plot
+        ```
+        import plotly.plotly as py
+        from plotly.tools import FigureFactory as FF
+
+        # Make data points
+        t = np.linspace(-1,1.2,2000)
+        x = (t**3)+(0.3*np.random.randn(2000))
+        y = (t**6)+(0.3*np.random.randn(2000))
+
+        # Create a figure
+        fig = FF.create_2D_density(x, y)
+
+        # Plot the data
+        py.iplot(fig, filename='simple-2d-density')
+        ```
+
+        Example 2: Using Parameters
+        ```
+        import plotly.plotly as py
+        from plotly.tools import FigureFactory as FF
+
+        # Make data points
+        t = np.linspace(-1,1.2,2000)
+        x = (t**3)+(0.3*np.random.randn(2000))
+        y = (t**6)+(0.3*np.random.randn(2000))
+
+        # Create custom colorscale
+        colorscale = ['#7A4579', '#D56073', 'rgb(236,158,105)',
+                      (1, 1, 0.2), (0.98,0.98,0.98)]
+
+        # Create a figure
+        fig = FF.create_2D_density(
+            x, y, colorscale=colorscale,
+            hist_color='rgb(255, 237, 222)', point_size=3)
+
+        # Plot the data
+        py.iplot(fig, filename='use-parameters')
+        ```
+        """
+        from plotly.graph_objs import graph_objs
+        from numbers import Number
+
+        # validate x and y are filled with numbers only
+        for array in [x, y]:
+            if not all(isinstance(element, Number) for element in array):
+                raise exceptions.PlotlyError(
+                    "All elements of your 'x' and 'y' lists must be numbers."
+                )
+
+        # validate x and y are the same length
+        if len(x) != len(y):
+            raise exceptions.PlotlyError(
+                "Both lists 'x' and 'y' must be the same length."
+            )
+
+        colorscale = FigureFactory._validate_colors(colorscale, 'rgb')
+        colorscale = FigureFactory._make_linear_colorscale(colorscale)
+
+        # validate hist_color and point_color
+        hist_color = FigureFactory._validate_colors(hist_color, 'rgb')
+        point_color = FigureFactory._validate_colors(point_color, 'rgb')
+
+        trace1 = graph_objs.Scatter(
+            x=x, y=y, mode='markers', name='points',
+            marker=dict(
+                color=point_color[0],
+                size=point_size,
+                opacity=0.4
+            )
+        )
+        trace2 = graph_objs.Histogram2dcontour(
+            x=x, y=y, name='density', ncontours=ncontours,
+            colorscale=colorscale, reversescale=True, showscale=False
+        )
+        trace3 = graph_objs.Histogram(
+            x=x, name='x density',
+            marker=dict(color=hist_color[0]), yaxis='y2'
+        )
+        trace4 = graph_objs.Histogram(
+            y=y, name='y density',
+            marker=dict(color=hist_color[0]), xaxis='x2'
+        )
+        data = [trace1, trace2, trace3, trace4]
+
+        layout = graph_objs.Layout(
+            showlegend=False,
+            autosize=False,
+            title='Love',
+            height=height,
+            width=width,
+            xaxis=dict(
+                domain=[0, 0.85],
+                showgrid=False,
+                zeroline=False
+            ),
+            yaxis=dict(
+                domain=[0, 0.85],
+                showgrid=False,
+                zeroline=False
+            ),
+            margin=dict(
+                t=50
+            ),
+            hovermode='closest',
+            bargap=0,
+            xaxis2=dict(
+                domain=[0.85, 1],
+                showgrid=False,
+                zeroline=False
+            ),
+            yaxis2=dict(
+                domain=[0.85, 1],
+                showgrid=False,
+                zeroline=False
+            )
+        )
+
+        fig = graph_objs.Figure(data=data, layout=layout)
+        return fig
+
     @staticmethod
     def _validate_gantt(df):
         """
diff --git a/plotly/version.py b/plotly/version.py
index 96ddfeb78..3081afbab 100644
--- a/plotly/version.py
+++ b/plotly/version.py
@@ -1,1 +1,1 @@
-__version__ = '1.12.2'
+__version__ = '1.12.3'


Test patch:
diff --git a/plotly/tests/test_core/test_tools/test_figure_factory.py b/plotly/tests/test_core/test_tools/test_figure_factory.py
index 97fb061b2..8d7c5a36f 100644
--- a/plotly/tests/test_core/test_tools/test_figure_factory.py
+++ b/plotly/tests/test_core/test_tools/test_figure_factory.py
@@ -1365,6 +1365,111 @@ class TestGantt(TestCase):
         self.assertEqual(test_gantt_chart['layout'],
                          exp_gantt_chart['layout'])
 
+
+class Test2D_Density(TestCase):
+
+    def test_validate_2D_density(self):
+
+        # validate that x and y contain only numbers
+        x = [1, 2]
+        y = ['a', 2]
+
+        pattern = ("All elements of your 'x' and 'y' lists must be numbers.")
+
+        self.assertRaisesRegexp(PlotlyError, pattern,
+                                tls.FigureFactory.create_2D_density, x, y)
+
+        # validate that x and y are the same length
+        x2 = [1]
+        y2 = [1, 2]
+
+        pattern2 = ("Both lists 'x' and 'y' must be the same length.")
+
+        self.assertRaisesRegexp(PlotlyError, pattern2,
+                                tls.FigureFactory.create_2D_density, x2, y2)
+
+    def test_2D_density_all_args(self):
+
+        # check if 2D_density data matches with expected output
+        x = [1, 2]
+        y = [2, 4]
+
+        colorscale = ['#7A4579', '#D56073', 'rgb(236,158,105)',
+                      (1, 1, 0.2), (0.98, 0.98, 0.98)]
+
+        test_2D_density_chart = tls.FigureFactory.create_2D_density(
+            x, y, colorscale=colorscale, hist_color='rgb(255, 237, 222)',
+            point_size=3, height=800, width=800)
+
+        exp_2D_density_chart = {
+            'data': [{'marker': {'color': 'rgb(0.0, 0.0, 127.5)',
+                      'opacity': 0.4,
+                      'size': 3},
+                      'mode': 'markers',
+                      'name': 'points',
+                      'type': 'scatter',
+                      'x': [1, 2],
+                      'y': [2, 4]},
+                     {'colorscale': [[0.0, 'rgb(122.0, 69.0, 121.0)'],
+                                     [0.25, 'rgb(213.0, 96.0, 115.0)'],
+                                     [0.5, 'rgb(236.0, 158.0, 105.0)'],
+                                     [0.75, 'rgb(255.0, 255.0, 51.0)'],
+                                     [1.0, 'rgb(249.9, 249.9, 249.9)']],
+                      'name': 'density',
+                      'ncontours': 20,
+                      'reversescale': True,
+                      'showscale': False,
+                      'type': 'histogram2dcontour',
+                      'x': [1, 2],
+                      'y': [2, 4]},
+                     {'marker': {'color': 'rgb(255.0, 237.0, 222.0)'},
+                      'name': 'x density',
+                      'type': 'histogram',
+                      'x': [1, 2],
+                      'yaxis': 'y2'},
+                     {'marker': {'color': 'rgb(255.0, 237.0, 222.0)'},
+                      'name': 'y density',
+                      'type': 'histogram',
+                      'xaxis': 'x2',
+                      'y': [2, 4]}],
+            'layout': {'autosize': False,
+                       'bargap': 0,
+                       'height': 800,
+                       'hovermode': 'closest',
+                       'margin': {'t': 50},
+                       'showlegend': False,
+                       'title': 'Love',
+                       'width': 800,
+                       'xaxis': {'domain': [0, 0.85],
+                                 'showgrid': False,
+                                 'zeroline': False},
+                       'xaxis2': {'domain': [0.85, 1],
+                                  'showgrid': False,
+                                  'zeroline': False},
+                       'yaxis': {'domain': [0, 0.85],
+                                 'showgrid': False,
+                                 'zeroline': False},
+                       'yaxis2': {'domain': [0.85, 1],
+                                  'showgrid': False,
+                                  'zeroline': False}}
+        }
+
+        self.assertEqual(test_2D_density_chart['data'][0],
+                         exp_2D_density_chart['data'][0])
+
+        self.assertEqual(test_2D_density_chart['data'][1],
+                         exp_2D_density_chart['data'][1])
+
+        self.assertEqual(test_2D_density_chart['data'][2],
+                         exp_2D_density_chart['data'][2])
+
+        self.assertEqual(test_2D_density_chart['data'][3],
+                         exp_2D_density_chart['data'][3])
+
+        self.assertEqual(test_2D_density_chart['layout'],
+                         exp_2D_density_chart['layout'])
+
+
 # class TestDistplot(TestCase):
 
 #     def test_scipy_import_error(self):