{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# k-NN from scratch"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: plotly in /usr/local/lib/python3.6/dist-packages (4.5.0)\n",
"Requirement already satisfied: retrying>=1.3.3 in /usr/local/lib/python3.6/dist-packages (from plotly) (1.3.3)\n",
"Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from plotly) (1.14.0)\n"
]
}
],
"source": [
"!pip3 install plotly"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import csv\n",
"from pathlib import Path\n",
"from math import sqrt\n",
"from operator import attrgetter\n",
"from collections import Counter\n",
"from typing import NamedTuple, List\n",
"from plotly import express as px\n",
"from plotly import graph_objects as go"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Ensure that we have a `data` directory we use to store downloaded data\n",
"!mkdir -p data\n",
"data_dir: Path = Path('data')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"File ‘data/iris.data’ already there; not retrieving.\n",
"\n"
]
}
],
"source": [
"# Downloading the Iris data set\n",
"!wget -nc -P data https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"6.9,3.1,5.1,2.3,Iris-virginica\n",
"5.8,2.7,5.1,1.9,Iris-virginica\n",
"6.8,3.2,5.9,2.3,Iris-virginica\n",
"6.7,3.3,5.7,2.5,Iris-virginica\n",
"6.7,3.0,5.2,2.3,Iris-virginica\n",
"6.3,2.5,5.0,1.9,Iris-virginica\n",
"6.5,3.0,5.2,2.0,Iris-virginica\n",
"6.2,3.4,5.4,2.3,Iris-virginica\n",
"5.9,3.0,5.1,1.8,Iris-virginica\n",
"\n"
]
}
],
"source": [
"# The structure of the Iris data set is as follows:\n",
"# Sepal Length, Sepal Width, Petal Length, Petal Width, Class\n",
"!tail data/iris.data"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# Defining the index-lookup equivalents here since we turn the CSV data into indexable data later on\n",
"sepal_length_idx: int = 0\n",
"sepal_width_idx: int = 1\n",
"petal_length_idx: int = 2\n",
"petal_width_idx: int = 3\n",
"label_idx: int = 4"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# Create the Python path pointing to the `iris.data` file\n",
"iris_data_path: Path = data_dir / 'iris.data'"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Our data container for individual Iris data set items\n",
"class IrisLabeled(NamedTuple):\n",
" label: str\n",
" measurements: List[float]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"labeled_data: List[IrisLabeled] = []"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"# Read the `iris.data` file and parse it line-by-line\n",
"with open(iris_data_path) as csv_file:\n",
" reader = csv.reader(csv_file, delimiter=',')\n",
" for row in reader:\n",
" # Check if the given row is a valid iris datapoint\n",
" if len(row) == 5:\n",
" label: str = row[-1]\n",
" measurements: List[float] = [float(num) for num in row[:-1]]\n",
" labeled_data.append(IrisLabeled(label, measurements))"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"150"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(labeled_data)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"# Computing values for plotting\n",
"\n",
"# The petal length\n",
"xs: List[float] = [iris.measurements[petal_length_idx] for iris in labeled_data]\n",
"# The petal width\n",
"ys: List[float] = [iris.measurements[petal_width_idx] for iris in labeled_data]\n",
"# Classes\n",
"text: List[str] = [iris.label for iris in labeled_data]"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
" \n",
" "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.plotly.v1+json": {
"config": {
"plotlyServerURL": "https://plot.ly"
},
"data": [
{
"hoverlabel": {
"namelength": 0
},
"hovertemplate": "%{hovertext}
color=Iris-setosa
Petal Length=%{x}
Petal Width=%{y}",
"hovertext": [
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa",
"Iris-setosa"
],
"legendgroup": "Iris-setosa",
"marker": {
"color": "#636efa",
"symbol": "circle"
},
"mode": "markers",
"name": "Iris-setosa",
"showlegend": true,
"type": "scatter",
"x": [
1.4,
1.4,
1.3,
1.5,
1.4,
1.7,
1.4,
1.5,
1.4,
1.5,
1.5,
1.6,
1.4,
1.1,
1.2,
1.5,
1.3,
1.4,
1.7,
1.5,
1.7,
1.5,
1,
1.7,
1.9,
1.6,
1.6,
1.5,
1.4,
1.6,
1.6,
1.5,
1.5,
1.4,
1.5,
1.2,
1.3,
1.5,
1.3,
1.5,
1.3,
1.3,
1.3,
1.6,
1.9,
1.4,
1.6,
1.4,
1.5,
1.4
],
"xaxis": "x",
"y": [
0.2,
0.2,
0.2,
0.2,
0.2,
0.4,
0.3,
0.2,
0.2,
0.1,
0.2,
0.2,
0.1,
0.1,
0.2,
0.4,
0.4,
0.3,
0.3,
0.3,
0.2,
0.4,
0.2,
0.5,
0.2,
0.2,
0.4,
0.2,
0.2,
0.2,
0.2,
0.4,
0.1,
0.2,
0.1,
0.2,
0.2,
0.1,
0.2,
0.2,
0.3,
0.3,
0.2,
0.6,
0.4,
0.3,
0.2,
0.2,
0.2,
0.2
],
"yaxis": "y"
},
{
"hoverlabel": {
"namelength": 0
},
"hovertemplate": "%{hovertext}
color=Iris-versicolor
Petal Length=%{x}
Petal Width=%{y}",
"hovertext": [
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor",
"Iris-versicolor"
],
"legendgroup": "Iris-versicolor",
"marker": {
"color": "#EF553B",
"symbol": "circle"
},
"mode": "markers",
"name": "Iris-versicolor",
"showlegend": true,
"type": "scatter",
"x": [
4.7,
4.5,
4.9,
4,
4.6,
4.5,
4.7,
3.3,
4.6,
3.9,
3.5,
4.2,
4,
4.7,
3.6,
4.4,
4.5,
4.1,
4.5,
3.9,
4.8,
4,
4.9,
4.7,
4.3,
4.4,
4.8,
5,
4.5,
3.5,
3.8,
3.7,
3.9,
5.1,
4.5,
4.5,
4.7,
4.4,
4.1,
4,
4.4,
4.6,
4,
3.3,
4.2,
4.2,
4.2,
4.3,
3,
4.1
],
"xaxis": "x",
"y": [
1.4,
1.5,
1.5,
1.3,
1.5,
1.3,
1.6,
1,
1.3,
1.4,
1,
1.5,
1,
1.4,
1.3,
1.4,
1.5,
1,
1.5,
1.1,
1.8,
1.3,
1.5,
1.2,
1.3,
1.4,
1.4,
1.7,
1.5,
1,
1.1,
1,
1.2,
1.6,
1.5,
1.6,
1.5,
1.3,
1.3,
1.3,
1.2,
1.4,
1.2,
1,
1.3,
1.2,
1.3,
1.3,
1.1,
1.3
],
"yaxis": "y"
},
{
"hoverlabel": {
"namelength": 0
},
"hovertemplate": "%{hovertext}
color=Iris-virginica
Petal Length=%{x}
Petal Width=%{y}",
"hovertext": [
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica",
"Iris-virginica"
],
"legendgroup": "Iris-virginica",
"marker": {
"color": "#00cc96",
"symbol": "circle"
},
"mode": "markers",
"name": "Iris-virginica",
"showlegend": true,
"type": "scatter",
"x": [
6,
5.1,
5.9,
5.6,
5.8,
6.6,
4.5,
6.3,
5.8,
6.1,
5.1,
5.3,
5.5,
5,
5.1,
5.3,
5.5,
6.7,
6.9,
5,
5.7,
4.9,
6.7,
4.9,
5.7,
6,
4.8,
4.9,
5.6,
5.8,
6.1,
6.4,
5.6,
5.1,
5.6,
6.1,
5.6,
5.5,
4.8,
5.4,
5.6,
5.1,
5.1,
5.9,
5.7,
5.2,
5,
5.2,
5.4,
5.1
],
"xaxis": "x",
"y": [
2.5,
1.9,
2.1,
1.8,
2.2,
2.1,
1.7,
1.8,
1.8,
2.5,
2,
1.9,
2.1,
2,
2.4,
2.3,
1.8,
2.2,
2.3,
1.5,
2.3,
2,
2,
1.8,
2.1,
1.8,
1.8,
1.8,
2.1,
1.6,
1.9,
2,
2.2,
1.5,
1.4,
2.3,
2.4,
1.8,
1.8,
2.1,
2.4,
2.3,
1.9,
2.3,
2.5,
2.3,
1.9,
2,
2.3,
1.8
],
"yaxis": "y"
}
],
"layout": {
"legend": {
"title": {
"text": "color"
},
"tracegroupgap": 0
},
"margin": {
"t": 60
},
"template": {
"data": {
"bar": [
{
"error_x": {
"color": "#2a3f5f"
},
"error_y": {
"color": "#2a3f5f"
},
"marker": {
"line": {
"color": "#E5ECF6",
"width": 0.5
}
},
"type": "bar"
}
],
"barpolar": [
{
"marker": {
"line": {
"color": "#E5ECF6",
"width": 0.5
}
},
"type": "barpolar"
}
],
"carpet": [
{
"aaxis": {
"endlinecolor": "#2a3f5f",
"gridcolor": "white",
"linecolor": "white",
"minorgridcolor": "white",
"startlinecolor": "#2a3f5f"
},
"baxis": {
"endlinecolor": "#2a3f5f",
"gridcolor": "white",
"linecolor": "white",
"minorgridcolor": "white",
"startlinecolor": "#2a3f5f"
},
"type": "carpet"
}
],
"choropleth": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "choropleth"
}
],
"contour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "contour"
}
],
"contourcarpet": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "contourcarpet"
}
],
"heatmap": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "heatmap"
}
],
"heatmapgl": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "heatmapgl"
}
],
"histogram": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "histogram"
}
],
"histogram2d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2d"
}
],
"histogram2dcontour": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "histogram2dcontour"
}
],
"mesh3d": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"type": "mesh3d"
}
],
"parcoords": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "parcoords"
}
],
"pie": [
{
"automargin": true,
"type": "pie"
}
],
"scatter": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatter"
}
],
"scatter3d": [
{
"line": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatter3d"
}
],
"scattercarpet": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattercarpet"
}
],
"scattergeo": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergeo"
}
],
"scattergl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattergl"
}
],
"scattermapbox": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scattermapbox"
}
],
"scatterpolar": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolar"
}
],
"scatterpolargl": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterpolargl"
}
],
"scatterternary": [
{
"marker": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"type": "scatterternary"
}
],
"surface": [
{
"colorbar": {
"outlinewidth": 0,
"ticks": ""
},
"colorscale": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"type": "surface"
}
],
"table": [
{
"cells": {
"fill": {
"color": "#EBF0F8"
},
"line": {
"color": "white"
}
},
"header": {
"fill": {
"color": "#C8D4E3"
},
"line": {
"color": "white"
}
},
"type": "table"
}
]
},
"layout": {
"annotationdefaults": {
"arrowcolor": "#2a3f5f",
"arrowhead": 0,
"arrowwidth": 1
},
"coloraxis": {
"colorbar": {
"outlinewidth": 0,
"ticks": ""
}
},
"colorscale": {
"diverging": [
[
0,
"#8e0152"
],
[
0.1,
"#c51b7d"
],
[
0.2,
"#de77ae"
],
[
0.3,
"#f1b6da"
],
[
0.4,
"#fde0ef"
],
[
0.5,
"#f7f7f7"
],
[
0.6,
"#e6f5d0"
],
[
0.7,
"#b8e186"
],
[
0.8,
"#7fbc41"
],
[
0.9,
"#4d9221"
],
[
1,
"#276419"
]
],
"sequential": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
],
"sequentialminus": [
[
0,
"#0d0887"
],
[
0.1111111111111111,
"#46039f"
],
[
0.2222222222222222,
"#7201a8"
],
[
0.3333333333333333,
"#9c179e"
],
[
0.4444444444444444,
"#bd3786"
],
[
0.5555555555555556,
"#d8576b"
],
[
0.6666666666666666,
"#ed7953"
],
[
0.7777777777777778,
"#fb9f3a"
],
[
0.8888888888888888,
"#fdca26"
],
[
1,
"#f0f921"
]
]
},
"colorway": [
"#636efa",
"#EF553B",
"#00cc96",
"#ab63fa",
"#FFA15A",
"#19d3f3",
"#FF6692",
"#B6E880",
"#FF97FF",
"#FECB52"
],
"font": {
"color": "#2a3f5f"
},
"geo": {
"bgcolor": "white",
"lakecolor": "white",
"landcolor": "#E5ECF6",
"showlakes": true,
"showland": true,
"subunitcolor": "white"
},
"hoverlabel": {
"align": "left"
},
"hovermode": "closest",
"mapbox": {
"style": "light"
},
"paper_bgcolor": "white",
"plot_bgcolor": "#E5ECF6",
"polar": {
"angularaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"bgcolor": "#E5ECF6",
"radialaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
}
},
"scene": {
"xaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
},
"yaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
},
"zaxis": {
"backgroundcolor": "#E5ECF6",
"gridcolor": "white",
"gridwidth": 2,
"linecolor": "white",
"showbackground": true,
"ticks": "",
"zerolinecolor": "white"
}
},
"shapedefaults": {
"line": {
"color": "#2a3f5f"
}
},
"ternary": {
"aaxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"baxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
},
"bgcolor": "#E5ECF6",
"caxis": {
"gridcolor": "white",
"linecolor": "white",
"ticks": ""
}
},
"title": {
"x": 0.05
},
"xaxis": {
"automargin": true,
"gridcolor": "white",
"linecolor": "white",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "white",
"zerolinewidth": 2
},
"yaxis": {
"automargin": true,
"gridcolor": "white",
"linecolor": "white",
"ticks": "",
"title": {
"standoff": 15
},
"zerolinecolor": "white",
"zerolinewidth": 2
}
}
},
"xaxis": {
"anchor": "y",
"domain": [
0,
1
],
"title": {
"text": "Petal Length"
}
},
"yaxis": {
"anchor": "x",
"domain": [
0,
1
],
"title": {
"text": "Petal Width"
}
}
}
},
"text/html": [
"