[英]TypeError with scatterplot and label
这看起来很简单,但由于某种原因,我无法让它工作。 This is in pandas 1.2.3 and matplotlib 3.4.0 running on an anaconda's python 3.8.8 on Windows 10 64-bit, inside a Jupyter notebook locally.
我在下面创建了一个复制。 首先,一个工作版本; 注意注释掉的 label 行:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df_test = pd.DataFrame(np.random.randn(1000, 4), columns=list("ABCD"))
df_test.plot(kind="scatter", x="A", y="B",
alpha=0.4,
figsize=(10,7),
#label="la la",
s=df_test["C"]*100,
c="D",
cmap=plt.get_cmap("jet"),
colorbar=True,
)
plt.legend()
运行上面给出的投诉No handles with labels found to put in legend
(如预期的那样)和一些弃用警告,但显示一个图表。 这些点的颜色很好,您甚至可能会看到空的图例框。
现在,取消注释 label 行:
df_test.plot(kind="scatter", x="A", y="B",
alpha=0.4,
figsize=(10,7),
label="la la",
s=df_test["C"]*100,
c="D",
cmap=plt.get_cmap("jet"),
colorbar=True,
)
plt.legend()
当我运行它时,我得到一个TypeError: object of type 'NoneType' has no len()
error,如下所示:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
D:\anaconda\envs\tf-gpu\lib\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)
D:\anaconda\envs\tf-gpu\lib\site-packages\IPython\core\pylabtools.py in <lambda>(fig)
246
247 if 'png' in formats:
--> 248 png_formatter.for_type(Figure, lambda fig: print_figure(fig, 'png', **kwargs))
249 if 'retina' in formats or 'png2x' in formats:
250 png_formatter.for_type(Figure, lambda fig: retina_figure(fig, **kwargs))
D:\anaconda\envs\tf-gpu\lib\site-packages\IPython\core\pylabtools.py in print_figure(fig, fmt, bbox_inches, **kwargs)
130 FigureCanvasBase(fig)
131
--> 132 fig.canvas.print_figure(bytes_io, **kw)
133 data = bytes_io.getvalue()
134 if fmt == 'svg':
D:\anaconda\envs\tf-gpu\lib\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:
D:\anaconda\envs\tf-gpu\lib\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()
D:\anaconda\envs\tf-gpu\lib\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:
D:\anaconda\envs\tf-gpu\lib\site-packages\matplotlib\figure.py in draw(self, renderer)
2732
2733 self.patch.draw(renderer)
-> 2734 mimage._draw_list_compositing_images(
2735 renderer, self, artists, self.suppressComposite)
2736
D:\anaconda\envs\tf-gpu\lib\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
D:\anaconda\envs\tf-gpu\lib\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:
D:\anaconda\envs\tf-gpu\lib\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
D:\anaconda\envs\tf-gpu\lib\site-packages\matplotlib\axes\_base.py in draw(self, renderer, inframe)
2923 renderer.stop_rasterizing()
2924
-> 2925 mimage._draw_list_compositing_images(renderer, self, artists)
2926
2927 renderer.close_group('axes')
D:\anaconda\envs\tf-gpu\lib\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
D:\anaconda\envs\tf-gpu\lib\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:
D:\anaconda\envs\tf-gpu\lib\site-packages\matplotlib\legend.py in draw(self, renderer)
612
613 self.legendPatch.draw(renderer)
--> 614 self._legend_box.draw(renderer)
615
616 renderer.close_group('legend')
D:\anaconda\envs\tf-gpu\lib\site-packages\matplotlib\offsetbox.py in draw(self, renderer)
366 for c, (ox, oy) in zip(self.get_visible_children(), offsets):
367 c.set_offset((px + ox, py + oy))
--> 368 c.draw(renderer)
369
370 bbox_artist(self, renderer, fill=False, props=dict(pad=0.))
D:\anaconda\envs\tf-gpu\lib\site-packages\matplotlib\offsetbox.py in draw(self, renderer)
366 for c, (ox, oy) in zip(self.get_visible_children(), offsets):
367 c.set_offset((px + ox, py + oy))
--> 368 c.draw(renderer)
369
370 bbox_artist(self, renderer, fill=False, props=dict(pad=0.))
D:\anaconda\envs\tf-gpu\lib\site-packages\matplotlib\offsetbox.py in draw(self, renderer)
366 for c, (ox, oy) in zip(self.get_visible_children(), offsets):
367 c.set_offset((px + ox, py + oy))
--> 368 c.draw(renderer)
369
370 bbox_artist(self, renderer, fill=False, props=dict(pad=0.))
D:\anaconda\envs\tf-gpu\lib\site-packages\matplotlib\offsetbox.py in draw(self, renderer)
366 for c, (ox, oy) in zip(self.get_visible_children(), offsets):
367 c.set_offset((px + ox, py + oy))
--> 368 c.draw(renderer)
369
370 bbox_artist(self, renderer, fill=False, props=dict(pad=0.))
D:\anaconda\envs\tf-gpu\lib\site-packages\matplotlib\offsetbox.py in draw(self, renderer)
692 if self._clip_children and not (c.clipbox or c._clippath):
693 c.set_clip_path(tpath)
--> 694 c.draw(renderer)
695
696 bbox_artist(self, renderer, fill=False, props=dict(pad=0.))
D:\anaconda\envs\tf-gpu\lib\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:
D:\anaconda\envs\tf-gpu\lib\site-packages\matplotlib\collections.py in draw(self, renderer)
1007 def draw(self, renderer):
1008 self.set_sizes(self._sizes, self.figure.dpi)
-> 1009 super().draw(renderer)
1010
1011
D:\anaconda\envs\tf-gpu\lib\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:
D:\anaconda\envs\tf-gpu\lib\site-packages\matplotlib\collections.py in draw(self, renderer)
378 do_single_path_optimization = False
379 if (len(paths) == 1 and len(trans) <= 1 and
--> 380 len(facecolors) == 1 and len(edgecolors) == 1 and
381 len(self._linewidths) == 1 and
382 all(ls[1] is None for ls in self._linestyles) and
TypeError: object of type 'NoneType' has no len()
这似乎是与c=
进行着色和label=
的交互。 如果我注释掉颜色的东西(c=,cmap,colorbar),plot 会用一个图例框渲染,我们看到它也适用于 colors 和 ZD304BA20E96D874141588EEABAC850E3。 我还尝试重新启动 kernel,结果相同。 我还没有尝试使用其他版本制作新环境,因为我想看看这是否只是我的,或者其他人可以复制的东西。
(BTW, On Colab, python 3.7.10, pandas 1.1.5, matplotlib 3.2.2, the code does appear to work (with a minor figsize complaint), so could be something about the more recent versions of these packages, or my设置...)
所以,请善待,但有人能指出我在这里错过了什么愚蠢的事情吗? 有什么建议么? 有人能复制吗?
可能是旧版本中的一个错误,因为它在 matplotlib 的最新版本上运行良好。 建议只更新 matplotlib 和 pandas。 不要在它上面徘徊太多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.