{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "dX2QEf0IYrDL" }, "source": [ "## Introduction / Overview\n", "\n", "This Jupyter notebook collects all the code from the *Programming Historian* lesson 'Creating Choropleth Maps with Python and Folium': https://doi.org/10.46430/phen0126 \n", "\n", "**Make sure to run all the code cells in order!** Jupyter notebooks load data into the computer's memory in the sequence in which they are executed, *not* the order they appear in the notebook. So if you try to run cell $3$ without running cell $2$, it might not work.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "GK_1XvuyGGpB" }, "source": [ "Load the libraries needed for the lesson.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "aj8jSG5bGBI2" }, "outputs": [], "source": [ "#!pip install geopandas\n", "\n", "import pandas as pd\n", "import geopandas as gpd\n", "import folium\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": { "id": "KJfRobZdlYa-" }, "source": [ "## Get the Data" ] }, { "cell_type": "markdown", "metadata": { "id": "x9v-avdANS75" }, "source": [ "### Fatal Force Data\n", "\n", "Get the data to be visualized on the choropleth map.\n", "* the default first line will access the datafile on the *Programming Historian* archive\n", "* the second -- commented out -- will load the up-to-date version of the datafile from the *Washington Post*'s archive.\n", "\n", "If you wish to load the most recent version of the data, edit the next cell to comment out the first two lines and delete the `#` signs on the second two." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "Y1HFPG8DNRyM" }, "outputs": [], "source": [ "ff_df = pd.read_csv('https://raw.githubusercontent.com/programminghistorian/jekyll/gh-pages/assets/choropleth-maps-python-folium/fatal-police-shootings-data.csv',\n", " parse_dates = ['date'])\n", "# ff_df = pd.read_csv('https://raw.githubusercontent.com/washingtonpost/data-police-shootings/master/v2/fatal-police-shootings-data.csv',\n", "# parse_dates = ['date'])" ] }, { "cell_type": "markdown", "metadata": { "id": "-Pw-LHeTOKA2" }, "source": [ "Examine the data." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "t0m3HhQyK9iL", "outputId": "1306b9fe-becf-4d20-9e81-cdeac12b50a2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 9628 entries, 0 to 9627\n", "Data columns (total 19 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 id 9628 non-null int64 \n", " 1 date 9628 non-null datetime64[ns]\n", " 2 threat_type 9560 non-null object \n", " 3 flee_status 8315 non-null object \n", " 4 armed_with 9416 non-null object \n", " 5 city 9557 non-null object \n", " 6 county 4912 non-null object \n", " 7 state 9628 non-null object \n", " 8 latitude 8567 non-null float64 \n", " 9 longitude 8567 non-null float64 \n", " 10 location_precision 8567 non-null object \n", " 11 name 9293 non-null object \n", " 12 age 9247 non-null float64 \n", " 13 gender 9602 non-null object \n", " 14 race 8489 non-null object \n", " 15 race_source 8515 non-null object \n", " 16 was_mental_illness_related 9628 non-null bool \n", " 17 body_camera 9628 non-null bool \n", " 18 agency_ids 9628 non-null object \n", "dtypes: bool(2), datetime64[ns](1), float64(3), int64(1), object(12)\n", "memory usage: 1.3+ MB\n" ] } ], "source": [ "ff_df.info()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 330 }, "id": "a36DCjzSLGc8", "outputId": "c254f008-81f7-48c5-c89f-7e46f576c34a" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
iddatethreat_typeflee_statusarmed_withcitycountystatelatitudelongitudelocation_precisionnameagegenderracerace_sourcewas_mental_illness_relatedbody_cameraagency_ids
215424002017-03-04pointnotgunFountain InnGreenvilleSC34.731396-82.181132not_availableJoseph Scott Inabinet50.0maleWnot_availableTrueFalse395
5536772015-07-25shootnotgunDecaturDecaturGA30.848699-84.734911not_availableRoger Braswell50.0maleWnot_availableTrueFalse677
495653632020-01-10threatcarunarmedSpokaneNaNWA47.720496-117.422026not_availableClando Anitok25.0maleAnot_availableFalseFalse2264
175419622016-10-12threatcargunLas VegasClarkNV36.169941-115.139830not_availableRex Vance Wilson50.0maleNaNNaNFalseTrue375
470751172019-10-20pointnotreplicaBoiseNaNID43.638757-116.233557not_availableAmber Lea Dewitt33.0femaleWnot_availableTrueTrue349
\n", "
" ], "text/plain": [ " id date threat_type flee_status armed_with city \\\n", "2154 2400 2017-03-04 point not gun Fountain Inn \n", "553 677 2015-07-25 shoot not gun Decatur \n", "4956 5363 2020-01-10 threat car unarmed Spokane \n", "1754 1962 2016-10-12 threat car gun Las Vegas \n", "4707 5117 2019-10-20 point not replica Boise \n", "\n", " county state latitude longitude location_precision \\\n", "2154 Greenville SC 34.731396 -82.181132 not_available \n", "553 Decatur GA 30.848699 -84.734911 not_available \n", "4956 NaN WA 47.720496 -117.422026 not_available \n", "1754 Clark NV 36.169941 -115.139830 not_available \n", "4707 NaN ID 43.638757 -116.233557 not_available \n", "\n", " name age gender race race_source \\\n", "2154 Joseph Scott Inabinet 50.0 male W not_available \n", "553 Roger Braswell 50.0 male W not_available \n", "4956 Clando Anitok 25.0 male A not_available \n", "1754 Rex Vance Wilson 50.0 male NaN NaN \n", "4707 Amber Lea Dewitt 33.0 female W not_available \n", "\n", " was_mental_illness_related body_camera agency_ids \n", "2154 True False 395 \n", "553 True False 677 \n", "4956 False False 2264 \n", "1754 False True 375 \n", "4707 True True 349 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ff_df.sample(5)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 True\n", "1 True\n", "2 True\n", "3 True\n", "4 True\n", " ... \n", "9623 False\n", "9624 True\n", "9625 True\n", "9626 True\n", "9627 True\n", "Name: latitude, Length: 9628, dtype: bool" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ff_df['latitude'].notna()" ] }, { "cell_type": "markdown", "metadata": { "id": "PeRaQT4HLscI" }, "source": [ "What percent of records have latitude / longitude data?\n", "\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "cqtIOa5PN3Q6", "outputId": "14101ad2-e900-4667-e39a-0f0a34f47ad1" }, "outputs": [ { "data": { "text/plain": [ "0.8898005816368924" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(ff_df[ff_df['latitude'].notna()]) / len(ff_df)" ] }, { "cell_type": "markdown", "metadata": { "id": "MHRjbq18OYrt" }, "source": [ "Drop all the rows that do not have lat/lon data." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "2DjH4jVwOdkq" }, "outputs": [], "source": [ "ff_df = ff_df[ff_df['latitude'].notna()]" ] }, { "cell_type": "markdown", "metadata": { "id": "Pkk0XHsWwSCU" }, "source": [ "### County Geometry Data\n", "\n", "Get the datafiles that have geometry shape data for US counties.\n", "\n", "As above, first line has the datafile archived by *Programming Historian*. The second has the URL to access the data at the US Census bureau." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "2Ed3CI6TBYbN" }, "outputs": [], "source": [ "counties = gpd.read_file('https://raw.githubusercontent.com/programminghistorian/jekyll/gh-pages/assets/choropleth-maps-python-folium/cb_2021_us_county_5m.zip')\n", "\n", "# counties = gpd.read_file(\"https://www2.census.gov/geo/tiger/GENZ2021/shp/cb_2021_us_county_5m.zip\")\n" ] }, { "cell_type": "markdown", "metadata": { "id": "Ae0njJH2Befj" }, "source": [ "Examine the county geometry data." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qlZJvZXNPo8P", "outputId": "ba7def70-f187-4d82-ea1b-936aba8e4906" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 3234 entries, 0 to 3233\n", "Data columns (total 13 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 STATEFP 3234 non-null object \n", " 1 COUNTYFP 3234 non-null object \n", " 2 COUNTYNS 3234 non-null object \n", " 3 AFFGEOID 3234 non-null object \n", " 4 GEOID 3234 non-null object \n", " 5 NAME 3234 non-null object \n", " 6 NAMELSAD 3234 non-null object \n", " 7 STUSPS 3234 non-null object \n", " 8 STATE_NAME 3234 non-null object \n", " 9 LSAD 3234 non-null object \n", " 10 ALAND 3234 non-null int64 \n", " 11 AWATER 3234 non-null int64 \n", " 12 geometry 3234 non-null geometry\n", "dtypes: geometry(1), int64(2), object(10)\n", "memory usage: 328.6+ KB\n" ] } ], "source": [ "counties.info()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 143 }, "id": "GqXm_TrRPr52", "outputId": "40b110f2-6592-47bd-cd97-c8ba0c63c2b7" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
STATEFPCOUNTYFPCOUNTYNSAFFGEOIDGEOIDNAMENAMELSADSTUSPSSTATE_NAMELSADALANDAWATERgeometry
196317103004242530500000US1710317103LeeLee CountyILIllinois0618771890709732924POLYGON ((-89.62933 41.90162, -89.47999 41.902...
51451770014984390500000US5177051770RoanokeRoanoke cityVAVirginia25110129436855753POLYGON ((-80.03346 37.26289, -80.01467 37.270...
244837043010085460500000US3704337043ClayClay CountyNCNorth Carolina0655680450315017755POLYGON ((-84.00458 34.99445, -83.97985 35.005...
\n", "
" ], "text/plain": [ " STATEFP COUNTYFP COUNTYNS AFFGEOID GEOID NAME NAMELSAD \\\n", "1963 17 103 00424253 0500000US17103 17103 Lee Lee County \n", "514 51 770 01498439 0500000US51770 51770 Roanoke Roanoke city \n", "2448 37 043 01008546 0500000US37043 37043 Clay Clay County \n", "\n", " STUSPS STATE_NAME LSAD ALAND AWATER \\\n", "1963 IL Illinois 06 1877189070 9732924 \n", "514 VA Virginia 25 110129436 855753 \n", "2448 NC North Carolina 06 556804503 15017755 \n", "\n", " geometry \n", "1963 POLYGON ((-89.62933 41.90162, -89.47999 41.902... \n", "514 POLYGON ((-80.03346 37.26289, -80.01467 37.270... \n", "2448 POLYGON ((-84.00458 34.99445, -83.97985 35.005... " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "counties.sample(3)" ] }, { "cell_type": "markdown", "metadata": { "id": "AYHZQl46B-vj" }, "source": [ "Just for fun, pick a county you're familiar with and see what it looks like:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 448 }, "id": "jSl_AHJVIBmj", "outputId": "03771279-14e2-4325-8bfa-82870e4d14a3" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "counties[(counties['NAME']=='Suffolk') & (counties['STUSPS']=='MA')].plot()" ] }, { "cell_type": "markdown", "metadata": { "id": "AO5aQg4lPak5" }, "source": [ "Rename the `GEOID` column as `FIPS` and drop all columns not needed for this lesson." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "mgMLt4sgBaGt", "outputId": "79cc1b7e-c9bb-4b03-cef5-ed974768c3f1" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 3234 entries, 0 to 3233\n", "Data columns (total 3 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 FIPS 3234 non-null object \n", " 1 NAME 3234 non-null object \n", " 2 geometry 3234 non-null geometry\n", "dtypes: geometry(1), object(2)\n", "memory usage: 75.9+ KB\n" ] } ], "source": [ "counties = counties.rename(columns={'GEOID':'FIPS'})\n", "counties = counties[['FIPS','NAME','geometry']]\n", "counties.info()" ] }, { "cell_type": "markdown", "metadata": { "id": "2nRnqiMPQuO4" }, "source": [ "### Preparing the Data\n", "1. Add a `points` column to the **Fatal Force** dataframe, using the `EPSG:4326` CRS.\n", "1. Convert the **Counties** dataframe to the `EPSG:4326` CRS\n", "\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "id": "Gw0BHBSgWqlj" }, "outputs": [], "source": [ "ff_df['points'] = gpd.points_from_xy(ff_df.longitude, ff_df.latitude, crs=\"EPSG:4326\")\n", "ff_df = gpd.GeoDataFrame(data=ff_df,geometry='points')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "9VMC_qL3XMYy", "outputId": "5de0cfcd-4277-4546-a553-3bcc15fc178b" }, "outputs": [ { "data": { "text/plain": [ "\n", "Name: WGS 84\n", "Axis Info [ellipsoidal]:\n", "- Lat[north]: Geodetic latitude (degree)\n", "- Lon[east]: Geodetic longitude (degree)\n", "Area of Use:\n", "- name: World.\n", "- bounds: (-180.0, -90.0, 180.0, 90.0)\n", "Datum: World Geodetic System 1984 ensemble\n", "- Ellipsoid: WGS 84\n", "- Prime Meridian: Greenwich" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "counties = counties.to_crs('EPSG:4326')\n", "counties.crs" ] }, { "cell_type": "markdown", "metadata": { "id": "tmZfpZe_QYir" }, "source": [ "Add `FIPS` data to the **Fatal Force** DF." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "id": "-OnNNcGAUKJN" }, "outputs": [], "source": [ "ff_df = gpd.sjoin(left_df = ff_df,\n", " right_df = counties,\n", " how = 'left')" ] }, { "cell_type": "markdown", "metadata": { "id": "4WiYjCnNQmMG" }, "source": [ "Check the **Fatal Force** DF to make sure the data has been added correctly." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "S3TBPEZnWbm_", "outputId": "ba8ec264-7774-45ce-c369-fd3c8f1215c6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Index: 8567 entries, 0 to 9627\n", "Data columns (total 23 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 id 8567 non-null int64 \n", " 1 date 8567 non-null datetime64[ns]\n", " 2 threat_type 8512 non-null object \n", " 3 flee_status 7489 non-null object \n", " 4 armed_with 8368 non-null object \n", " 5 city 8536 non-null object \n", " 6 county 4654 non-null object \n", " 7 state 8567 non-null object \n", " 8 latitude 8567 non-null float64 \n", " 9 longitude 8567 non-null float64 \n", " 10 location_precision 8567 non-null object \n", " 11 name 8303 non-null object \n", " 12 age 8254 non-null float64 \n", " 13 gender 8549 non-null object \n", " 14 race 7625 non-null object \n", " 15 race_source 7645 non-null object \n", " 16 was_mental_illness_related 8567 non-null bool \n", " 17 body_camera 8567 non-null bool \n", " 18 agency_ids 8567 non-null object \n", " 19 points 8567 non-null geometry \n", " 20 index_right 8559 non-null float64 \n", " 21 FIPS 8559 non-null object \n", " 22 NAME 8559 non-null object \n", "dtypes: bool(2), datetime64[ns](1), float64(4), geometry(1), int64(1), object(14)\n", "memory usage: 1.5+ MB\n" ] } ], "source": [ "ff_df.info()" ] }, { "cell_type": "markdown", "metadata": { "id": "RZ_F_QWibkOv" }, "source": [ "## Summarizing the Data by County\n", "\n", "Create a DF that sums the number of police killings in each county in the **Fatal Force** DF.\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "xPEmEbSNcpIr", "outputId": "a99a8cba-c596-4aff-8f24-d1d8bcbb9355" }, "outputs": [ { "data": { "text/plain": [ "FIPS \n", "06037 341\n", "04013 224\n", "48201 139\n", "06071 114\n", "32003 102\n", " ... \n", "29105 1\n", "29107 1\n", "29109 1\n", "29113 1\n", "56033 1\n", "Name: count, Length: 1593, dtype: int64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "map_df = ff_df[['FIPS']].value_counts()\n", "map_df" ] }, { "cell_type": "markdown", "metadata": { "id": "oe298xbydYYQ" }, "source": [ "Convert the value counts series into a DF." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 424 }, "id": "maHK8XvFdCjE", "outputId": "e3aa06e8-fd2b-4ada-a0f3-aec9e25a8198" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FIPScount
006037341
104013224
248201139
306071114
432003102
.........
1588291051
1589291071
1590291091
1591291131
1592560331
\n", "

1593 rows × 2 columns

\n", "
" ], "text/plain": [ " FIPS count\n", "0 06037 341\n", "1 04013 224\n", "2 48201 139\n", "3 06071 114\n", "4 32003 102\n", "... ... ...\n", "1588 29105 1\n", "1589 29107 1\n", "1590 29109 1\n", "1591 29113 1\n", "1592 56033 1\n", "\n", "[1593 rows x 2 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "map_df = map_df.reset_index()\n", "map_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If the prior cell doesn't rename the `count` column, run the next cell to do so." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "map_df.rename(columns={0:'count'})\n", "map_df\n", " " ] }, { "cell_type": "markdown", "metadata": { "id": "wUXmf9fIeZ4W" }, "source": [ "## Draw the Map\n", "\n", "Create a function that will allow us to easily initialize a Folium map variable." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "id": "qTS8DqkRNawK" }, "outputs": [], "source": [ "def initMap():\n", " tiles = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}'\n", " attr = 'Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community'\n", "\n", " center = [40,-96]\n", "\n", " map = folium.Map(location=center,\n", " zoom_start = 5,\n", " tiles = tiles,\n", " attr = attr)\n", " return map" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "id": "oZvVFsIDZtpL" }, "outputs": [], "source": [ "baseMap = initMap()" ] }, { "cell_type": "markdown", "metadata": { "id": "MVgECVlwU6iZ" }, "source": [ "Once we have inititalized the map, we can draw the map and display it." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 808 }, "id": "w9dqDLqLU6Ki", "outputId": "16d6f96c-b2f0-4db0-f6b2-f07fd8d298e0" }, "outputs": [], "source": [ "folium.Choropleth(\n", " geo_data = counties,\n", " data = map_df,\n", " columns = ['FIPS','count'],\n", " key_on = 'feature.properties.FIPS',\n", " bins = 9,\n", " fill_color='OrRd',\n", " fill_opacity=0.8,\n", " line_opacity=0.2,\n", " nan_fill_color = 'grey',\n", " legend_name='Number of Fatal Police Shootings (2015-present)'\n", " ).add_to(baseMap)\n", "\n", "baseMap # this displays the map" ] }, { "cell_type": "markdown", "metadata": { "id": "wZPLCtOQic5K" }, "source": [ "## The Problem of Uneven Distribution of Data\n", "\n", "Why does the map look so uniform?\n", "\n", "Examine the underlying data.\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 300 }, "id": "cjjDafOzgx_M", "outputId": "3e546560-5db3-4b5f-fd12-c149dcedc017" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
count
count1593.000000
mean5.372881
std14.196364
min1.000000
25%1.000000
50%2.000000
75%5.000000
max341.000000
\n", "
" ], "text/plain": [ " count\n", "count 1593.000000\n", "mean 5.372881\n", "std 14.196364\n", "min 1.000000\n", "25% 1.000000\n", "50% 2.000000\n", "75% 5.000000\n", "max 341.000000" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "map_df.describe()" ] }, { "cell_type": "markdown", "metadata": { "id": "D2lUuxU1g4Qc" }, "source": [ "Visualize the data with a boxplot." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 448 }, "id": "szJOaFi8htj1", "outputId": "d99c1cd6-4362-412a-a63c-950adec083e6" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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1tGT43vDqbAGTozfQ/rKKbnX0mlm69atKSLSxo0be3Tc3r17U0SkvXv39tpampqa0ue//NUUEen+H38/nf/d89PmNzanlFLatH1PmviFR9Om7Xs6HTd8+PAUEdn/qqysTKNHj+7RMaNHj0633XZbmjRpUpe3T5o0Ka1YsSKtWLHiqPc5/FwrVqzo1u9lV+erqqrqtP72xz+aH/zgB6mqqqpHxxxrHT05vjf0xhqamprSj370o9TU1HQSV3rq6685nAr76Ej2RJvc5nC8e60nczie79/+WKqPvec974m9e/f29zJOimHDhhW/HjduXNTX18fu3bvj+uuvj4iI2bNnx7nnntvpuD/7sz+LWbNmRUTbK1r/9E//VKz+mpqaePDBB6OmpiYKhUKMGjUqrr322rjmmmti2rRpsXz58uJ5Ro4cGYVCIe66666YPXt27N69O6655ppYuXLlu6575cqVce2118a0adPi6aefjoaGhli+fHnU1dXF7t27Y/ny5dHQ0BBPP/10TJs2La699touz7ly5cr4xCc+ERMnTox169Z165hjraMnx/eGU2ENnBi/h/SVU3qvdTuD/r/W1tZ0zz33pClTpqSysrI0YcKEdPfdd6eUUnr++efTpZdems4444w0cuTI9KlPfSo1NDQUj503b1665ZZbOpzvqquuSkuXLi1enjhxYvr7v//79Kd/+qfpzDPPTBMmTEjf+ta3irfHET+dz5s3r1vrPhVeuamrq+uzV02GDx+eSkpKjnp7WVlZqqqqSoVCoXhdaWlph/uMGjWq0+Wj3f+CCy5I+/fvT4sXL04VFRVp0KBBqaqqKg0ZMiQNGjQoLV68ODU1NaWJEyemkpKSVCgU0qJFi9LixYvT5MmTU1NTU7ryyitToVBIJSUlxWNaW1tTSm37bsmSJWny5MnpjDPOSBUVFenAgQNp0qRJaciQIWnx4sWpubm5eJ+mpqbiWiZNmpRaWlq6/D1saWlJkyZNSkuWLCk+Vvt1ixcvLq6v/fjD13H4OduPufLKK9PKlSs7/DRytGOOtY6eHN8benMNuf10erz6eg6nwj46GnuiTS5zONG9drJfuenxe25uv/32ePDBB+O+++6L2bNnx86dO2PLli2xf//+uOKKK+Liiy+OZ599Nurq6uLP//zP46abborvfve7PXqMr371q/HlL385vvjFL8YP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E88880ysWrUqWlpaYuHChbFv377ifQbCnujOHCIGxp4YP3583HPPPfHcc8/Fc889FwsWLIirrrqqGDADYT9EHHsOEX24HxLH5SMf+Ui68cYbO1w3derU9Nd//df9tKKT784770zTp0/v8raDBw+m6urqdM899xSve+edd9Lw4cPTN7/5zT5a4ckXEemRRx4pXu7O896zZ08qLS1NDz/8cPE+r7/+eiopKUn/+Z//2Wdr701HziGllJYuXZquuuqqox6T4xxSSqmuri5FRKqtrU0pDdw9ceQcUhq4eyKllEaMGJG+/e1vD9j90K59Din17X7wys1xaGpqig0bNsTChQs7XL9w4cJYv359P62qb7z00ksxduzYmDx5cnziE5+Il19+OSIitm7dGrt27eowk/Ly8pg3b17WM+nO896wYUM0Nzd3uM/YsWPj/PPPz242a9asiaqqqjjnnHPiU5/6VNTV1RVvy3UOe/fujYiIkSNHRsTA3RNHzqHdQNsTra2t8fDDD8e+ffti1qxZA3Y/HDmHdn21HwbMP5zZm954441obW2Ns846q8P1Z511VuzataufVnXyXXTRRfG9730vzjnnnPjd734Xd999d3z0ox+NzZs3F593VzN55ZVX+mO5faI7z3vXrl1RVlYWI0aM6HSfnPZLTU1NfPzjH4+JEyfG1q1b40tf+lIsWLAgNmzYEOXl5VnOIaUUn/vc52L27Nlx/vnnR8TA3BNdzSFiYO2JTZs2xaxZs+Kdd96JM888Mx555JE477zzit+UB8p+ONocIvp2P4ibE1AoFDpcTil1ui4nNTU1xa+nTZsWs2bNiilTpsRDDz1UfFPYQJtJu+N53rnN5rrrrit+ff7558eFF14YEydOjMceeyyuvvrqox53Os/hpptuiueffz6eeuqpTrcNpD1xtDkMpD3xgQ98IP77v/879uzZEytWrIilS5dGbW1t8faBsh+ONofzzjuvT/eDP5Y6DqNGjYpBgwZ1Ksm6urpOdZ6zoUOHxrRp0+Kll14q/q2pgTaT7jzv6urqaGpqirfeeuuo98nRmDFjYuLEifHSSy9FRH5zuPnmm+PHP/5xrF69OsaPH1+8fqDtiaPNoSs574mysrJ4//vfHxdeeGEsX748pk+fHl/72tcG3H442hy6cjL3g7g5DmVlZTFjxoxYtWpVh+tXrVoVH/3oR/tpVX2vsbExXnjhhRgzZkxMnjw5qqurO8ykqakpamtrs55Jd573jBkzorS0tMN9du7cGb/61a+yns2bb74Zr732WowZMyYi8plDSiluuummWLlyZTz55JMxefLkDrcPlD1xrDl0Jdc90ZWUUjQ2Ng6Y/XA07XPoykndDz16+zFFDz/8cCotLU3/9m//ln7961+nZcuWpaFDh6Zt27b199JOmltvvTWtWbMmvfzyy+mZZ55JixcvTsOGDSs+53vuuScNHz48rVy5Mm3atCn90R/9URozZkyqr6/v55WfmIaGhrRx48a0cePGFBHp3nvvTRs3bkyvvPJKSql7z/vGG29M48ePTz/72c/SL3/5y7RgwYI0ffr01NLS0l9Pq8febQ4NDQ3p1ltvTevXr09bt25Nq1evTrNmzUrjxo3Lbg6f/vSn0/Dhw9OaNWvSzp07i7/2799fvM9A2BPHmsNA2hO33357Wrt2bdq6dWt6/vnn0xe/+MVUUlKSnnjiiZTSwNgPKb37HPp6P4ibE/CNb3wjTZw4MZWVlaULLrigw1+BzNF1112XxowZk0pLS9PYsWPT1VdfnTZv3ly8/eDBg+nOO+9M1dXVqby8PM2dOzdt2rSpH1fcO1avXp0iotOvpUuXppS697wPHDiQbrrppjRy5Mg0ZMiQtHjx4vTqq6/2w7M5fu82h/3796eFCxem0aNHp9LS0nT22WenpUuXdnqOOcyhqxlERPrOd75TvM9A2BPHmsNA2hM33HBD8XvB6NGj02WXXVYMm5QGxn5I6d3n0Nf7oZBSSj17rQcA4NTlPTcAQFbEDQCQFXEDAGRF3AAAWRE3AEBWxA0AkBVxAwBkRdwAAFkRNwBAVsQNAJAVcQMAZEXcAABZ+X/IrXb2xfiKuwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "map_df.boxplot(vert=False)" ] }, { "cell_type": "markdown", "metadata": { "id": "sQIewitkvokZ" }, "source": [ "### Solution #1: Fisher-Jenks algorithm\n", "\n", "Because Colab's standard collection of libraries does not include the `jenkspy`, we need to install it.\n", "\n", "Then change the `folium.Choroplet()` call to include the Fisher-Jenks algorithm and redraw the map." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "niqUerl1v5f9", "outputId": "291aa52e-2693-4a3c-e5f8-655270993707" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting jenkspy\n", " Downloading jenkspy-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (611 kB)\n", "\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/611.3 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[91m━━━━━━\u001b[0m\u001b[90m╺\u001b[0m\u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m92.2/611.3 kB\u001b[0m \u001b[31m2.6 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\r\u001b[2K \u001b[91m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[91m╸\u001b[0m\u001b[90m━\u001b[0m \u001b[32m593.9/611.3 kB\u001b[0m \u001b[31m8.9 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m611.3/611.3 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from jenkspy) (1.25.2)\n", "Installing collected packages: jenkspy\n", "Successfully installed jenkspy-0.4.1\n" ] } ], "source": [ "! pip install jenkspy" ] }, { "cell_type": "markdown", "metadata": { "id": "0qOZMAWtxIei" }, "source": [ "Now that the `jenkspy` library is installed, we can pass the parameter to Folium and redraw our map." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 808 }, "id": "XYMMxOy6xXjy", "outputId": "2296fbc9-d4dc-4f53-ee49-3736ce2025d7" }, "outputs": [], "source": [ " baseMap = initMap()\n", " # we need to initialize the map again; if we don't, it will add our new cholopleth map to the existing map\n", " # alternately, we could create a new map (m2 = ...)\n", "\n", "folium.Choropleth(\n", " geo_data = counties,\n", " data = map_df,\n", " columns = ['FIPS','count'],\n", " key_on = 'feature.properties.FIPS',\n", " bins = 9,\n", " fill_color='OrRd',\n", " fill_opacity=0.8,\n", " line_opacity=0.2,\n", " nan_fill_color = 'grey',\n", " legend_name='Number of Fatal Police Shootings (2015-present)',\n", " use_jenks = True, # <-- this is the new parameter we're passing to Folium\n", " ).add_to(baseMap)\n", "\n", "baseMap # this displays the map\n" ] }, { "cell_type": "markdown", "metadata": { "id": "YsiIFrdQzZy9" }, "source": [ "### Solution #2: Create a scale variable\n" ] }, { "cell_type": "markdown", "metadata": { "id": "ifDcPiFx3xdG" }, "source": [ "#### Create a Logarithm Scale-Value\n", "\n", "1. Import numpy\n", "2. Add a `MapScale` column to the **map_df** with data to use for the colors/scale on the map.\n", "\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "id": "5QAdXSN3--md" }, "outputs": [], "source": [ "import numpy as np\n", "map_df['MapScale'] = map_df['count'].apply(lambda x: np.log10(x) if x>0 else 0)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "gHQqHgOo_LH3" }, "source": [ "Remove the `use_jenks` parameter and change the column of data we want to use for the scale, then redraw the map." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 808 }, "id": "uMZsKBeR_aMX", "outputId": "1a357d72-d78f-46da-af84-f8c736c27d05" }, "outputs": [], "source": [ " baseMap = initMap()\n", " # we need to initialize the map again; if we don't, it will add our new cholopleth map to the existing map\n", " # alternately, we could create a new map (m2 = ...)\n", "folium.Choropleth(\n", " geo_data = counties,\n", " data = map_df,\n", " columns = ['FIPS','MapScale'], # <== change the column to use for map colors\n", " key_on = 'feature.properties.FIPS',\n", " bins = 9,\n", " fill_color='OrRd',\n", " fill_opacity=0.8,\n", " line_opacity=0.2,\n", " nan_fill_color = 'grey',\n", " legend_name='Number of Fatal Police Shootings (2015-present) (log scale)'\n", " ).add_to(baseMap)\n", "\n", "baseMap # this displays the map\n" ] }, { "cell_type": "markdown", "metadata": { "id": "3QExswDFqIs1" }, "source": [ "Redraw the map with the code to diplay the labels on the scale with non-log values." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 808 }, "id": "hgn7IOZStBKh", "outputId": "9fa6e595-6bb1-40de-fdb9-995b9659f7c4" }, "outputs": [], "source": [ "baseMap = initMap()\n", "\n", "cp = folium.Choropleth( #<== cp is the variable that has been added\n", " geo_data = counties,\n", " data = map_df,\n", " columns = ['FIPS','MapScale'],\n", " key_on = 'feature.properties.FIPS',\n", " bins = 9,\n", " fill_color='OrRd',\n", " fill_opacity=0.8,\n", " line_opacity=0.2,\n", " nan_fill_color = 'grey',\n", " legend_name='Number of Fatal Police Shootings (2015-present) (log scale)'\n", " ).add_to(baseMap)\n", "\n", "from branca.element import Element\n", "e = Element(\"\"\"\n", " var ticks = document.querySelectorAll('div.legend g.tick text')\n", " for(var i = 0; i < ticks.length; i++) {\n", " var value = parseFloat(ticks[i].textContent.replace(',', ''))\n", " var newvalue = Math.pow(10.0, value).toFixed(0).toString()\n", " ticks[i].textContent = newvalue\n", " }\n", "\"\"\")\n", "colormap = cp.color_scale # this finds the color scale in the cp variable\n", "html = colormap.get_root()\n", "html.script.get_root().render()\n", "html.script.add_child(e)\n", "\n", "baseMap\n" ] }, { "cell_type": "markdown", "metadata": { "id": "izTnzj1CyMO6" }, "source": [ "## Normalizing the Data\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "_TNUbR3O6Pnz" }, "source": [ "### Get County Population Data\n", "\n", "Get the data from the census bureau and examine it.\n", "\n", "(If the Github repo doesn't work, swap the lines that are commented (`#`) out.)\n", "\n" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "6nWfNTKtDmLz", "outputId": "2e733c1c-2e40-451c-b2f8-9b512f41f4b9" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
STATECOUNTYPOPESTIMATE2019
0104903185
11155869
213223234
31524686
41722394
\n", "
" ], "text/plain": [ " STATE COUNTY POPESTIMATE2019\n", "0 1 0 4903185\n", "1 1 1 55869\n", "2 1 3 223234\n", "3 1 5 24686\n", "4 1 7 22394" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "url = 'https://www2.census.gov/programs-surveys/popest/datasets/2010-2019/counties/totals/co-est2019-alldata.csv'\n", "#url = 'https://github.com/programminghistorian/jekyll/blob/gh-pages/assets/choropleth-maps-python-folium/co-est2019-alldata.csv'\n", "\n", "pop_df = pd.read_csv(url,\n", " usecols = ['STATE','COUNTY','POPESTIMATE2019'],\n", " encoding = \"ISO-8859-1\")\n", "pop_df.head()" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "l5kZmPbsD8oe", "outputId": "3613ba43-ed85-4778-f429-14fd34673f21" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 3193 entries, 0 to 3192\n", "Data columns (total 3 columns):\n", " # Column Non-Null Count Dtype\n", "--- ------ -------------- -----\n", " 0 STATE 3193 non-null int64\n", " 1 COUNTY 3193 non-null int64\n", " 2 POPESTIMATE2019 3193 non-null int64\n", "dtypes: int64(3)\n", "memory usage: 75.0 KB\n" ] } ], "source": [ "pop_df.info()" ] }, { "cell_type": "markdown", "metadata": { "id": "iPF1PkYZYMww" }, "source": [ "### Prepare the data" ] }, { "cell_type": "markdown", "metadata": { "id": "M0hwhZrDiJsH" }, "source": [ "Create a `FIPS` column by converting integers into strings and adding leading zeros.\n", "\n", "Then reexamine the data." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "EpxwW61FiVtl", "outputId": "aebdef80-9e09-4c08-fcae-3860a08d54c9" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
STATECOUNTYPOPESTIMATE2019FIPS
001000490318501000
1010015586901001
20100322323401003
3010052468601005
4010072239401007
\n", "
" ], "text/plain": [ " STATE COUNTY POPESTIMATE2019 FIPS\n", "0 01 000 4903185 01000\n", "1 01 001 55869 01001\n", "2 01 003 223234 01003\n", "3 01 005 24686 01005\n", "4 01 007 22394 01007" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pop_df['STATE'] = pop_df['STATE'].astype(str).str.zfill(2) # convert to string, and add leading zeros\n", "pop_df['COUNTY'] = pop_df['COUNTY'].astype(str).str.zfill(3)\n", "pop_df['FIPS'] = pop_df['STATE'] + pop_df['COUNTY'] # combine the state and county fields to create a FIPS\n", "pop_df.head()\n" ] }, { "cell_type": "markdown", "metadata": { "id": "0vcmgNXCiYF0" }, "source": [ "### Add population data to the **map_df** dataframe.\n", "\n", "And then re-examine the data." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "WoeHhmb1j3CQ", "outputId": "d469311f-a2a1-474f-e426-07eea356da0b" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FIPScountMapScaleSTATECOUNTYPOPESTIMATE2019
0060373412.5327540603710039107.0
1040132242.350248040134485414.0
2482011392.143015482014713325.0
3060711142.056905060712180085.0
4320031022.008600320032266715.0
\n", "
" ], "text/plain": [ " FIPS count MapScale STATE COUNTY POPESTIMATE2019\n", "0 06037 341 2.532754 06 037 10039107.0\n", "1 04013 224 2.350248 04 013 4485414.0\n", "2 48201 139 2.143015 48 201 4713325.0\n", "3 06071 114 2.056905 06 071 2180085.0\n", "4 32003 102 2.008600 32 003 2266715.0" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "map_df = map_df.merge(pop_df, on = 'FIPS', how = 'left')\n", "map_df.head()" ] }, { "cell_type": "markdown", "metadata": { "id": "RgyHyKOeGcf8" }, "source": [ "Calculate the number of police killings per 100K population." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "qT1Cz_u-m_wX", "outputId": "8f943bc6-3a79-456b-db87-3e57871fe6ef" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FIPScountMapScaleSTATECOUNTYPOPESTIMATE2019count_per_100K
0060373412.5327540603710039107.03.396716
1040132242.350248040134485414.04.993965
2482011392.143015482014713325.02.949086
3060711142.056905060712180085.05.229154
4320031022.008600320032266715.04.499904
\n", "
" ], "text/plain": [ " FIPS count MapScale STATE COUNTY POPESTIMATE2019 count_per_100K\n", "0 06037 341 2.532754 06 037 10039107.0 3.396716\n", "1 04013 224 2.350248 04 013 4485414.0 4.993965\n", "2 48201 139 2.143015 48 201 4713325.0 2.949086\n", "3 06071 114 2.056905 06 071 2180085.0 5.229154\n", "4 32003 102 2.008600 32 003 2266715.0 4.499904" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "map_df['count_per_100K'] = map_df['count'] / (map_df['POPESTIMATE2019']/100000)\n", "map_df.head()" ] }, { "cell_type": "markdown", "metadata": { "id": "StA_0Ai_nXJD" }, "source": [ "## Draw the Normalized Map" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 808 }, "id": "F01L9VgOncUg", "outputId": "f33c5406-d445-49e1-8fa2-9110b3d535f4" }, "outputs": [], "source": [ "baseMap = initMap()\n", "\n", "cp = folium.Choropleth(\n", " geo_data = counties,\n", " data = map_df,\n", " columns = ['FIPS','count_per_100K'],\n", " key_on = 'feature.properties.FIPS',\n", " bins = 9,\n", " fill_color='OrRd',\n", " fill_opacity=0.8,\n", " line_opacity=0.2,\n", " nan_fill_color = 'grey',\n", " legend_name='Number of Fatal Police Shootings (2015-present) (per 100K population)'\n", " ).add_to(baseMap)\n", "\n", "baseMap" ] }, { "cell_type": "markdown", "metadata": { "id": "bONFQC7vnt5T" }, "source": [ "### Uneven Data, redux\n", "\n", "Examine the `count_per_100K` variable and visualize it.\n" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BEofLQWZoBuA", "outputId": "74ddaec3-0f89-45eb-8cb9-654f2be98955" }, "outputs": [ { "data": { "text/plain": [ "count 1592.000000\n", "mean 5.478407\n", "std 6.133838\n", "min 0.179746\n", "25% 2.160387\n", "50% 3.797904\n", "75% 6.626440\n", "max 71.123755\n", "Name: count_per_100K, dtype: float64" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "map_df['count_per_100K'].describe()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 448 }, "id": "skfU7EXFH5zg", "outputId": "8c40e8f7-dfc0-4abd-bc23-248d30ac09ed" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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RUVFKSQkREePHlV+fr5CQ0PVpUsXRUdHKzc3V2amkydP6rvvvvOeU1RUpKioKPXu3Vtz5szxlm3atElHjhxRWlqajh49qtzcXPXo0UMtW7bU2bNntXXrVp04cULZ2dkyMzVt2lTdunVTUlKSDh8+rIULF+ro0aPy+Xy6++671apVK8XGxuqGG25Qnz599Oabb2rfvn3y+Xzq06eP4uLiNGDAAOXm5upHP/qRvv76a7Vv316LFi1SRkaGjh49qtOnTys6Olo33HCD+vXrp82bN5dZPmDAABUVFem1117T//zP/0iSxowZowkTJujTTz/V8ePH1bp1aw0YMEBBQUEqKirShg0btG7dOh0+fFjt2rXT3XffrQEDBmjz5s0B4yXpo48+0jvvvKOsrCy1bt1a/fr182r3by8zM1MXLlwIWF4TnwObNm0qU0/pZf65qju+JupLTU3Vxo0bFRkZqcGDB9fYtiubs7x+Klpe22rr2F9uLVXZB3W1r2paZX3UZY/1Zv/aNebAgQMmyTIyMuq6lEs6duyYPfTQQ9axY0fz+Xw2adKkcse9//77dsstt1hoaKjdcssttmzZsjJj3njjDUtISLCwsDDr0aOHbdy4MWD9oEGDymz/1VdftdDQUHvvvfeqVO+3335rkuzbb7+t0viqyM/Pt9mzZ5sk27ZtW5Wfl/nNeYt/erllfnO+0nG7zuyyrou62q4zu66ozqrOV135+fn2wQcfWH5+/hVva+nSpdaiRQuTdFUet99+uyUkJFy1+Uo+QkNDqzw2ODi43OVRUVHm8/ku+fyEhAR76qmnLCYmptz1jRo1Cvg4JibGwsPDL7m90vsuISHBli5desWfA6W3GxMTY9HR0eXOVd746OjoMr3WRG0V1VdT267unLV1DC63ntqe90pqqcmaa/JrXnVV1sfVOi7l9X815q7q929C32UqLi62goKCSsccOHDAJk6caG+99Zbddttt5Ya+zZs3W1BQkL388su2Z88ee/nlly04ONjS09O9MYsXL7aQkBBbsGCB7d692yZNmmSRkZF26NAhb0zp0Pfcc89ZeHi4rVixoso9Efrqb+hbunRpnYSviIiISj+u6iMkJKTc5UFBQSbJunXrZlOnTi0TRgYNGuR9/vgfzZo1swULFlj37t0DaurevbstWLDAhg8fHjA+PDzcZs2aZcnJyQHLJ02a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smPHjoBfv6Snp6tJkyZq27atOnfurLCwMB0+fFg33XRTwCMuLq5a81RX3759y5wGX7Nmjfr16yfp+3579uxZZszatWu9MSXddtttWrdunT7++GPdf//9V/W6CtSOoKAgzZkzJ+Dzt6ZZBdf0RUREeNf0rVixQqdOnapw7OnTpyvcfqNGjXTy5EkdPnw44HPSv7xp06aaNm2abr75Zm/d6tWr1a5dOz3xxBNavny5dwawWbNmWrJkia677jqdPHlSYWFhOnnypJo3b66FCxdq7NixXo0FBQU6fvy4Xn31VQ0YMMDrQZImTJig7du36/rrr1dx8fcXnq5YsUL9+vXTG2+84W03NzdXubm5evHFF73r+/Lz8xUSEqLly5erT58+6tixo1asWOFdinH69Gm1bNlS+/btU1ZWltLS0nTfffdp+fLlmjVrVrXfnysoKEizZ8/W8uXLdd999yktLU05OTl67LHHtHz5ci1fvlyPPvqocnJylJaWpnHjxnl1jxs37pLjr6S28upLT09Xbm6u0tPTr3jb1dknWVlZ2rJli6Kjo3Xy5Em1bNlSW7ZsqZFjUJ16xo0bp717916VeS9VS8l9U7qW0NDQKo2r7+/XV1m/48aN08WLF5WTk+O9Fq5Wj1U9Dld1/1Y3TU6fPt1atGhhb731ln311VeWlpZmv/vd7yw7O9tat25t48aNs8zMTFu3bp3deOONAWfxfvOb31hERIQtX77c9uzZY4899phFRUVV60xfQUGBhYeH24svvmgnTpyw8+cvfWYmOTnZmjRpYg899JDt2rXLVq5cabGxsQF3v/7iF7+wli1b2qJFi+yrr76yzz//3ObNm2eLFi0ys8s/05eRkWEZGRnWs2dPe/jhhy0jI8N27fr7WalPPvnEgoKCbObMmbZnzx6bOXNmhW/ZsnDhQtu9e7dNnjzZIiMj7eDBg96Y0mcSv/jiC4uJibF//Md/DLhLuTKc6aufZ/r8eJ++8h9X+j59iYmJNfo+ff7tld53iYmJV+19+vxzVTS+dK81UVtF9dXUtqs7Z20dg8utp768T195tdRkzfXtffoqey3UxnGp6vv01fTctXb37i9/+UsFBwfrueee07Fjx9S6dWuNHz9eERERWr16tSZNmqTbb79dERERGjdunPe7dEl65JFHtGPHDv34xz9WcHCwnnzySQ0ePLha8wcH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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "map_df.boxplot(column=['count_per_100K'],vert=False)" ] }, { "cell_type": "markdown", "metadata": { "id": "RdPllkfIoamc" }, "source": [ "### Convert the `count_per_100K` into log values.\n", "\n", "Then re-draw the boxplot." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 448 }, "id": "cavVy8ulIQOA", "outputId": "4ffb28c8-7f53-4051-d825-b39d025b4435" }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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VlaWZsyY0STbN2Ty5MmpuLi41vvX96u+fdY3to+vv3Tp0hQRaenSpY0y3sPdzp07069//eu0c+fO5h5KQb34p/dS72/MSi/+6b0m2d+BzusfN/4xnfHTM9IfN/6xQCNrHE09n3s6Wo7Z5tDQ3M6YMSP16NFjr+fihq4PM2bMSF26dKlzfu7cuXPWezR0nt9zvHtbt3PnznXG0pjXspT2//qd/SO8Xr16xYMPPhjvv/9+zWsffPBB/PznP48TTzwx9+326be//W1cfvnlcemll8azzz4bS5cujVtvvTV27tzZqPs51M2cOTMuvfTS6N+/fyxevDi2bNkSixcvjv79+8ell14aM2fOLOj2DZkyZUrcfvvt0bFjx/j6178eERG9e/euWX7hhRfGyJEjIyKiU6dOtfZZPbZOnTpFUVFRjBw5Mv7rv/6rzvpPPvnkQY0R4GhUfY795Cc/GREf3rnZ8/w/ZcqUfV4fqpevX78+hg4dGk888UQ88cQTMXTo0NiwYUN86Utf2u/36NSpU0RErfN8UVFRrevCnteEj68bEbFhw4ZYv359fP/732/0a1m2nCqbOHFiGjt2bOrfv3+6//77a15/4IEHUv/+/dPYsWNr7kA99thj6ZxzzkkdOnRIxx9/fBo1alRatWpVzTZr1qxJEZF+/vOfpyFDhqRWrVql008/Pc2bN69mnX/6p39Kw4cPb3BcjzzySBowYEBq1apV6tixY7r44otrlt13331pwIABqV27dqlr167pb//2b9M777xTs7y+O1BPP/10GjZsWGrdunXq2bNnuuqqq9LWrVtzpqrR7kBVVVWlsrKyNGbMmLRr165ay3bt2pXGjBmT+vTpk6qqqgqyfUN27NiRiouLU9euXdMHH3yQysrK0ujRo1NZWVkaOXJk6tChQyouLk7vv/9+GjNmTM3yPn36pB07dtRaf88xVo+tevkJJ5zgDtQejpa/zbsD1bjcgToy7W1u9zz/P/fcc7XOobt27UqjR49OxcXFafTo0fVeH6qXt27dus461cvbtGmTjjnmmAbfY9SoUal37971nuf79OlTc13o3bt3Gj16dJ11d+7cmY499tjUpk2bNGrUqFrXrca4lu1pf6/fB/QM1Je//OW49957Y/z48RER8ZOf/CS+8pWv1PxsNCJi27Ztcd1110X//v1j27Zt8a1vfSsuvvjiWLZsWbRo8dGNr8mTJ8ePfvSjOP3002Pq1KnxxS9+MdasWRMdO3aMbt26xX//93/HSy+9FGeccUa9Y5k9e3ZccsklcdNNN8V9990XO3fujNmzZ9cs37lzZ9xyyy3Rt2/fWL9+fVx77bVxxRVXxKOPPlrv+7344ovx+c9/Pm655ZaYPn16bNiwISZNmhSTJk2Ke++9d69zsmPHjtixY0fN7ysqKiIiorKyMiorKxue1L1YsGBBrF27Nu67777YtWtXzc+xq02ePDnOPffcmDdvXpx33nmNvn1D7rrrrqiqqoqbb745Fi1aFGvXro3rrrsuZs2aFffee2/88pe/jGnTpsXdd99ds69rr702Zs2aFXfddVet9T8+xo+vHxHxylvvRYvX380e55Gmqqoq1m2N+P0bf4ni4iP3UcbVG7ZFRMS293cc1PfR/qreR+6+qqqqav63KcZ5oLa9/+E56pW3NteMuakcLcdsc9jb3D6/+KlYu3Zt3Dz1x7HynQ+vSVv3+F668MILY9asWXHhhRfWe32oXl5VVRXf+MY36qwzZcqUmnNzQ+9x0kknxezZs+P++++v9zx/zTXX1LxX9TVhz3UXLFhQ85OvESNGxOzZs2tdtw72Wran/f0ePqCjeMKECfHNb34z1q5dG0VFRfH000/Hgw8+WCugvvSlL9XaZvr06dGlS5dYvnx5rRiaNGlSzbrTpk2Lxx9/PKZPnx5TpkyJq666KhYtWhT9+/eP3r17x+DBg2PEiBExfvz4aNWqVURE3HrrrXH55ZfHzTffXPOen/70p2u+/spXvlLz9UknnRR33nlnDBo0KLZu3Rrt2rWr82e7/fbbY9y4cXHNNddERMQpp5wSd955Z5x33nkxbdq0aN26db1z8v3vf7/WGKrNmTMn2rRps7epbNDChQsjIuJPf/pTvPtu3XCoPqAee+yx2LZtW6Nv35DqH621atUqHnvssYiIePXVVyMi4u23347PfOYzMW3atHjyySfjhBNOiIiIlStX1tq2ev2Pj7F6bNXrR0Rc96sXo9Wij358fHQrjnjx+eYeRJOYNX9xvN256fY3d+7crPXfrHozIiKefurpWFO8phBDahTPb4iIKI7rH3qxmUZw9ByzTa/u3G5b/nRERPzfRVui8i9/joiI2fMWx6aN6yPio3PrypUr672psOe5t75ryJ6P8jT0Hq+88kq971Pfeb766z3Xrb6W7bl8z+vWwV7L9rR9+/b9Wu+AAqpTp04xatSo+NnPfhYppRg1alTNzyurrV69Ov75n/85lixZEhs3bozdu3dHRMQbb7xRK6CGDBny0WCKi2PgwIHx8ssvR0RE27ZtY/bs2bF69eqYN29eLFmyJK6//vr4t3/7t1i8eHG0adMmli1bFldeeeVex1peXh7f+c53YtmyZfGXv/yl1jhOP/30OusvXbo0Vq1aFQ888EDNayml2L17d6xZsyZOO+20evfzzW9+M6677rqa31dUVESvXr1ixIgRUVpautfxNaRt27YxderU6NmzZ5x99tl1li9ZsiQiPvw5cX3VfbDbN2TVqlXx6KOPxo4dO2LkyJExderUOPXUUyMiolu3bvHLX/4yIiLOP//8moA65ZRTal579NFHa9b/+Birx1a9fkTE1P/dP04746NAPlpVVVXFkiVLYvDgwUf03+ZXb9gW1z/0YowePiTO6n1cwfdXWVkZc+fOjQsvvDBKSkr2e7uX//Jy3PP4PXHO0HPitOPrP0ccCrq9vinuW/Vc/PDS/nFy57ZNuu+j5ZhtDnub2+cXV8WVv7k9vjusfZS07B/jfhYx6nNDYsiggRER8frrr0fEh+fYiy66qM77Vi+PqHt+jvjoHL0/79G3b9+YM2fOfp3nq7/ec93qa9mey/e8bh3stWxP1T9BalDOzwWrn4FKKaVZs2alsrKyVFZWlmbPnp1SSrWegTrttNPSiBEj0m9/+9u0fPny9NJLL6WISA8//HBK6aNnoBYsWFBrH3/zN3+TvvzlL+91DK+99loqLi5OP/nJT1JKKR1//PE1X3/c1q1bU6dOndK4cePSwoUL08svv5z+53/+J0VEKi8vTynVfQaqX79+6aqrrkorV66s82vHjh37PVeegfIMVCEdLc+TeAaqcXkG6sjkGajmeQbqgAOqqqoq9ejRI/Xo0aNmwNUBtXHjxhQRaeHChTXbLlq0qN6Auu2222rWqaysTL169ar12sft3r07lZaWprvuuiullNLw4cPT+PHj6133+eefTxGR3njjjZrX7rvvvn0G1Lhx49L555+fMy31asyPMZgxY0YqKipKY8aMSc8880yqqKhIzzzzTBozZkwqKipq8J9vHuz2DZk8eXKKiNS1a9f0ta99LUVE6t27d80/Mf3rv/7rNHLk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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "map_df['MapScale'] = np.log10(map_df['count_per_100K'])\n", "map_df.boxplot(column=['MapScale'],vert=False)" ] }, { "cell_type": "markdown", "metadata": { "id": "qnklsEt5IiUJ" }, "source": [ "### Redraw the map\n", "\n", "Note that the code to display the scale indexes as non-log values has been included." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 808 }, "id": "OH7y0GKeZ4El", "outputId": "602b5b8c-2da3-46fd-e357-38f1df295dd8" }, "outputs": [], "source": [ "baseMap = initMap()\n", "\n", "cp = folium.Choropleth(\n", " geo_data = counties,\n", " data = map_df,\n", " columns = ['FIPS','MapScale'],\n", " key_on = 'feature.properties.FIPS',\n", " bins = 9,\n", " fill_color='OrRd',\n", " fill_opacity=0.8,\n", " line_opacity=0.2,\n", " nan_fill_color = 'grey',\n", " legend_name='Number of Fatal Police Shootings per 100K population (2015-present) (log scale)'\n", " ).add_to(baseMap)\n", "\n", "from branca.element import Element\n", "e = Element(\"\"\"\n", " var ticks = document.querySelectorAll('div.legend g.tick text')\n", " for(var i = 0; i < ticks.length; i++) {\n", " var value = parseFloat(ticks[i].textContent.replace(',', ''))\n", " var newvalue = Math.pow(10.0, value).toFixed(0).toString()\n", " ticks[i].textContent = newvalue\n", " }\n", "\"\"\")\n", "colormap = cp.color_scale # this finds the color scale in the cp variable\n", "html = colormap.get_root()\n", "html.script.get_root().render()\n", "html.script.add_child(e)\n", "\n", "baseMap" ] }, { "cell_type": "markdown", "metadata": { "id": "8a4xCq4w4hB7" }, "source": [ "## Improving Folium Maps" ] }, { "cell_type": "markdown", "metadata": { "id": "z-Qj1uH_Cgfz" }, "source": [ "\n", "### Add a Floating Information Box\n", "\n", "This code is deceiptively simple. See the article for a description of what's going on.\n", "\n", "To simplify this, the code to change the map scale to non-log values has been removed." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 808 }, "id": "SRAiQLtoRTZz", "outputId": "f943b993-811a-4267-930e-5a4c031d8ab1" }, "outputs": [], "source": [ "baseMap = initMap()\n", "\n", "cp = folium.Choropleth( #<== cp is the variable that has been added\n", " geo_data = counties,\n", " data = map_df,\n", " columns = ['FIPS','MapScale'],\n", " key_on = 'feature.properties.FIPS',\n", " bins = 9,\n", " fill_color='OrRd',\n", " fill_opacity=0.8,\n", " line_opacity=0.2,\n", " nan_fill_color = 'grey',\n", " legend_name='Number of Fatal Police Shootings (2015-present) (log-scale)'\n", " ).add_to(baseMap)\n", "\n", "map_data_lookup = map_df.set_index('FIPS')\n", "\n", "for row in cp.geojson.data['features']:\n", " try:\n", " row['properties']['count'] = f\"{(map_data_lookup.loc[row['properties']['FIPS'],'count']):.0f}\"\n", " except KeyError:\n", " row['properties']['count'] = 'No police killings reported'\n", "\n", "folium.GeoJsonTooltip(['NAME','count'],aliases=['County:','N killed by Police:']).add_to(cp.geojson)\n", "\n", "baseMap" ] }, { "cell_type": "markdown", "metadata": { "id": "UfT6I9uEayRJ" }, "source": [ "A more complicated example of the floating information box displaying multiple variables." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 808 }, "id": "O4WVdS7aa__V", "outputId": "0dbeb1fd-5e81-4525-f707-71fe8808e86f" }, "outputs": [], "source": [ "baseMap = initMap()\n", "\n", "cp = folium.Choropleth(\n", " geo_data = counties,\n", " data = map_df,\n", " columns = ['FIPS','MapScale'],\n", " key_on = 'feature.properties.FIPS',\n", " bins = 9,\n", " fill_color='OrRd',\n", " fill_opacity=0.8,\n", " line_opacity=0.2,\n", " nan_fill_color = 'grey',\n", " legend_name='Number of Fatal Police Shootings per 100K population (2015-present) (log scale)'\n", " ).add_to(baseMap)\n", "\n", "map_data_lookup = map_df.set_index('FIPS')\n", "\n", "for row in cp.geojson.data['features']:\n", " try:\n", " row['properties']['count'] = f\"{(map_data_lookup.loc[row['properties']['FIPS'],'count']):.0f}\"\n", " except KeyError:\n", " row['properties']['count'] = 'No police killings reported'\n", " try:\n", " row['properties']['count_per_100K'] = f\"{map_data_lookup.loc[row['properties']['FIPS'],'count_per_100K']:.2f}\" # present the data with 2 decimal places\n", " except KeyError:\n", " row['properties']['count_per_100K'] = 'No data'\n", " try:\n", " row['properties']['population'] = f\"{map_data_lookup.loc[row['properties']['FIPS'],'POPESTIMATE2019']:,.0f}\"\n", " except KeyError:\n", " row['properties']['population'] = 'No data'\n", "\n", "folium.GeoJsonTooltip(['NAME','population','count','count_per_100K'],\n", " aliases=['county:','population:','count:','per100K:']\n", " ).add_to(cp.geojson)\n", "\n", "baseMap" ] }, { "cell_type": "markdown", "metadata": { "id": "fnzDH8oAOt9w" }, "source": [ "### Add a Mini Map\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 808 }, "id": "0IO-HOplPYT-", "outputId": "5a2dc405-83a5-4d15-ec3d-387c12972ed4" }, "outputs": [], "source": [ "from folium import plugins\n", "minimap = plugins.MiniMap()\n", "baseMap.add_child(minimap)\n", "\n", "baseMap" ] }, { "cell_type": "markdown", "metadata": { "id": "OGRquZWDjvzh" }, "source": [ "### Add a Title\n", "Adding a title to the Folium map.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 808 }, "id": "qYt6mmVkbfFH", "outputId": "28d6aa05-cfa1-4419-ab8b-9ede352bedf0" }, "outputs": [], "source": [ "baseMap = initMap()\n", "\n", "titleText = \"\"\"Number of people killed by police in each county\"\"\"\n", "title_html = '''\n", "

{}

\n", " '''.format(titleText)\n", "baseMap.get_root().html.add_child(folium.Element(title_html))\n", "\n", "cp = folium.Choropleth(\n", " geo_data = counties,\n", " data = map_df,\n", " columns = ['FIPS','MapScale'],\n", " key_on = 'feature.properties.FIPS',\n", " bins = 9,\n", " fill_color='OrRd',\n", " fill_opacity=0.8,\n", " line_opacity=0.2,\n", " nan_fill_color = 'grey',\n", " legend_name='Number of Fatal Police Shootings (2015-present) (log scale)'\n", " ).add_to(baseMap)\n", "\n", "baseMap" ] }, { "cell_type": "markdown", "metadata": { "id": "s5-NzNM2a00-" }, "source": [ "## Saving Maps\n", "\n", "Save the map as a HTML file." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "id": "QP7-Ir_xbAIv" }, "outputs": [], "source": [ "baseMap.save('PoliceKillingsOfCivilians.html')" ] } ], "metadata": { "colab": { "include_colab_link": true, "provenance": [] }, "kernelspec": { "display_name": "base", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.2" } }, "nbformat": 4, "nbformat_minor": 0 }