mpld3 3D scatter plot
我正在探索MPLD3库,无法确定如何创建三维散点图。有了Matplotlib,我可以:
1 2 3 4 5 6 7 | import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter([1],[5],[7]) plt.show() |
同样,我尝试了MPLD3(在Jupyter笔记本中):将matplotlib.pyplot导入为plt从mpl_toolkits.mplot3d导入axes3d导入MPLD3
1 2 3 4 5 | mpld3.enable_notebook() fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter([1],[5],[7]) mpld3.display(fig) |
号
我得到了错误
1 | TypeError: array([ 0.94, 1.06]) is not JSON serializable |
有什么想法吗?
这是完整的错误日志:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | Traceback (most recent call last) <ipython-input-26-54fc4a65da87> in <module>() 6 N = 50 7 ax.scatter([1],[5],[7]) ----> 8 mpld3.display(fig) /usr/local/lib/python2.7/dist-packages/mpld3/_display.pyc in display(fig, closefig, local, **kwargs) 288 if closefig: 289 plt.close(fig) --> 290 return HTML(fig_to_html(fig, **kwargs)) 291 292 /usr/local/lib/python2.7/dist-packages/mpld3/_display.pyc in fig_to_html(fig, d3_url, mpld3_url, no_extras, template_type, figid, use_http, **kwargs) 234 d3_url=d3_url, 235 mpld3_url=mpld3_url, --> 236 figure_json=json.dumps(figure_json), 237 extra_css=extra_css, 238 extra_js=extra_js) /usr/lib/python2.7/json/__init__.pyc in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, encoding, default, sort_keys, **kw) 241 cls is None and indent is None and separators is None and 242 encoding == 'utf-8' and default is None and not sort_keys and not kw): --> 243 return _default_encoder.encode(obj) 244 if cls is None: 245 cls = JSONEncoder /usr/lib/python2.7/json/encoder.pyc in encode(self, o) 205 # exceptions aren't as detailed. The list call should be roughly 206 # equivalent to the PySequence_Fast that ''.join() would do. --> 207 chunks = self.iterencode(o, _one_shot=True) 208 if not isinstance(chunks, (list, tuple)): 209 chunks = list(chunks) /usr/lib/python2.7/json/encoder.pyc in iterencode(self, o, _one_shot) 268 self.key_separator, self.item_separator, self.sort_keys, 269 self.skipkeys, _one_shot) --> 270 return _iterencode(o, 0) 271 272 def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, /usr/lib/python2.7/json/encoder.pyc in default(self, o) 182 183 """ --> 184 raise TypeError(repr(o) +" is not JSON serializable") 185 186 def encode(self, o): TypeError: array([ 0.94, 1.06]) is not JSON serializable |
。
正如abobe所提到的,mpld3不支持3D图形,但是检查下面的包,它们还打算通过python进行可视化,plotly将matplotlib图形转换为它们的图形,mpld3也支持。
- https://plot.ly/python/
- https://bokeh.pydata.org/en/latest/最新/
对不起,这不是一个完整的答案,而是一个很长的评论…
我可以通过编辑mpld3.u display.py来消除错误,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class NumpyEncoder(json.JSONEncoder): """ Special json encoder for numpy types""" def default(self, obj): try: obj=obj.tolist() return json.JSONEncoder.encode(self, obj) except AttributeError: pass if isinstance(obj, (numpy.int_, numpy.intc, numpy.intp, numpy.int8, numpy.int16, numpy.int32, numpy.int64, numpy.uint8, numpy.uint16,numpy.uint32, numpy.uint64)): return int(obj) elif isinstance(obj, (numpy.float_, numpy.float16, numpy.float32, numpy.float64)): return float(obj) return json.JSONEncoder.default(self, obj) |
但是,它会在笔记本中生成一个带有错误消息的空绘图:
1 2 3 | Javascript error adding output! TypeError: t.map is not a function See your browser Javascript console for more details. |
号
看来MPLD3不是为支持3D而设计的…
不幸的是,目前MPLD3不支持3D绘图。它只支持二维绘图。检查以下链接:
- https://github.com/mpld3/mpld3/issues/223(https://github.com/mpld3/mpld3/issues/223)
- python&matplotlib:在Jupyter笔记本中进行三维绘图交互