├── .gitignore ├── requirements.txt ├── README.md ├── india_census.csv └── ChoroplethTutorial.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | .ipynb_checkpoints/ 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | plotly 2 | pandas 3 | numpy 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Plotting Choropleth Maps using Python 2 | 3 | 4 | [Video Tutorial](https://youtu.be/aJmaw3QKMvk) 5 | 6 | 7 | A choropleth map uses colour coding to indicate quantitative values across geographical areas on a map. 8 | 9 | 10 | 11 | >A choropleth map is a type of thematic map in which areas are shaded or patterned in proportion to a statistical variable that represents an aggregate summary of a geographic characteristic within each area, such as population density or per-capita income. 12 | 13 | ## Terminologies 14 | 15 | 16 | ### [Plotly](https://plotly.com/) 17 | Plotly is a technical computing company that develops online data analytics and visualization tools. Plotly provides online graphing, analytics, and statistics tools for individuals and collaboration, as well as scientific graphing libraries for Python, R, MATLAB, Perl, Julia, Arduino, and REST. 18 | 19 | ### [plotly.py](https://plotly.com/python/) 20 | An interactive, open-source, and browser-based graphing library for Python. 21 | 22 | ```bash 23 | $ pip install plotly 24 | ``` 25 | 26 | >Plotly Express is a new high-level Python visualization library: it's a wrapper for Plotly.py that exposes a simple syntax for complex charts. 27 | 28 | ### [GeoJSON](https://geojson.org/) 29 | An open standard format designed for representing simple geographical features, along with their non-spatial attributes. 30 | 31 | ### [Mapbox](https://mapbox.com/) 32 | An open source mapping platform for custom designed maps. 33 | 34 | 35 | ## References 36 | 37 | 38 | - https://en.wikipedia.org/wiki/List_of_states_and_union_territories_of_India_by_population 39 | 40 | - https://un-mapped.carto.com/tables/states_india/public/map 41 | 42 | - https://plotly.com/python/choropleth-maps/ 43 | 44 | - https://plotly.com/python/colorscales/ 45 | 46 | - https://www.mapbox.com/ 47 | 48 | - https://plotly.com/python/mapbox-county-choropleth/ 49 | 50 | - https://plotly.com/python/mapbox-layers/ -------------------------------------------------------------------------------- /india_census.csv: -------------------------------------------------------------------------------- 1 | Rank,State or union territory,Population,Population (%),Decadal growth(2001–2011),Rural population,Percent rural,Urban population,Percent urban,Area[16],Density[a],Sex ratio 2 | 1,Uttar Pradesh,199812341,,20.20%,155317278,,44495063,,"240,928 km2 (93,023 sq mi)","828/km2 (2,140/sq mi)",912 3 | 2,Maharashtra,112374333,,20.00%,61556074,,50818259,,"307,713 km2 (118,809 sq mi)",365/km2 (950/sq mi),929 4 | 3,Bihar,104099452,,25.40%,92341436,,11758016,,"94,163 km2 (36,357 sq mi)","1,102/km2 (2,850/sq mi)",918 5 | 4,West Bengal,91276115,,13.80%,62183113,,29093002,,"88,752 km2 (34,267 sq mi)","1,029/km2 (2,670/sq mi)",953 6 | 5,Madhya Pradesh,72626809,,16.30%,52557404,,20069405,,"308,245 km2 (119,014 sq mi)",236/km2 (610/sq mi),931 7 | 6,Tamil Nadu,72147030,,15.60%,37229590,,34917440,,"130,058 km2 (50,216 sq mi)","555/km2 (1,440/sq mi)",996 8 | 7,Rajasthan,68548437,,21.30%,51500352,,17048085,,"342,239 km2 (132,139 sq mi)",201/km2 (520/sq mi),928 9 | 8,Karnataka,61095297,,15.60%,37469335,,23625962,,"191,791 km2 (74,051 sq mi)",319/km2 (830/sq mi),973 10 | 9,Gujarat,60439692,,19.30%,34694609,,25745083,,"196,024 km2 (75,685 sq mi)",308/km2 (800/sq mi),919 11 | 10,Andhra Pradesh,49577103,,11.00%,34966693,,14610410,,"162,968 km2 (62,922 sq mi)",303/km2 (780/sq mi),993 12 | 11,Odisha,41974219,,14.00%,34970562,,7003656,,"155,707 km2 (60,119 sq mi)",269/km2 (700/sq mi),979 13 | 12,Telangana,35003674,,13.58%,21395009,,13608665,,"112,077 km2 (43,273 sq mi)",312/km2 (810/sq mi),988 14 | 13,Kerala,33406061,,4.90%,17471135,,15934926,,"38,863 km2 (15,005 sq mi)","859/km2 (2,220/sq mi)",1084 15 | 14,Jharkhand,32988134,,22.40%,25055073,,7933061,,"79,714 km2 (30,778 sq mi)","414/km2 (1,070/sq mi)",948 16 | 15,Assam,31205576,,17.10%,26807034,,4398542,,"78,438 km2 (30,285 sq mi)","397/km2 (1,030/sq mi)",954 17 | 16,Punjab,27743338,,13.90%,17344192,,10399146,,"50,362 km2 (19,445 sq mi)","550/km2 (1,400/sq mi)",895 18 | 17,Chhattisgarh,25545198,,22.60%,19607961,,5937237,,"135,191 km2 (52,198 sq mi)",189/km2 (490/sq mi),991 19 | 18,Haryana,25351462,,19.90%,16509359,,8842103,,"44,212 km2 (17,070 sq mi)","573/km2 (1,480/sq mi)",879 20 | 19,Uttarakhand,10086292,,18.80%,7036954,,3049338,,"53,483 km2 (20,650 sq mi)",189/km2 (490/sq mi),963 21 | 20,Himachal Pradesh,6864602,,12.90%,6176050,,688552,,"55,673 km2 (21,495 sq mi)",123/km2 (320/sq mi),972 22 | 21,Tripura,3673917,,14.80%,2712464,,961453,,"10,486 km2 (4,049 sq mi)",350/km2 (910/sq mi),960 23 | 22,Meghalaya,2966889,,27.90%,2371439,,595450,,"22,429 km2 (8,660 sq mi)",132/km2 (340/sq mi),989 24 | 23,Manipur,2570390,,18.60%,1793875,,776515,,"22,327 km2 (8,621 sq mi)",122/km2 (320/sq mi),992 25 | 24,Nagaland,1978502,,−0.6%,1407536,,570966,,"16,579 km2 (6,401 sq mi)",119/km2 (310/sq mi),931 26 | 25,Goa,1458545,,8.20%,551731,,906814,,"3,702 km2 (1,429 sq mi)","394/km2 (1,020/sq mi)",973 27 | 26,Arunanchal Pradesh,1383727,,26.00%,1066358,,317369,,"83,743 km2 (32,333 sq mi)",17/km2 (44/sq mi),938 28 | 27,Mizoram,1097206,,23.50%,525435,,571771,,"21,081 km2 (8,139 sq mi)",52/km2 (130/sq mi),976 29 | 28,Sikkim,610577,,12.90%,456999,,153578,,"7,096 km2 (2,740 sq mi)",86/km2 (220/sq mi),890 30 | ,NCT of Delhi,16787941,,21.20%,419042,,16368899,,"1,484 km2 (573 sq mi)","11,297/km2 (29,260/sq mi)",868 31 | ,Jammu & Kashmir,12267032,,23.60%,9064220,,3202812,,"42,241 km2 (16,309 sq mi)[d]",297/km2 (770/sq mi),890 32 | ,Puducherry,1247953,,28.10%,395200,,852753,,479 km2 (185 sq mi),"2,598/km2 (6,730/sq mi)",1037 33 | ,Chandigarh,1055450,,17.20%,28991,,1026459,,114 km2 (44 sq mi),"9,252/km2 (23,960/sq mi)",818 34 | ,Dadara & Nagar Havelli,585764,,55.10%,243510,,342254,,603 km2 (233 sq mi),"970/km2 (2,500/sq mi)",711 35 | ,Daman & Diu,585764,,55.10%,243510,,342254,,603 km2 (233 sq mi),"970/km2 (2,500/sq mi)",711 36 | ,Andaman & Nicobar Island,380581,,6.90%,237093,,143488,,"8,249 km2 (3,185 sq mi)",46/km2 (120/sq mi),876 37 | ,Lakshadweep,64473,,6.30%,14141,,50332,,32 km2 (12 sq mi),"2,013/km2 (5,210/sq mi)",946 -------------------------------------------------------------------------------- /ChoroplethTutorial.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Plotting Choropleth Maps using Python\n", 8 | "---\n", 9 | "A choropleth map uses colour coding to indicate quantitative values across geographical areas on a map.\n", 10 | "\n", 11 | "![](https://datavizcatalogue.com/methods/images/anatomy/choropleth.png)\n", 12 | "\n", 13 | ">A choropleth map is a type of thematic map in which areas are shaded or patterned in proportion to a statistical variable that represents an aggregate summary of a geographic characteristic within each area, such as population density or per-capita income.\n", 14 | "\n", 15 | "## Terminologies\n", 16 | "---\n", 17 | "\n", 18 | "## [Plotly](https://plotly.com/)\n", 19 | "Plotly is a technical computing company that develops online data analytics and visualization tools. Plotly provides online graphing, analytics, and statistics tools for individuals and collaboration, as well as scientific graphing libraries for Python, R, MATLAB, Perl, Julia, Arduino, and REST.\n", 20 | "\n", 21 | "### [plotly.py](https://plotly.com/python/)\n", 22 | "An interactive, open-source, and browser-based graphing library for Python.\n", 23 | "\n", 24 | "```bash\n", 25 | "$ pip install plotly\n", 26 | "```\n", 27 | "\n", 28 | ">Plotly Express is a new high-level Python visualization library: it's a wrapper for Plotly.py that exposes a simple syntax for complex charts.\n", 29 | "\n", 30 | "### [GeoJSON](https://geojson.org/)\n", 31 | "An open standard format designed for representing simple geographical features, along with their non-spatial attributes.\n", 32 | "\n", 33 | "### [Mapbox](https://mapbox.com/)\n", 34 | "An open source mapping platform for custom designed maps." 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 1, 40 | "metadata": {}, 41 | "outputs": [], 42 | "source": [ 43 | "import json\n", 44 | "import numpy as np\n", 45 | "import pandas as pd\n", 46 | "import plotly.express as px" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 2, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "import plotly.io as pio\n", 56 | "pio.renderers.default = 'browser'" 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 4, 62 | "metadata": {}, 63 | "outputs": [ 64 | { 65 | "data": { 66 | "application/javascript": [ 67 | "\n", 68 | " setTimeout(function() {\n", 69 | " var nbb_cell_id = 4;\n", 70 | " var nbb_unformatted_code = \"india_states = json.load(open(\\\"states_india.geojson\\\", 'r'))\";\n", 71 | " var nbb_formatted_code = \"india_states = json.load(open(\\\"states_india.geojson\\\", \\\"r\\\"))\";\n", 72 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 73 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 74 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 75 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 76 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 77 | " }\n", 78 | " break;\n", 79 | " }\n", 80 | " }\n", 81 | " }, 500);\n", 82 | " " 83 | ], 84 | "text/plain": [ 85 | "" 86 | ] 87 | }, 88 | "metadata": {}, 89 | "output_type": "display_data" 90 | } 91 | ], 92 | "source": [ 93 | "india_states = json.load(open(\"states_india.geojson\", \"r\"))" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": 5, 99 | "metadata": {}, 100 | "outputs": [ 101 | { 102 | "data": { 103 | "application/javascript": [ 104 | "\n", 105 | " setTimeout(function() {\n", 106 | " var nbb_cell_id = 5;\n", 107 | " var nbb_unformatted_code = \"state_id_map = {}\\nfor feature in india_states['features']:\\n feature['id'] = feature['properties']['state_code']\\n state_id_map[feature['properties']['st_nm']] = feature['id']\";\n", 108 | " var nbb_formatted_code = \"state_id_map = {}\\nfor feature in india_states[\\\"features\\\"]:\\n feature[\\\"id\\\"] = feature[\\\"properties\\\"][\\\"state_code\\\"]\\n state_id_map[feature[\\\"properties\\\"][\\\"st_nm\\\"]] = feature[\\\"id\\\"]\";\n", 109 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 110 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 111 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 112 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 113 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 114 | " }\n", 115 | " break;\n", 116 | " }\n", 117 | " }\n", 118 | " }, 500);\n", 119 | " " 120 | ], 121 | "text/plain": [ 122 | "" 123 | ] 124 | }, 125 | "metadata": {}, 126 | "output_type": "display_data" 127 | } 128 | ], 129 | "source": [ 130 | "state_id_map = {}\n", 131 | "for feature in india_states[\"features\"]:\n", 132 | " feature[\"id\"] = feature[\"properties\"][\"state_code\"]\n", 133 | " state_id_map[feature[\"properties\"][\"st_nm\"]] = feature[\"id\"]" 134 | ] 135 | }, 136 | { 137 | "cell_type": "code", 138 | "execution_count": 6, 139 | "metadata": {}, 140 | "outputs": [ 141 | { 142 | "data": { 143 | "application/javascript": [ 144 | "\n", 145 | " setTimeout(function() {\n", 146 | " var nbb_cell_id = 6;\n", 147 | " var nbb_unformatted_code = \"df = pd.read_csv(\\\"india_census.csv\\\")\\ndf['Density'] = df['Density[a]'].apply(lambda x: int(x.split(\\\"/\\\")[0].replace(\\\",\\\",\\\"\\\")))\\ndf['id'] = df['State or union territory'].apply(lambda x: state_id_map[x])\";\n", 148 | " var nbb_formatted_code = \"df = pd.read_csv(\\\"india_census.csv\\\")\\ndf[\\\"Density\\\"] = df[\\\"Density[a]\\\"].apply(lambda x: int(x.split(\\\"/\\\")[0].replace(\\\",\\\", \\\"\\\")))\\ndf[\\\"id\\\"] = df[\\\"State or union territory\\\"].apply(lambda x: state_id_map[x])\";\n", 149 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 150 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 151 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 152 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 153 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 154 | " }\n", 155 | " break;\n", 156 | " }\n", 157 | " }\n", 158 | " }, 500);\n", 159 | " " 160 | ], 161 | "text/plain": [ 162 | "" 163 | ] 164 | }, 165 | "metadata": {}, 166 | "output_type": "display_data" 167 | } 168 | ], 169 | "source": [ 170 | "df = pd.read_csv(\"india_census.csv\")\n", 171 | "df[\"Density\"] = df[\"Density[a]\"].apply(lambda x: int(x.split(\"/\")[0].replace(\",\", \"\")))\n", 172 | "df[\"id\"] = df[\"State or union territory\"].apply(lambda x: state_id_map[x])" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": 7, 178 | "metadata": {}, 179 | "outputs": [ 180 | { 181 | "data": { 182 | "text/html": [ 183 | "
\n", 184 | "\n", 197 | "\n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | "
RankState or union territoryPopulationPopulation (%)Decadal growth(2001–2011)Rural populationPercent ruralUrban populationPercent urbanArea[16]Density[a]Sex ratioDensityid
01.0Uttar Pradesh199812341NaN20.20%155317278NaN44495063NaN240,928 km2 (93,023 sq mi)828/km2 (2,140/sq mi)9128289
12.0Maharashtra112374333NaN20.00%61556074NaN50818259NaN307,713 km2 (118,809 sq mi)365/km2 (950/sq mi)92936527
23.0Bihar104099452NaN25.40%92341436NaN11758016NaN94,163 km2 (36,357 sq mi)1,102/km2 (2,850/sq mi)918110210
34.0West Bengal91276115NaN13.80%62183113NaN29093002NaN88,752 km2 (34,267 sq mi)1,029/km2 (2,670/sq mi)953102919
45.0Madhya Pradesh72626809NaN16.30%52557404NaN20069405NaN308,245 km2 (119,014 sq mi)236/km2 (610/sq mi)93123623
\n", 305 | "
" 306 | ], 307 | "text/plain": [ 308 | " Rank State or union territory Population Population (%) \\\n", 309 | "0 1.0 Uttar Pradesh 199812341 NaN \n", 310 | "1 2.0 Maharashtra 112374333 NaN \n", 311 | "2 3.0 Bihar 104099452 NaN \n", 312 | "3 4.0 West Bengal 91276115 NaN \n", 313 | "4 5.0 Madhya Pradesh 72626809 NaN \n", 314 | "\n", 315 | " Decadal growth(2001–2011) Rural population Percent rural \\\n", 316 | "0 20.20% 155317278 NaN \n", 317 | "1 20.00% 61556074 NaN \n", 318 | "2 25.40% 92341436 NaN \n", 319 | "3 13.80% 62183113 NaN \n", 320 | "4 16.30% 52557404 NaN \n", 321 | "\n", 322 | " Urban population Percent urban Area[16] \\\n", 323 | "0 44495063 NaN 240,928 km2 (93,023 sq mi) \n", 324 | "1 50818259 NaN 307,713 km2 (118,809 sq mi) \n", 325 | "2 11758016 NaN 94,163 km2 (36,357 sq mi) \n", 326 | "3 29093002 NaN 88,752 km2 (34,267 sq mi) \n", 327 | "4 20069405 NaN 308,245 km2 (119,014 sq mi) \n", 328 | "\n", 329 | " Density[a] Sex ratio Density id \n", 330 | "0 828/km2 (2,140/sq mi) 912 828 9 \n", 331 | "1 365/km2 (950/sq mi) 929 365 27 \n", 332 | "2 1,102/km2 (2,850/sq mi) 918 1102 10 \n", 333 | "3 1,029/km2 (2,670/sq mi) 953 1029 19 \n", 334 | "4 236/km2 (610/sq mi) 931 236 23 " 335 | ] 336 | }, 337 | "execution_count": 7, 338 | "metadata": {}, 339 | "output_type": "execute_result" 340 | }, 341 | { 342 | "data": { 343 | "application/javascript": [ 344 | "\n", 345 | " setTimeout(function() {\n", 346 | " var nbb_cell_id = 7;\n", 347 | " var nbb_unformatted_code = \"df.head()\";\n", 348 | " var nbb_formatted_code = \"df.head()\";\n", 349 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 350 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 351 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 352 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 353 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 354 | " }\n", 355 | " break;\n", 356 | " }\n", 357 | " }\n", 358 | " }, 500);\n", 359 | " " 360 | ], 361 | "text/plain": [ 362 | "" 363 | ] 364 | }, 365 | "metadata": {}, 366 | "output_type": "display_data" 367 | } 368 | ], 369 | "source": [ 370 | "df.head()" 371 | ] 372 | }, 373 | { 374 | "cell_type": "code", 375 | "execution_count": 8, 376 | "metadata": {}, 377 | "outputs": [ 378 | { 379 | "data": { 380 | "text/plain": [ 381 | "" 382 | ] 383 | }, 384 | "execution_count": 8, 385 | "metadata": {}, 386 | "output_type": "execute_result" 387 | }, 388 | { 389 | "data": { 390 | "image/png": "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\n", 391 | "text/plain": [ 392 | "
" 393 | ] 394 | }, 395 | "metadata": { 396 | "needs_background": "light" 397 | }, 398 | "output_type": "display_data" 399 | }, 400 | { 401 | "data": { 402 | "application/javascript": [ 403 | "\n", 404 | " setTimeout(function() {\n", 405 | " var nbb_cell_id = 8;\n", 406 | " var nbb_unformatted_code = \"df['Density'].plot()\";\n", 407 | " var nbb_formatted_code = \"df[\\\"Density\\\"].plot()\";\n", 408 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 409 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 410 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 411 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 412 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 413 | " }\n", 414 | " break;\n", 415 | " }\n", 416 | " }\n", 417 | " }, 500);\n", 418 | " " 419 | ], 420 | "text/plain": [ 421 | "" 422 | ] 423 | }, 424 | "metadata": {}, 425 | "output_type": "display_data" 426 | } 427 | ], 428 | "source": [ 429 | "df[\"Density\"].plot()" 430 | ] 431 | }, 432 | { 433 | "cell_type": "code", 434 | "execution_count": 9, 435 | "metadata": {}, 436 | "outputs": [ 437 | { 438 | "data": { 439 | "application/javascript": [ 440 | "\n", 441 | " setTimeout(function() {\n", 442 | " var nbb_cell_id = 9;\n", 443 | " var nbb_unformatted_code = \"df['DensityScale'] = np.log10(df['Density'])\";\n", 444 | " var nbb_formatted_code = \"df[\\\"DensityScale\\\"] = np.log10(df[\\\"Density\\\"])\";\n", 445 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 446 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 447 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 448 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 449 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 450 | " }\n", 451 | " break;\n", 452 | " }\n", 453 | " }\n", 454 | " }, 500);\n", 455 | " " 456 | ], 457 | "text/plain": [ 458 | "" 459 | ] 460 | }, 461 | "metadata": {}, 462 | "output_type": "display_data" 463 | } 464 | ], 465 | "source": [ 466 | "df[\"DensityScale\"] = np.log10(df[\"Density\"])" 467 | ] 468 | }, 469 | { 470 | "cell_type": "code", 471 | "execution_count": 10, 472 | "metadata": {}, 473 | "outputs": [ 474 | { 475 | "data": { 476 | "text/plain": [ 477 | "" 478 | ] 479 | }, 480 | "execution_count": 10, 481 | "metadata": {}, 482 | "output_type": "execute_result" 483 | }, 484 | { 485 | "data": { 486 | "image/png": "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\n", 487 | "text/plain": [ 488 | "
" 489 | ] 490 | }, 491 | "metadata": { 492 | "needs_background": "light" 493 | }, 494 | "output_type": "display_data" 495 | }, 496 | { 497 | "data": { 498 | "application/javascript": [ 499 | "\n", 500 | " setTimeout(function() {\n", 501 | " var nbb_cell_id = 10;\n", 502 | " var nbb_unformatted_code = \"df['DensityScale'].plot()\";\n", 503 | " var nbb_formatted_code = \"df[\\\"DensityScale\\\"].plot()\";\n", 504 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 505 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 506 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 507 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 508 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 509 | " }\n", 510 | " break;\n", 511 | " }\n", 512 | " }\n", 513 | " }, 500);\n", 514 | " " 515 | ], 516 | "text/plain": [ 517 | "" 518 | ] 519 | }, 520 | "metadata": {}, 521 | "output_type": "display_data" 522 | } 523 | ], 524 | "source": [ 525 | "df[\"DensityScale\"].plot()" 526 | ] 527 | }, 528 | { 529 | "cell_type": "code", 530 | "execution_count": 22, 531 | "metadata": {}, 532 | "outputs": [ 533 | { 534 | "data": { 535 | "application/javascript": [ 536 | "\n", 537 | " setTimeout(function() {\n", 538 | " var nbb_cell_id = 22;\n", 539 | " var nbb_unformatted_code = \"fig = px.choropleth(\\n df,\\n locations=\\\"id\\\",\\n geojson=india_states,\\n color=\\\"DensityScale\\\",\\n hover_name=\\\"State or union territory\\\",\\n hover_data=[\\\"Density\\\"],\\n title=\\\"India Population Density\\\"\\n)\\nfig.update_geos(fitbounds=\\\"locations\\\", visible=False)\\nfig.show()\";\n", 540 | " var nbb_formatted_code = \"fig = px.choropleth(\\n df,\\n locations=\\\"id\\\",\\n geojson=india_states,\\n color=\\\"DensityScale\\\",\\n hover_name=\\\"State or union territory\\\",\\n hover_data=[\\\"Density\\\"],\\n title=\\\"India Population Density\\\",\\n)\\nfig.update_geos(fitbounds=\\\"locations\\\", visible=False)\\nfig.show()\";\n", 541 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 542 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 543 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 544 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 545 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 546 | " }\n", 547 | " break;\n", 548 | " }\n", 549 | " }\n", 550 | " }, 500);\n", 551 | " " 552 | ], 553 | "text/plain": [ 554 | "" 555 | ] 556 | }, 557 | "metadata": {}, 558 | "output_type": "display_data" 559 | } 560 | ], 561 | "source": [ 562 | "fig = px.choropleth(\n", 563 | " df,\n", 564 | " locations=\"id\",\n", 565 | " geojson=india_states,\n", 566 | " color=\"DensityScale\",\n", 567 | " hover_name=\"State or union territory\",\n", 568 | " hover_data=[\"Density\"],\n", 569 | " title=\"India Population Density\",\n", 570 | ")\n", 571 | "fig.update_geos(fitbounds=\"locations\", visible=False)\n", 572 | "fig.show()" 573 | ] 574 | }, 575 | { 576 | "cell_type": "markdown", 577 | "metadata": {}, 578 | "source": [ 579 | "![](https://i.imgur.com/WZWtu67.png)" 580 | ] 581 | }, 582 | { 583 | "cell_type": "code", 584 | "execution_count": null, 585 | "metadata": {}, 586 | "outputs": [], 587 | "source": [] 588 | }, 589 | { 590 | "cell_type": "code", 591 | "execution_count": 14, 592 | "metadata": {}, 593 | "outputs": [ 594 | { 595 | "data": { 596 | "application/javascript": [ 597 | "\n", 598 | " setTimeout(function() {\n", 599 | " var nbb_cell_id = 14;\n", 600 | " var nbb_unformatted_code = \"fig = px.choropleth_mapbox(\\n df,\\n locations=\\\"id\\\",\\n geojson=india_states,\\n color=\\\"DensityScale\\\",\\n hover_name=\\\"State or union territory\\\",\\n hover_data=[\\\"Density\\\"],\\n title=\\\"India Population Density\\\",\\n mapbox_style=\\\"carto-positron\\\",\\n center={\\\"lat\\\": 24, \\\"lon\\\": 78},\\n zoom=3,\\n opacity=0.5,\\n)\\nfig.show()\";\n", 601 | " var nbb_formatted_code = \"fig = px.choropleth_mapbox(\\n df,\\n locations=\\\"id\\\",\\n geojson=india_states,\\n color=\\\"DensityScale\\\",\\n hover_name=\\\"State or union territory\\\",\\n hover_data=[\\\"Density\\\"],\\n title=\\\"India Population Density\\\",\\n mapbox_style=\\\"carto-positron\\\",\\n center={\\\"lat\\\": 24, \\\"lon\\\": 78},\\n zoom=3,\\n opacity=0.5,\\n)\\nfig.show()\";\n", 602 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 603 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 604 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 605 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 606 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 607 | " }\n", 608 | " break;\n", 609 | " }\n", 610 | " }\n", 611 | " }, 500);\n", 612 | " " 613 | ], 614 | "text/plain": [ 615 | "" 616 | ] 617 | }, 618 | "metadata": {}, 619 | "output_type": "display_data" 620 | } 621 | ], 622 | "source": [ 623 | "fig = px.choropleth_mapbox(\n", 624 | " df,\n", 625 | " locations=\"id\",\n", 626 | " geojson=india_states,\n", 627 | " color=\"DensityScale\",\n", 628 | " hover_name=\"State or union territory\",\n", 629 | " hover_data=[\"Density\"],\n", 630 | " title=\"India Population Density\",\n", 631 | " mapbox_style=\"carto-positron\",\n", 632 | " center={\"lat\": 24, \"lon\": 78},\n", 633 | " zoom=3,\n", 634 | " opacity=0.5,\n", 635 | ")\n", 636 | "fig.show()" 637 | ] 638 | }, 639 | { 640 | "cell_type": "markdown", 641 | "metadata": {}, 642 | "source": [ 643 | "![](https://i.imgur.com/az9x32O.png)" 644 | ] 645 | }, 646 | { 647 | "cell_type": "code", 648 | "execution_count": null, 649 | "metadata": {}, 650 | "outputs": [], 651 | "source": [] 652 | }, 653 | { 654 | "cell_type": "code", 655 | "execution_count": 15, 656 | "metadata": {}, 657 | "outputs": [ 658 | { 659 | "data": { 660 | "application/javascript": [ 661 | "\n", 662 | " setTimeout(function() {\n", 663 | " var nbb_cell_id = 15;\n", 664 | " var nbb_unformatted_code = \"df['SexRatioScale'] = df['Sex ratio'] - 1000\";\n", 665 | " var nbb_formatted_code = \"df[\\\"SexRatioScale\\\"] = df[\\\"Sex ratio\\\"] - 1000\";\n", 666 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 667 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 668 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 669 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 670 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 671 | " }\n", 672 | " break;\n", 673 | " }\n", 674 | " }\n", 675 | " }, 500);\n", 676 | " " 677 | ], 678 | "text/plain": [ 679 | "" 680 | ] 681 | }, 682 | "metadata": {}, 683 | "output_type": "display_data" 684 | } 685 | ], 686 | "source": [ 687 | "df[\"SexRatioScale\"] = df[\"Sex ratio\"] - 1000" 688 | ] 689 | }, 690 | { 691 | "cell_type": "code", 692 | "execution_count": 18, 693 | "metadata": {}, 694 | "outputs": [ 695 | { 696 | "data": { 697 | "application/javascript": [ 698 | "\n", 699 | " setTimeout(function() {\n", 700 | " var nbb_cell_id = 18;\n", 701 | " var nbb_unformatted_code = \"fig = px.choropleth(\\n df,\\n locations=\\\"id\\\",\\n geojson=india_states,\\n color=\\\"SexRatioScale\\\",\\n hover_name=\\\"State or union territory\\\",\\n hover_data=[\\\"Sex ratio\\\"],\\n title='India Sex Ratio',\\n color_continuous_scale=px.colors.diverging.BrBG,\\n color_continuous_midpoint=0,\\n)\\nfig.update_geos(fitbounds=\\\"locations\\\", visible=False)\\nfig.show()\";\n", 702 | " var nbb_formatted_code = \"fig = px.choropleth(\\n df,\\n locations=\\\"id\\\",\\n geojson=india_states,\\n color=\\\"SexRatioScale\\\",\\n hover_name=\\\"State or union territory\\\",\\n hover_data=[\\\"Sex ratio\\\"],\\n title=\\\"India Sex Ratio\\\",\\n color_continuous_scale=px.colors.diverging.BrBG,\\n color_continuous_midpoint=0,\\n)\\nfig.update_geos(fitbounds=\\\"locations\\\", visible=False)\\nfig.show()\";\n", 703 | " var nbb_cells = Jupyter.notebook.get_cells();\n", 704 | " for (var i = 0; i < nbb_cells.length; ++i) {\n", 705 | " if (nbb_cells[i].input_prompt_number == nbb_cell_id) {\n", 706 | " if (nbb_cells[i].get_text() == nbb_unformatted_code) {\n", 707 | " nbb_cells[i].set_text(nbb_formatted_code);\n", 708 | " }\n", 709 | " break;\n", 710 | " }\n", 711 | " }\n", 712 | " }, 500);\n", 713 | " " 714 | ], 715 | "text/plain": [ 716 | "" 717 | ] 718 | }, 719 | "metadata": {}, 720 | "output_type": "display_data" 721 | } 722 | ], 723 | "source": [ 724 | "fig = px.choropleth(\n", 725 | " df,\n", 726 | " locations=\"id\",\n", 727 | " geojson=india_states,\n", 728 | " color=\"SexRatioScale\",\n", 729 | " hover_name=\"State or union territory\",\n", 730 | " hover_data=[\"Sex ratio\"],\n", 731 | " title=\"India Sex Ratio\",\n", 732 | " color_continuous_scale=px.colors.diverging.BrBG,\n", 733 | " color_continuous_midpoint=0,\n", 734 | ")\n", 735 | "fig.update_geos(fitbounds=\"locations\", visible=False)\n", 736 | "fig.show()" 737 | ] 738 | }, 739 | { 740 | "cell_type": "markdown", 741 | "metadata": {}, 742 | "source": [ 743 | "![](https://i.imgur.com/0ZIBaR6.png)" 744 | ] 745 | }, 746 | { 747 | "cell_type": "code", 748 | "execution_count": null, 749 | "metadata": {}, 750 | "outputs": [], 751 | "source": [] 752 | }, 753 | { 754 | "cell_type": "markdown", 755 | "metadata": {}, 756 | "source": [ 757 | "## References\n", 758 | "\n", 759 | "- https://en.wikipedia.org/wiki/List_of_states_and_union_territories_of_India_by_population\n", 760 | "\n", 761 | "- https://un-mapped.carto.com/tables/states_india/public/map\n", 762 | "\n", 763 | "- https://plotly.com/python/choropleth-maps/\n", 764 | "\n", 765 | "- https://plotly.com/python/colorscales/\n", 766 | "\n", 767 | "- https://www.mapbox.com/\n", 768 | "\n", 769 | "- https://plotly.com/python/mapbox-county-choropleth/\n", 770 | "\n", 771 | "- https://plotly.com/python/mapbox-layers/" 772 | ] 773 | } 774 | ], 775 | "metadata": { 776 | "kernelspec": { 777 | "display_name": "pyenv37", 778 | "language": "python", 779 | "name": "pyenv37" 780 | }, 781 | "language_info": { 782 | "codemirror_mode": { 783 | "name": "ipython", 784 | "version": 3 785 | }, 786 | "file_extension": ".py", 787 | "mimetype": "text/x-python", 788 | "name": "python", 789 | "nbconvert_exporter": "python", 790 | "pygments_lexer": "ipython3", 791 | "version": "3.7.7" 792 | } 793 | }, 794 | "nbformat": 4, 795 | "nbformat_minor": 2 796 | } 797 | --------------------------------------------------------------------------------