【问题标题】:Seaborn Heatmap Error: " AttributeError: 'NoneType' object has no attribute 'reshape' "Seaborn 热图错误:“AttributeError:‘NoneType’对象没有属性‘reshape’”
【发布时间】:2021-07-08 04:55:07
【问题描述】:

我正在做一个 NLP 项目,研究 10 位不同经典摇滚艺术家各自作品之间的余弦相似性。我已经完成了相似性查询并创建了一个名为 similarities 的数据框,看起来像这样。

我构建了similarities 数据框,首先构建了一个以艺术家姓名作为索引和列名的空数据框,然后运行以下代码来运行相似性查询并使用分数填充数据框:

        
    artist_words = data['lyrics'][artist]
    
    artist_vec_bow = dictionary.doc2bow(artist_words.lower().split())
    artist_vec_lsi = lsi[artist_vec_bow]
    
    artist_sims = index[artist_vec_lsi]
    
    artist_sims_sorted = sorted(enumerate(artist_sims), key=lambda item: -item[1])
    
    for position, score in artist_sims_sorted:
    
        similarities.at[artist, musicians[position][1]] = score 

data 是一个以艺术家姓名作为索引的数据框和一个名为 lyrics 的列,其中歌词作为一个长字符串输入。

我想创建一个 Seaborn 热图来可视化 DataFrame 中指示的相关性。

但是当我运行以下代码时:

sns.heatmap(similarities)

我收到一条以 :

结尾的长错误消息

AttributeError: 'NoneType' object has no attribute 'reshape'

谁能帮我弄清楚如何可视化这个?

similarities.info() 返回以下内容:

Index: 11 entries, bob_dylan to willie_nelson
Data columns (total 11 columns):
 #   Column          Non-Null Count  Dtype 
---  ------          --------------  ----- 
 0   bob_dylan       11 non-null     object
 1   david_bowie     11 non-null     object
 2   janis_joplin    11 non-null     object
 3   john_prine      11 non-null     object
 4   leonard_cohen   11 non-null     object
 5   linda_ronstadt  11 non-null     object
 6   mark_knopfler   11 non-null     object
 7   neil_young      11 non-null     object
 8   stevie_nicks    11 non-null     object
 9   the_band        11 non-null     object
 10  willie_nelson   11 non-null     object
dtypes: object(11)
memory usage: 1.3+ KB

similarities.describe() 返回以下内容:

similarities.describe()

如果完整的错误信息有帮助,这里是:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/var/folders/tb/j430qmhn16s6nsz08nf0y7y40000gn/T/ipykernel_40566/1345125298.py in <module>
----> 1 ax2 = sns.heatmap(
      2     similarities,
      3     vmin=-1, vmax=1, center=0,
      4     cmap=sns.diverging_palette(20, 220, n=200),
      5     square=True

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/seaborn/_decorators.py in inner_f(*args, **kwargs)
     44             )
     45         kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 46         return f(**kwargs)
     47     return inner_f
     48 

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/seaborn/matrix.py in heatmap(data, vmin, vmax, cmap, center, robust, annot, fmt, annot_kws, linewidths, linecolor, cbar, cbar_kws, cbar_ax, square, xticklabels, yticklabels, mask, ax, **kwargs)
    546     if square:
    547         ax.set_aspect("equal")
--> 548     plotter.plot(ax, cbar_ax, kwargs)
    549     return ax
    550 

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/seaborn/matrix.py in plot(self, ax, cax, kws)
    330         # Possibly rotate them if they overlap
    331         if hasattr(ax.figure.canvas, "get_renderer"):
--> 332             ax.figure.draw(ax.figure.canvas.get_renderer())
    333         if axis_ticklabels_overlap(xtl):
    334             plt.setp(xtl, rotation="vertical")

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     72     @wraps(draw)
     73     def draw_wrapper(artist, renderer, *args, **kwargs):
---> 74         result = draw(artist, renderer, *args, **kwargs)
     75         if renderer._rasterizing:
     76             renderer.stop_rasterizing()

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     49                 renderer.start_filter()
     50 
---> 51             return draw(artist, renderer, *args, **kwargs)
     52         finally:
     53             if artist.get_agg_filter() is not None:

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/figure.py in draw(self, renderer)
   2778 
   2779             self.patch.draw(renderer)
-> 2780             mimage._draw_list_compositing_images(
   2781                 renderer, self, artists, self.suppressComposite)
   2782 

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    130     if not_composite or not has_images:
    131         for a in artists:
--> 132             a.draw(renderer)
    133     else:
    134         # Composite any adjacent images together

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     49                 renderer.start_filter()
     50 
---> 51             return draw(artist, renderer, *args, **kwargs)
     52         finally:
     53             if artist.get_agg_filter() is not None:

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/_api/deprecation.py in wrapper(*inner_args, **inner_kwargs)
    429                          else deprecation_addendum,
    430                 **kwargs)
--> 431         return func(*inner_args, **inner_kwargs)
    432 
    433     return wrapper

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/axes/_base.py in draw(self, renderer, inframe)
   2919             renderer.stop_rasterizing()
   2920 
-> 2921         mimage._draw_list_compositing_images(renderer, self, artists)
   2922 
   2923         renderer.close_group('axes')

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    130     if not_composite or not has_images:
    131         for a in artists:
--> 132             a.draw(renderer)
    133     else:
    134         # Composite any adjacent images together

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     49                 renderer.start_filter()
     50 
---> 51             return draw(artist, renderer, *args, **kwargs)
     52         finally:
     53             if artist.get_agg_filter() is not None:

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/collections.py in draw(self, renderer)
   2099                 offsets = np.column_stack([xs, ys])
   2100 
-> 2101         self.update_scalarmappable()
   2102 
   2103         if not transform.is_affine:

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/collections.py in update_scalarmappable(self)
    924                 # pcolormesh, scatter, maybe others flatten their _A
    925                 self._alpha = self._alpha.reshape(self._A.shape)
--> 926             self._mapped_colors = self.to_rgba(self._A, self._alpha)
    927 
    928         if self._face_is_mapped:

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/cm.py in to_rgba(self, x, alpha, bytes, norm)
    358         if norm:
    359             x = self.norm(x)
--> 360         rgba = self.cmap(x, alpha=alpha, bytes=bytes)
    361         return rgba
    362 

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/colors.py in __call__(self, X, alpha, bytes)
    612             self._init()
    613 
--> 614         mask_bad = X.mask if np.ma.is_masked(X) else np.isnan(X)  # Mask nan's.
    615         xa = np.array(X, copy=True)
    616         if not xa.dtype.isnative:

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/IPython/core/formatters.py in __call__(self, obj)
    339                 pass
    340             else:
--> 341                 return printer(obj)
    342             # Finally look for special method names
    343             method = get_real_method(obj, self.print_method)

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/IPython/core/pylabtools.py in <lambda>(fig)
    248 
    249     if 'png' in formats:
--> 250         png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png', **kwargs))
    251     if 'retina' in formats or 'png2x' in formats:
    252         png_formatter.for_type(Figure, lambda fig: retina_figure(fig, **kwargs))

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/IPython/core/pylabtools.py in print_figure(fig, fmt, bbox_inches, **kwargs)
    132         FigureCanvasBase(fig)
    133 
--> 134     fig.canvas.print_figure(bytes_io, **kw)
    135     data = bytes_io.getvalue()
    136     if fmt == 'svg':

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)
   2228                        else suppress())
   2229                 with ctx:
-> 2230                     self.figure.draw(renderer)
   2231 
   2232             if bbox_inches:

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     72     @wraps(draw)
     73     def draw_wrapper(artist, renderer, *args, **kwargs):
---> 74         result = draw(artist, renderer, *args, **kwargs)
     75         if renderer._rasterizing:
     76             renderer.stop_rasterizing()

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     49                 renderer.start_filter()
     50 
---> 51             return draw(artist, renderer, *args, **kwargs)
     52         finally:
     53             if artist.get_agg_filter() is not None:

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/figure.py in draw(self, renderer)
   2778 
   2779             self.patch.draw(renderer)
-> 2780             mimage._draw_list_compositing_images(
   2781                 renderer, self, artists, self.suppressComposite)
   2782 

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    130     if not_composite or not has_images:
    131         for a in artists:
--> 132             a.draw(renderer)
    133     else:
    134         # Composite any adjacent images together

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     49                 renderer.start_filter()
     50 
---> 51             return draw(artist, renderer, *args, **kwargs)
     52         finally:
     53             if artist.get_agg_filter() is not None:

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/_api/deprecation.py in wrapper(*inner_args, **inner_kwargs)
    429                          else deprecation_addendum,
    430                 **kwargs)
--> 431         return func(*inner_args, **inner_kwargs)
    432 
    433     return wrapper

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/axes/_base.py in draw(self, renderer, inframe)
   2919             renderer.stop_rasterizing()
   2920 
-> 2921         mimage._draw_list_compositing_images(renderer, self, artists)
   2922 
   2923         renderer.close_group('axes')

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    130     if not_composite or not has_images:
    131         for a in artists:
--> 132             a.draw(renderer)
    133     else:
    134         # Composite any adjacent images together

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
     49                 renderer.start_filter()
     50 
---> 51             return draw(artist, renderer, *args, **kwargs)
     52         finally:
     53             if artist.get_agg_filter() is not None:

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/collections.py in draw(self, renderer)
   2128                 coordinates, offsets, transOffset,
   2129                 # Backends expect flattened rgba arrays (n*m, 4) for fc and ec
-> 2130                 self.get_facecolor().reshape((-1, 4)),
   2131                 self._antialiased, self.get_edgecolors().reshape((-1, 4)))
   2132         gc.restore()

AttributeError: 'NoneType' object has no attribute 'reshape'
<Figure size 432x288 with 2 Axes>

【问题讨论】:

  • 欢迎来到 SO。 similarites 值可能存在问题。
  • 请尝试创建minimal reproducible example。我们只能告诉您我们实际可以看到的代码有什么问题;并且由于 .heatmap 方法应该可用于某些事情,因此问题可能出在其他地方。
  • 您运行的是哪个版本的 seaborn?你能添加(作为文本)similarities.info()similarities.describe() 的输出吗?你确定similarities 不是空数据框吗?
  • 有没有机会输入数据而不是截图? 6x6 就可以了。
  • @KarlKnechtel 谢谢!我添加了更多可能有帮助的代码。

标签: python matplotlib seaborn heatmap correlation


【解决方案1】:

这是因为使用的类型,我刚刚遇到了这个问题,并通过为我的数据框指定一个 dtype 来解决它。在您的similarities.info() seaborn 想要查看 DType:'float64' 或其他数字类型。

similarities = pd.DataFrame(..., dtype="float")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2021-07-15
    • 1970-01-01
    • 2017-03-10
    • 2019-07-18
    • 2018-01-27
    相关资源
    最近更新 更多