简体   繁体   中英

AttributeError: Unknown property column in Geopandas plotting of events in zipcode shp file

I am trying to create a Choropleth map showing fire incidents throughout a county in NC. I have the data in a Dataframe and last night I was able to export maps. The only problem was that the data exported was not accurate--so there was a problem with my code. I think I managed to fix that, by merging the shapefiles and data dataframes together, but now, when I run the portion that creates the map, I get AttributeError: Unknown property column Full message:

AttributeError                            Traceback (most recent call last)
<ipython-input-74-61a60b41abbe> in <module>()
    13 # create map
    14 
---> 15 merged_df.plot(column=variable, cmap='Reds', linewidth=0.8, ax=ax, edgecolor='0.8');
    16 
    17 ax.axis('off')

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in __call__(self, x, y, kind, ax, subplots, sharex, sharey, layout, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, secondary_y, sort_columns, **kwds)
  2939                           fontsize=fontsize, colormap=colormap, table=table,
  2940                           yerr=yerr, xerr=xerr, secondary_y=secondary_y,
-> 2941                           sort_columns=sort_columns, **kwds)
  2942     __call__.__doc__ = plot_frame.__doc__
  2943 

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in plot_frame(data, x, y, kind, ax, subplots, sharex, sharey, layout, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, secondary_y, sort_columns, **kwds)
  1975                  yerr=yerr, xerr=xerr,
  1976                  secondary_y=secondary_y, sort_columns=sort_columns,
-> 1977                  **kwds)
  1978 
  1979 

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in _plot(data, x, y, subplots, ax, kind, **kwds)
  1802         plot_obj = klass(data, subplots=subplots, ax=ax, kind=kind, **kwds)
  1803 
-> 1804     plot_obj.generate()
  1805     plot_obj.draw()
  1806     return plot_obj.result

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in generate(self)
   258         self._compute_plot_data()
   259         self._setup_subplots()
--> 260         self._make_plot()
   261         self._add_table()
   262         self._make_legend()

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in _make_plot(self)
   983                              stacking_id=stacking_id,
   984                              is_errorbar=is_errorbar,
--> 985                              **kwds)
   986             self._add_legend_handle(newlines[0], label, index=i)
   987 

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in _plot(cls, ax, x, y, style, column_num, stacking_id, **kwds)
   999             cls._initialize_stacker(ax, stacking_id, len(y))
  1000         y_values = cls._get_stacked_values(ax, stacking_id, y, kwds['label'])
-> 1001         lines = MPLPlot._plot(ax, x, y_values, style=style, **kwds)
  1002         cls._update_stacker(ax, stacking_id, y)
  1003         return lines

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in _plot(cls, ax, x, y, style, is_errorbar, **kwds)
   613             else:
   614                 args = (x, y)
--> 615             return ax.plot(*args, **kwds)
   616 
   617     def _get_index_name(self):

~\Anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, data, *args, **kwargs)
  1808                         "the Matplotlib list!)" % (label_namer, func.__name__),
  1809                         RuntimeWarning, stacklevel=2)
-> 1810             return func(ax, *args, **kwargs)
  1811 
  1812         inner.__doc__ = _add_data_doc(inner.__doc__,

~\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in plot(self, scalex, scaley, *args, **kwargs)
  1609         kwargs = cbook.normalize_kwargs(kwargs, mlines.Line2D._alias_map)
  1610 
-> 1611         for line in self._get_lines(*args, **kwargs):
  1612             self.add_line(line)
  1613             lines.append(line)

~\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in _grab_next_args(self, *args, **kwargs)
   391                 this += args[0],
   392                 args = args[1:]
--> 393             yield from self._plot_args(this, kwargs)
   394 
   395 

~\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in _plot_args(self, tup, kwargs)
   381                                   "with non-matching shapes is deprecated.")
   382         for j in range(max(ncx, ncy)):
--> 383             seg = func(x[:, j % ncx], y[:, j % ncy], kw, kwargs)
   384             ret.append(seg)
   385         return ret

~\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in _makeline(self, x, y, kw, kwargs)
   286         default_dict = self._getdefaults(None, kw)
   287         self._setdefaults(default_dict, kw)
--> 288         seg = mlines.Line2D(x, y, **kw)
   289         return seg
   290 

~\Anaconda3\lib\site-packages\matplotlib\lines.py in __init__(self, xdata, ydata, linewidth, linestyle, color, marker, markersize, markeredgewidth, markeredgecolor, markerfacecolor, markerfacecoloralt, fillstyle, antialiased, dash_capstyle, solid_capstyle, dash_joinstyle, solid_joinstyle, pickradius, drawstyle, markevery, **kwargs)
   408         # update kwargs before updating data to give the caller a
   409         # chance to init axes (and hence unit support)
--> 410         self.update(kwargs)
   411         self.pickradius = pickradius
   412         self.ind_offset = 0

~\Anaconda3\lib\site-packages\matplotlib\artist.py in update(self, props)
   914 
   915         with cbook._setattr_cm(self, eventson=False):
--> 916             ret = [_update_property(self, k, v) for k, v in props.items()]
   917 
   918         if len(ret):

~\Anaconda3\lib\site-packages\matplotlib\artist.py in <listcomp>(.0)
   914 
   915         with cbook._setattr_cm(self, eventson=False):
--> 916             ret = [_update_property(self, k, v) for k, v in props.items()]
   917 
   918         if len(ret):

~\Anaconda3\lib\site-packages\matplotlib\artist.py in _update_property(self, k, v)
   910                 func = getattr(self, 'set_' + k, None)
   911                 if not callable(func):
--> 912                     raise AttributeError('Unknown property %s' % k)
   913                 return func(v)
   914 

AttributeError: Unknown property column

I have no idea how to fix this. I've googled and tried changing the dtype from float to int, tried different columns, but no change. I don't understand because it worked last night, but didn't work when I tried to run it today before making changes. Thank you in advance for any help. Below is the bulk of my code that contains the data frame and mapping, everything else is just getting data from csvs:

import pandas as pd
import numpy as np
#import googlemaps
import gmaps
import gmaps.datasets
import geopandas as gpd
#import matplotlib as plt
import matplotlib.pyplot as plt
import os
import plotly.plotly as py
import plotly.tools as tls

This is what the merged dataframe looks like: 在此处输入图片说明

OBJECTID_x                     int64
ZIPNUM                       float64
address                       object
address2                      object
apt_room                      object
arrive_date_time              object
cleared_date_time             object
dispatch_date_time            object
exposure                       int64
incident_number               object
incident_type                  int64
incident_type_description     object
platoon                       object
station                      float64
Longitude                     object
Latitude                      object
Year                           int64
Date                          object
Arr Time                      object
Seconds                      float64
Incident                      object
OBJECTID_y                     int64
ZIPNAME                       object
ZIPCODE                       object
NAME                          object
SHAPEAREA                    float64
SHAPELEN                     float64
LAST_EDITE                    object
geometry                      object
dtype: object
# set a variable that will call column to visualise on the map

variable = 'ZIPNUM'

# set the range for the choropleth

vmin, vmax = 50, 2000

# create figure and axes for Matplotlib

fig, ax = plt.subplots(1, figsize=(15, 15))

# create map

merged_df.plot(column=variable, cmap='Reds', linewidth=0.8, ax=ax, edgecolor='0.8');

ax.axis('off')

ax.set_title('Fire Incident Rate in Wake County', fontdict={'fontsize': '25', 'fontweight' : '3'})

# Create colorbar as a legend

sm = plt.cm.ScalarMappable(cmap='Reds', norm=plt.Normalize(vmin=vmin, vmax=vmax))

# empty array for the data range

sm._A = []

# add the colorbar to the figure

cbar = fig.colorbar(sm)

ax.annotate('2008-2018',
            xy=(0.001, .225), xycoords='figure fraction',
            horizontalalignment='left', verticalalignment='top',
            fontsize=35)

fig.savefig("Fire Incident Rate in Wake County 2008-2018.png", dpi=300)

The problem is that you are trying to use column as a keyword argument. Since you want to plot the 'ZIPNUM' column of the DataFrame, which you store in a variable called variable , you can just pass it as a positional argument to plot() . If you want to plot a relationship between two variables, you can use keyword arguments merged_df.plot(x=variable1, y=variable2)

For you case, you can use

variable = 'ZIPNUM'
merged_df.plot(variable, cmap='Reds', linewidth=0.8, ax=ax, edgecolor='0.8');

EDIT (based on comments)

You should use markeredgecolor only if you use marker for plotting. edgecolor is not the correct keyword. Moreover, you are assigning a number (string) as color which is again incorrect. Below is a simple example.

df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8]], columns=["A", "B"])
column='A'
df.plot(column, linewidth=0.8, color='r', marker ='o', markeredgewidth=2,
        markeredgecolor='blue')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM