AttributeError:邮编shp文件中的事件的Geopandas绘图中的未知属性列

时间:2019-01-19 01:10:37

标签: python-3.x matplotlib geopandas

我正在尝试创建一个Choropleth地图,以显示北卡罗来纳州一个县的火灾事故。我将数据保存在Dataframe中,昨晚我能够导出地图。唯一的问题是导出的数据不准确-因此我的代码有问题。我想我通过将shapefile和数据数据帧合并在一起来解决此问题,但是现在,当我运行创建地图的部分时,我得到AttributeError: Unknown property column完整消息:

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

我不知道该如何解决。我已经用谷歌搜索并尝试将dtype从float更改为int,尝试了其他列,但没有任何更改。我不明白,因为它昨晚起作用了,但是当我今天尝试在进行更改之前运行它时却没有起作用。预先感谢您的任何帮助。以下是我的大部分代码,其中包含数据框和映射,其他所有内容都只是从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

这是合并数据框的外观: enter image description here

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)

1 个答案:

答案 0 :(得分:2)

问题是您正在尝试使用column作为关键字参数。由于您要绘制存储在名为'ZIPNUM'的变量中的DataFrame的variable列,因此可以将其作为位置参数传递给plot()。如果要绘制两个变量之间的关系,可以使用关键字参数merged_df.plot(x=variable1, y=variable2)

您可以使用

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

编辑(基于评论)

如果使用markeredgecolor进行绘图,则应仅使用marker edgecolor不是正确的关键字。此外,您正在分配一个数字(字符串)作为颜色,这又是不正确的。下面是一个简单的示例。

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')