How to use cartopy to create colored US states










1















I need to create a map where states have different colors depending on a piece of data about that state. I found an example of a US map in the cartopy gallery, but it didn't demonstrate how to refer to the states and access their attributes, and there little else out there:



From the example, I've simplified their code to the following, and would appreciate any help with modifying this to get the face colors of the states to be set according to the magnitude of popdensity for the state.



import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader

fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.LambertConformal())

ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())

shapename = 'admin_1_states_provinces_lakes_shp'
states_shp = shpreader.natural_earth(resolution='110m',
category='cultural', name=shapename)

popdensity =
'New Jersey': 438.00,
'Rhode Island': 387.35,
'Massachusetts': 312.68,
'Connecticut': 271.40,
'Maryland': 209.23,
'New York': 155.18,
'Delaware': 154.87,
'Florida': 114.43,
'Ohio': 107.05,
'Pennsylvania': 105.80,
'Illinois': 86.27,
'California': 83.85,
'Virginia': 69.03,
'Michigan': 67.55,
'Indiana': 65.46,
'North Carolina': 63.80,
'Georgia': 54.59,
'Tennessee': 53.29,
'New Hampshire': 53.20,
'South Carolina': 51.45,
'Louisiana': 39.61,
'Kentucky': 39.28,
'Wisconsin': 38.13,
'Washington': 34.20,
'Alabama': 33.84,
'Missouri': 31.36,
'Texas': 30.75,
'West Virginia': 29.00,
'Vermont': 25.41,
'Minnesota': 23.86,
'Mississippi': 23.42,
'Iowa': 20.22,
'Arkansas': 19.82,
'Oklahoma': 19.40,
'Arizona': 17.43,
'Colorado': 16.01,
'Maine': 15.95,
'Oregon': 13.76,
'Kansas': 12.69,
'Utah': 10.50,
'Nebraska': 8.60,
'Nevada': 7.03,
'Idaho': 6.04,
'New Mexico': 5.79,
'South Dakota': 3.84,
'North Dakota': 3.59,
'Montana': 2.39,
'Wyoming': 1.96

ax.background_patch.set_visible(False)
ax.outline_patch.set_visible(False)

ax.set_title('State Population Density')

for state in shpreader.Reader(states_shp).geometries():

### I need to replace the following code with code that sets the
### facecolor as a gradient based on the population density above
facecolor = [0.9375, 0.9375, 0.859375]
edgecolor = 'black'

ax.add_geometries([state], ccrs.PlateCarree(),
facecolor=facecolor, edgecolor=edgecolor)

plt.show()









share|improve this question


























    1















    I need to create a map where states have different colors depending on a piece of data about that state. I found an example of a US map in the cartopy gallery, but it didn't demonstrate how to refer to the states and access their attributes, and there little else out there:



    From the example, I've simplified their code to the following, and would appreciate any help with modifying this to get the face colors of the states to be set according to the magnitude of popdensity for the state.



    import matplotlib.pyplot as plt
    import cartopy.crs as ccrs
    import cartopy.io.shapereader as shpreader

    fig = plt.figure()
    ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.LambertConformal())

    ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())

    shapename = 'admin_1_states_provinces_lakes_shp'
    states_shp = shpreader.natural_earth(resolution='110m',
    category='cultural', name=shapename)

    popdensity =
    'New Jersey': 438.00,
    'Rhode Island': 387.35,
    'Massachusetts': 312.68,
    'Connecticut': 271.40,
    'Maryland': 209.23,
    'New York': 155.18,
    'Delaware': 154.87,
    'Florida': 114.43,
    'Ohio': 107.05,
    'Pennsylvania': 105.80,
    'Illinois': 86.27,
    'California': 83.85,
    'Virginia': 69.03,
    'Michigan': 67.55,
    'Indiana': 65.46,
    'North Carolina': 63.80,
    'Georgia': 54.59,
    'Tennessee': 53.29,
    'New Hampshire': 53.20,
    'South Carolina': 51.45,
    'Louisiana': 39.61,
    'Kentucky': 39.28,
    'Wisconsin': 38.13,
    'Washington': 34.20,
    'Alabama': 33.84,
    'Missouri': 31.36,
    'Texas': 30.75,
    'West Virginia': 29.00,
    'Vermont': 25.41,
    'Minnesota': 23.86,
    'Mississippi': 23.42,
    'Iowa': 20.22,
    'Arkansas': 19.82,
    'Oklahoma': 19.40,
    'Arizona': 17.43,
    'Colorado': 16.01,
    'Maine': 15.95,
    'Oregon': 13.76,
    'Kansas': 12.69,
    'Utah': 10.50,
    'Nebraska': 8.60,
    'Nevada': 7.03,
    'Idaho': 6.04,
    'New Mexico': 5.79,
    'South Dakota': 3.84,
    'North Dakota': 3.59,
    'Montana': 2.39,
    'Wyoming': 1.96

    ax.background_patch.set_visible(False)
    ax.outline_patch.set_visible(False)

    ax.set_title('State Population Density')

    for state in shpreader.Reader(states_shp).geometries():

    ### I need to replace the following code with code that sets the
    ### facecolor as a gradient based on the population density above
    facecolor = [0.9375, 0.9375, 0.859375]
    edgecolor = 'black'

    ax.add_geometries([state], ccrs.PlateCarree(),
    facecolor=facecolor, edgecolor=edgecolor)

    plt.show()









    share|improve this question
























      1












      1








      1








      I need to create a map where states have different colors depending on a piece of data about that state. I found an example of a US map in the cartopy gallery, but it didn't demonstrate how to refer to the states and access their attributes, and there little else out there:



      From the example, I've simplified their code to the following, and would appreciate any help with modifying this to get the face colors of the states to be set according to the magnitude of popdensity for the state.



      import matplotlib.pyplot as plt
      import cartopy.crs as ccrs
      import cartopy.io.shapereader as shpreader

      fig = plt.figure()
      ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.LambertConformal())

      ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())

      shapename = 'admin_1_states_provinces_lakes_shp'
      states_shp = shpreader.natural_earth(resolution='110m',
      category='cultural', name=shapename)

      popdensity =
      'New Jersey': 438.00,
      'Rhode Island': 387.35,
      'Massachusetts': 312.68,
      'Connecticut': 271.40,
      'Maryland': 209.23,
      'New York': 155.18,
      'Delaware': 154.87,
      'Florida': 114.43,
      'Ohio': 107.05,
      'Pennsylvania': 105.80,
      'Illinois': 86.27,
      'California': 83.85,
      'Virginia': 69.03,
      'Michigan': 67.55,
      'Indiana': 65.46,
      'North Carolina': 63.80,
      'Georgia': 54.59,
      'Tennessee': 53.29,
      'New Hampshire': 53.20,
      'South Carolina': 51.45,
      'Louisiana': 39.61,
      'Kentucky': 39.28,
      'Wisconsin': 38.13,
      'Washington': 34.20,
      'Alabama': 33.84,
      'Missouri': 31.36,
      'Texas': 30.75,
      'West Virginia': 29.00,
      'Vermont': 25.41,
      'Minnesota': 23.86,
      'Mississippi': 23.42,
      'Iowa': 20.22,
      'Arkansas': 19.82,
      'Oklahoma': 19.40,
      'Arizona': 17.43,
      'Colorado': 16.01,
      'Maine': 15.95,
      'Oregon': 13.76,
      'Kansas': 12.69,
      'Utah': 10.50,
      'Nebraska': 8.60,
      'Nevada': 7.03,
      'Idaho': 6.04,
      'New Mexico': 5.79,
      'South Dakota': 3.84,
      'North Dakota': 3.59,
      'Montana': 2.39,
      'Wyoming': 1.96

      ax.background_patch.set_visible(False)
      ax.outline_patch.set_visible(False)

      ax.set_title('State Population Density')

      for state in shpreader.Reader(states_shp).geometries():

      ### I need to replace the following code with code that sets the
      ### facecolor as a gradient based on the population density above
      facecolor = [0.9375, 0.9375, 0.859375]
      edgecolor = 'black'

      ax.add_geometries([state], ccrs.PlateCarree(),
      facecolor=facecolor, edgecolor=edgecolor)

      plt.show()









      share|improve this question














      I need to create a map where states have different colors depending on a piece of data about that state. I found an example of a US map in the cartopy gallery, but it didn't demonstrate how to refer to the states and access their attributes, and there little else out there:



      From the example, I've simplified their code to the following, and would appreciate any help with modifying this to get the face colors of the states to be set according to the magnitude of popdensity for the state.



      import matplotlib.pyplot as plt
      import cartopy.crs as ccrs
      import cartopy.io.shapereader as shpreader

      fig = plt.figure()
      ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.LambertConformal())

      ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())

      shapename = 'admin_1_states_provinces_lakes_shp'
      states_shp = shpreader.natural_earth(resolution='110m',
      category='cultural', name=shapename)

      popdensity =
      'New Jersey': 438.00,
      'Rhode Island': 387.35,
      'Massachusetts': 312.68,
      'Connecticut': 271.40,
      'Maryland': 209.23,
      'New York': 155.18,
      'Delaware': 154.87,
      'Florida': 114.43,
      'Ohio': 107.05,
      'Pennsylvania': 105.80,
      'Illinois': 86.27,
      'California': 83.85,
      'Virginia': 69.03,
      'Michigan': 67.55,
      'Indiana': 65.46,
      'North Carolina': 63.80,
      'Georgia': 54.59,
      'Tennessee': 53.29,
      'New Hampshire': 53.20,
      'South Carolina': 51.45,
      'Louisiana': 39.61,
      'Kentucky': 39.28,
      'Wisconsin': 38.13,
      'Washington': 34.20,
      'Alabama': 33.84,
      'Missouri': 31.36,
      'Texas': 30.75,
      'West Virginia': 29.00,
      'Vermont': 25.41,
      'Minnesota': 23.86,
      'Mississippi': 23.42,
      'Iowa': 20.22,
      'Arkansas': 19.82,
      'Oklahoma': 19.40,
      'Arizona': 17.43,
      'Colorado': 16.01,
      'Maine': 15.95,
      'Oregon': 13.76,
      'Kansas': 12.69,
      'Utah': 10.50,
      'Nebraska': 8.60,
      'Nevada': 7.03,
      'Idaho': 6.04,
      'New Mexico': 5.79,
      'South Dakota': 3.84,
      'North Dakota': 3.59,
      'Montana': 2.39,
      'Wyoming': 1.96

      ax.background_patch.set_visible(False)
      ax.outline_patch.set_visible(False)

      ax.set_title('State Population Density')

      for state in shpreader.Reader(states_shp).geometries():

      ### I need to replace the following code with code that sets the
      ### facecolor as a gradient based on the population density above
      facecolor = [0.9375, 0.9375, 0.859375]
      edgecolor = 'black'

      ax.add_geometries([state], ccrs.PlateCarree(),
      facecolor=facecolor, edgecolor=edgecolor)

      plt.show()






      cartopy






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 13 '18 at 22:42









      Emily BethEmily Beth

      155111




      155111






















          1 Answer
          1






          active

          oldest

          votes


















          2














          To have access to states' attributes, you need to iterate through .records() rather than .geometries(). Here is a working code based on yours. Read comments in the code's portions that I add / modified for clarification.



          import matplotlib.pyplot as plt
          import cartopy.crs as ccrs
          import cartopy.io.shapereader as shpreader

          fig = plt.figure()
          ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.LambertConformal())

          ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())

          shapename = 'admin_1_states_provinces_lakes_shp'
          states_shp = shpreader.natural_earth(resolution='110m',
          category='cultural', name=shapename)

          popdensity =
          'New Jersey': 438.00,
          'Rhode Island': 387.35,
          'Massachusetts': 312.68,
          'Connecticut': 271.40,
          'Maryland': 209.23,
          'New York': 155.18,
          'Delaware': 154.87,
          'Florida': 114.43,
          'Ohio': 107.05,
          'Pennsylvania': 105.80,
          'Illinois': 86.27,
          'California': 83.85,
          'Virginia': 69.03,
          'Michigan': 67.55,
          'Indiana': 65.46,
          'North Carolina': 63.80,
          'Georgia': 54.59,
          'Tennessee': 53.29,
          'New Hampshire': 53.20,
          'South Carolina': 51.45,
          'Louisiana': 39.61,
          'Kentucky': 39.28,
          'Wisconsin': 38.13,
          'Washington': 34.20,
          'Alabama': 33.84,
          'Missouri': 31.36,
          'Texas': 30.75,
          'West Virginia': 29.00,
          'Vermont': 25.41,
          'Minnesota': 23.86,
          'Mississippi': 23.42,
          'Iowa': 20.22,
          'Arkansas': 19.82,
          'Oklahoma': 19.40,
          'Arizona': 17.43,
          'Colorado': 16.01,
          'Maine': 15.95,
          'Oregon': 13.76,
          'Kansas': 12.69,
          'Utah': 10.50,
          'Nebraska': 8.60,
          'Nevada': 7.03,
          'Idaho': 6.04,
          'New Mexico': 5.79,
          'South Dakota': 3.84,
          'North Dakota': 3.59,
          'Montana': 2.39,
          'Wyoming': 1.96

          ax.background_patch.set_visible(False)
          ax.outline_patch.set_visible(False)

          ax.set_title('State Population Density')

          #for state in shpreader.Reader(states_shp).geometries():
          for astate in shpreader.Reader(states_shp).records():

          ### You want to replace the following code with code that sets the
          ### facecolor as a gradient based on the population density above
          #facecolor = [0.9375, 0.9375, 0.859375]

          edgecolor = 'black'

          try:
          # use the name of this state to get pop_density
          state_dens = popdensity[ astate.attributes['name'] ]
          except:
          state_dens = 0

          # simple scheme to assign color to each state
          if state_dens < 40:
          facecolor = "lightyellow"
          elif state_dens > 200:
          facecolor = "red"
          else:
          facecolor = "pink"

          # `astate.geometry` is the polygon to plot
          ax.add_geometries([astate.geometry], ccrs.PlateCarree(),
          facecolor=facecolor, edgecolor=edgecolor)

          plt.show()


          The resulting plot:



          enter image description here






          share|improve this answer






















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53290602%2fhow-to-use-cartopy-to-create-colored-us-states%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            2














            To have access to states' attributes, you need to iterate through .records() rather than .geometries(). Here is a working code based on yours. Read comments in the code's portions that I add / modified for clarification.



            import matplotlib.pyplot as plt
            import cartopy.crs as ccrs
            import cartopy.io.shapereader as shpreader

            fig = plt.figure()
            ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.LambertConformal())

            ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())

            shapename = 'admin_1_states_provinces_lakes_shp'
            states_shp = shpreader.natural_earth(resolution='110m',
            category='cultural', name=shapename)

            popdensity =
            'New Jersey': 438.00,
            'Rhode Island': 387.35,
            'Massachusetts': 312.68,
            'Connecticut': 271.40,
            'Maryland': 209.23,
            'New York': 155.18,
            'Delaware': 154.87,
            'Florida': 114.43,
            'Ohio': 107.05,
            'Pennsylvania': 105.80,
            'Illinois': 86.27,
            'California': 83.85,
            'Virginia': 69.03,
            'Michigan': 67.55,
            'Indiana': 65.46,
            'North Carolina': 63.80,
            'Georgia': 54.59,
            'Tennessee': 53.29,
            'New Hampshire': 53.20,
            'South Carolina': 51.45,
            'Louisiana': 39.61,
            'Kentucky': 39.28,
            'Wisconsin': 38.13,
            'Washington': 34.20,
            'Alabama': 33.84,
            'Missouri': 31.36,
            'Texas': 30.75,
            'West Virginia': 29.00,
            'Vermont': 25.41,
            'Minnesota': 23.86,
            'Mississippi': 23.42,
            'Iowa': 20.22,
            'Arkansas': 19.82,
            'Oklahoma': 19.40,
            'Arizona': 17.43,
            'Colorado': 16.01,
            'Maine': 15.95,
            'Oregon': 13.76,
            'Kansas': 12.69,
            'Utah': 10.50,
            'Nebraska': 8.60,
            'Nevada': 7.03,
            'Idaho': 6.04,
            'New Mexico': 5.79,
            'South Dakota': 3.84,
            'North Dakota': 3.59,
            'Montana': 2.39,
            'Wyoming': 1.96

            ax.background_patch.set_visible(False)
            ax.outline_patch.set_visible(False)

            ax.set_title('State Population Density')

            #for state in shpreader.Reader(states_shp).geometries():
            for astate in shpreader.Reader(states_shp).records():

            ### You want to replace the following code with code that sets the
            ### facecolor as a gradient based on the population density above
            #facecolor = [0.9375, 0.9375, 0.859375]

            edgecolor = 'black'

            try:
            # use the name of this state to get pop_density
            state_dens = popdensity[ astate.attributes['name'] ]
            except:
            state_dens = 0

            # simple scheme to assign color to each state
            if state_dens < 40:
            facecolor = "lightyellow"
            elif state_dens > 200:
            facecolor = "red"
            else:
            facecolor = "pink"

            # `astate.geometry` is the polygon to plot
            ax.add_geometries([astate.geometry], ccrs.PlateCarree(),
            facecolor=facecolor, edgecolor=edgecolor)

            plt.show()


            The resulting plot:



            enter image description here






            share|improve this answer



























              2














              To have access to states' attributes, you need to iterate through .records() rather than .geometries(). Here is a working code based on yours. Read comments in the code's portions that I add / modified for clarification.



              import matplotlib.pyplot as plt
              import cartopy.crs as ccrs
              import cartopy.io.shapereader as shpreader

              fig = plt.figure()
              ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.LambertConformal())

              ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())

              shapename = 'admin_1_states_provinces_lakes_shp'
              states_shp = shpreader.natural_earth(resolution='110m',
              category='cultural', name=shapename)

              popdensity =
              'New Jersey': 438.00,
              'Rhode Island': 387.35,
              'Massachusetts': 312.68,
              'Connecticut': 271.40,
              'Maryland': 209.23,
              'New York': 155.18,
              'Delaware': 154.87,
              'Florida': 114.43,
              'Ohio': 107.05,
              'Pennsylvania': 105.80,
              'Illinois': 86.27,
              'California': 83.85,
              'Virginia': 69.03,
              'Michigan': 67.55,
              'Indiana': 65.46,
              'North Carolina': 63.80,
              'Georgia': 54.59,
              'Tennessee': 53.29,
              'New Hampshire': 53.20,
              'South Carolina': 51.45,
              'Louisiana': 39.61,
              'Kentucky': 39.28,
              'Wisconsin': 38.13,
              'Washington': 34.20,
              'Alabama': 33.84,
              'Missouri': 31.36,
              'Texas': 30.75,
              'West Virginia': 29.00,
              'Vermont': 25.41,
              'Minnesota': 23.86,
              'Mississippi': 23.42,
              'Iowa': 20.22,
              'Arkansas': 19.82,
              'Oklahoma': 19.40,
              'Arizona': 17.43,
              'Colorado': 16.01,
              'Maine': 15.95,
              'Oregon': 13.76,
              'Kansas': 12.69,
              'Utah': 10.50,
              'Nebraska': 8.60,
              'Nevada': 7.03,
              'Idaho': 6.04,
              'New Mexico': 5.79,
              'South Dakota': 3.84,
              'North Dakota': 3.59,
              'Montana': 2.39,
              'Wyoming': 1.96

              ax.background_patch.set_visible(False)
              ax.outline_patch.set_visible(False)

              ax.set_title('State Population Density')

              #for state in shpreader.Reader(states_shp).geometries():
              for astate in shpreader.Reader(states_shp).records():

              ### You want to replace the following code with code that sets the
              ### facecolor as a gradient based on the population density above
              #facecolor = [0.9375, 0.9375, 0.859375]

              edgecolor = 'black'

              try:
              # use the name of this state to get pop_density
              state_dens = popdensity[ astate.attributes['name'] ]
              except:
              state_dens = 0

              # simple scheme to assign color to each state
              if state_dens < 40:
              facecolor = "lightyellow"
              elif state_dens > 200:
              facecolor = "red"
              else:
              facecolor = "pink"

              # `astate.geometry` is the polygon to plot
              ax.add_geometries([astate.geometry], ccrs.PlateCarree(),
              facecolor=facecolor, edgecolor=edgecolor)

              plt.show()


              The resulting plot:



              enter image description here






              share|improve this answer

























                2












                2








                2







                To have access to states' attributes, you need to iterate through .records() rather than .geometries(). Here is a working code based on yours. Read comments in the code's portions that I add / modified for clarification.



                import matplotlib.pyplot as plt
                import cartopy.crs as ccrs
                import cartopy.io.shapereader as shpreader

                fig = plt.figure()
                ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.LambertConformal())

                ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())

                shapename = 'admin_1_states_provinces_lakes_shp'
                states_shp = shpreader.natural_earth(resolution='110m',
                category='cultural', name=shapename)

                popdensity =
                'New Jersey': 438.00,
                'Rhode Island': 387.35,
                'Massachusetts': 312.68,
                'Connecticut': 271.40,
                'Maryland': 209.23,
                'New York': 155.18,
                'Delaware': 154.87,
                'Florida': 114.43,
                'Ohio': 107.05,
                'Pennsylvania': 105.80,
                'Illinois': 86.27,
                'California': 83.85,
                'Virginia': 69.03,
                'Michigan': 67.55,
                'Indiana': 65.46,
                'North Carolina': 63.80,
                'Georgia': 54.59,
                'Tennessee': 53.29,
                'New Hampshire': 53.20,
                'South Carolina': 51.45,
                'Louisiana': 39.61,
                'Kentucky': 39.28,
                'Wisconsin': 38.13,
                'Washington': 34.20,
                'Alabama': 33.84,
                'Missouri': 31.36,
                'Texas': 30.75,
                'West Virginia': 29.00,
                'Vermont': 25.41,
                'Minnesota': 23.86,
                'Mississippi': 23.42,
                'Iowa': 20.22,
                'Arkansas': 19.82,
                'Oklahoma': 19.40,
                'Arizona': 17.43,
                'Colorado': 16.01,
                'Maine': 15.95,
                'Oregon': 13.76,
                'Kansas': 12.69,
                'Utah': 10.50,
                'Nebraska': 8.60,
                'Nevada': 7.03,
                'Idaho': 6.04,
                'New Mexico': 5.79,
                'South Dakota': 3.84,
                'North Dakota': 3.59,
                'Montana': 2.39,
                'Wyoming': 1.96

                ax.background_patch.set_visible(False)
                ax.outline_patch.set_visible(False)

                ax.set_title('State Population Density')

                #for state in shpreader.Reader(states_shp).geometries():
                for astate in shpreader.Reader(states_shp).records():

                ### You want to replace the following code with code that sets the
                ### facecolor as a gradient based on the population density above
                #facecolor = [0.9375, 0.9375, 0.859375]

                edgecolor = 'black'

                try:
                # use the name of this state to get pop_density
                state_dens = popdensity[ astate.attributes['name'] ]
                except:
                state_dens = 0

                # simple scheme to assign color to each state
                if state_dens < 40:
                facecolor = "lightyellow"
                elif state_dens > 200:
                facecolor = "red"
                else:
                facecolor = "pink"

                # `astate.geometry` is the polygon to plot
                ax.add_geometries([astate.geometry], ccrs.PlateCarree(),
                facecolor=facecolor, edgecolor=edgecolor)

                plt.show()


                The resulting plot:



                enter image description here






                share|improve this answer













                To have access to states' attributes, you need to iterate through .records() rather than .geometries(). Here is a working code based on yours. Read comments in the code's portions that I add / modified for clarification.



                import matplotlib.pyplot as plt
                import cartopy.crs as ccrs
                import cartopy.io.shapereader as shpreader

                fig = plt.figure()
                ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.LambertConformal())

                ax.set_extent([-125, -66.5, 20, 50], ccrs.Geodetic())

                shapename = 'admin_1_states_provinces_lakes_shp'
                states_shp = shpreader.natural_earth(resolution='110m',
                category='cultural', name=shapename)

                popdensity =
                'New Jersey': 438.00,
                'Rhode Island': 387.35,
                'Massachusetts': 312.68,
                'Connecticut': 271.40,
                'Maryland': 209.23,
                'New York': 155.18,
                'Delaware': 154.87,
                'Florida': 114.43,
                'Ohio': 107.05,
                'Pennsylvania': 105.80,
                'Illinois': 86.27,
                'California': 83.85,
                'Virginia': 69.03,
                'Michigan': 67.55,
                'Indiana': 65.46,
                'North Carolina': 63.80,
                'Georgia': 54.59,
                'Tennessee': 53.29,
                'New Hampshire': 53.20,
                'South Carolina': 51.45,
                'Louisiana': 39.61,
                'Kentucky': 39.28,
                'Wisconsin': 38.13,
                'Washington': 34.20,
                'Alabama': 33.84,
                'Missouri': 31.36,
                'Texas': 30.75,
                'West Virginia': 29.00,
                'Vermont': 25.41,
                'Minnesota': 23.86,
                'Mississippi': 23.42,
                'Iowa': 20.22,
                'Arkansas': 19.82,
                'Oklahoma': 19.40,
                'Arizona': 17.43,
                'Colorado': 16.01,
                'Maine': 15.95,
                'Oregon': 13.76,
                'Kansas': 12.69,
                'Utah': 10.50,
                'Nebraska': 8.60,
                'Nevada': 7.03,
                'Idaho': 6.04,
                'New Mexico': 5.79,
                'South Dakota': 3.84,
                'North Dakota': 3.59,
                'Montana': 2.39,
                'Wyoming': 1.96

                ax.background_patch.set_visible(False)
                ax.outline_patch.set_visible(False)

                ax.set_title('State Population Density')

                #for state in shpreader.Reader(states_shp).geometries():
                for astate in shpreader.Reader(states_shp).records():

                ### You want to replace the following code with code that sets the
                ### facecolor as a gradient based on the population density above
                #facecolor = [0.9375, 0.9375, 0.859375]

                edgecolor = 'black'

                try:
                # use the name of this state to get pop_density
                state_dens = popdensity[ astate.attributes['name'] ]
                except:
                state_dens = 0

                # simple scheme to assign color to each state
                if state_dens < 40:
                facecolor = "lightyellow"
                elif state_dens > 200:
                facecolor = "red"
                else:
                facecolor = "pink"

                # `astate.geometry` is the polygon to plot
                ax.add_geometries([astate.geometry], ccrs.PlateCarree(),
                facecolor=facecolor, edgecolor=edgecolor)

                plt.show()


                The resulting plot:



                enter image description here







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 14 '18 at 4:58









                swatchaiswatchai

                3,29421526




                3,29421526





























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53290602%2fhow-to-use-cartopy-to-create-colored-us-states%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Darth Vader #20

                    How to how show current date and time by default on contact form 7 in WordPress without taking input from user in datetimepicker

                    Ondo