Mpld3: 使用 xticks 时出现“TypeError: *** is not JSON serializable”

创建于 2014-05-11  ·  29评论  ·  资料来源: mpld3/mpld3

当我使用xticks参数时,我在摆弄熊猫情节时遇到了这个错误。

概念证明在这里:
http://nbviewer.ipython.org/gist/edvakf/a47a41ace10afbd891ff
(修改http://pandas.pydata.org/pandas-docs/stable/visualization.html)

最有用的评论

我通过添加行来解决这个问题

elif isinstance(obj, (numpy.ndarray,)):
        return obj.tolist()

到 /mpld3/_display.py:NumpyEncoder

所有29条评论

啊 - 看起来mplexporter错误地假设 xticks 是一个列表。 那是一个错误。

同时,如果您手动将 xticks 转换为列表,它应该可以工作。

事实上,事实并非如此。 也就是说,以下工作正常:

fig = plt.figure()
ax = fig.add_subplot(111, xticks=np.arange(11))
ax.plot([0, 10], [0, 10], '-k')
mpld3.show()

Pandas 在这里用它的滴答声做了一些奇怪的事情:错误说2000不可序列化,这很疯狂。 Pandas 是否有某种内置的不可序列化浮点类型?

这不是数字 2000,而是年份。 欢迎来到datetime地狱。
(编辑 6/19/2014:似乎我错了datetime是问题...)

呃......我不确定如何最好地处理它。 有什么想法吗?

pandas使用to_json有帮助吗?

http://pandas.pydata.org/pandas-docs/dev/io.html#date -handling

在熊猫中使用 to_json 有帮助吗?

也许,但是我们将不得不为代码中的很多事情做一个try ... except语句(即,如果值是 Pandas 变量,则以一种方式执行,执行另一种方式),然后确保 javascript 端的轴标签可以处理 Pandas 决定输出的任何 JSON 结构。 我不想增加那种复杂程度,因为这听起来像是一个非常脆弱的解决方案和维护的噩梦。

我知道了。 这归结为 Python 无法为用户定义的类公开 json 序列化方法。 你可以关闭这个问题。

我们应该让它保持开放......可能有更好的方法来处理这个问题。 我会考虑的。

等一下,这在 Python 2.7 中对我来说似乎很好用。 可能只是 Python3 问题吗?

In [56]: matplotlib.__version__
Out[56]: '1.3.1'

In [57]: pandas.__version__
Out[57]: '0.13.1'

大家好,
不确定是否相关,但我在尝试绘制这个 seaborn 图时遇到了类似的问题: http :

mpld3.fig_to_html(grid.fig, 'test.html')
/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/mplexporter/exporter.py:82: UserWarni ng: Blended transforms not yet supported. Zoom behavior may not work as expected.
  warnings.warn("Blended transforms not yet supported. "
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/_display.py", line 236, in fig_to_html
    figure_json=json.dumps(figure_json),
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 0 is not JSON serializable

问题是内部使用了 numpy.int64 数字,并且默认情况下这些数字不是 json 可序列化的。
库中应该有一个钩子来提供一个 json.JSONEncoder 来处理这个。

只是为了提供想法的空间:

我有同样的问题,但连接到 Django,这是我在使用 mpld3 的项目中使用的项目的后端。

我尝试序列化一个 numpy 数组,但在使用 django 1.6 时出现此错误。 我降级到 1.5 并且可以正常工作。 我发现原因是从 1.6 及更高版本开始,序列化是使用 json 完成的,而从 1.5 及更低版本则通过 Pickle 完成。

我希望这可以帮助你们找出问题所在。

医学文利格希尔森,
赫拉尔多·德拉里瓦·埃斯皮诺萨
Høgskolektor
Høgskolen i Gjøvik
电子邮报:gerardo。 [email protected]
移动电话:+47 950 13 322

2014 年 6 月 19 日 16:56,lvasseur [email protected]写道:

大家好,
不确定是否相关,但我在尝试绘制这个 seaborn 图时遇到了类似的问题: http :

mpld3.fig_to_html(grid.fig, 'test.html')
/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/mplexporter/exporter.py:82:用户警告:尚不支持混合转换。 缩放行为可能无法按预期工作。
warnings.warn("尚不支持混合变换。"
回溯(最近一次通话最后):
文件 ”",第 1 行,在
文件“/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/_display.py”,第 236 行,在 fig_to_html
figure_json=json.dumps(figure_json),
转储中的文件“/usr/lib/python2.7/json/__init__.py”,第 231 行
返回 _default_encoder.encode(obj)
文件“/usr/lib/python2.7/json/encoder.py”,第 201 行,在编码中
块 = self.iterencode(o, _one_shot=True)
文件“/usr/lib/python2.7/json/encoder.py”,第 264 行,在 iterencode
返回 _iterencode(o, 0)
文件“/usr/lib/python2.7/json/encoder.py”,第 178 行,默认
raise TypeError(repr(o) + "不是 JSON 可序列化")
TypeError: 0 不是 JSON 可序列化的
问题是内部使用了 numpy.int64 数字,并且默认情况下这些数字不是 json 可序列化的。
库中应该有一个钩子来提供一个 json.JSONEncoder 来处理这个。


直接回复此邮件或在 GitHub 上查看。

供参考,

    from json import JSONEncoder
    class MyEncoder(JSONEncoder):
        def default(self, obj):
            if isinstance(obj, numpy.int64):
                return int(obj)
            return JSONEncoder.default(self, obj)

    return template.render(figid=json.dumps(figid),
                           d3_url=d3_url,
                           mpld3_url=mpld3_url,
                           figure_json=json.dumps(figure_json, cls=MyEncoder),
                           extra_css=extra_css,
                           extra_js=extra_js)

解决 /mpld3/_display.py 中的问题: fig_to_html

我现在没有时间尝试,但看起来这是个问题,也是解决方案的正确方向。 json.dump文档让我认为default选项有一个更轻量级的解决方案,尽管它最终可能只是短了一行。 你准备好做一个拉请求了吗?

我希望 PR #213 能解决这个问题,但原帖中的 ipython notebook仍然不适合我。 其他人可以试试吗?

我会在某个时候尝试一下

仍然对此感到困惑......我不确定#213是否真的在这里修复了任何东西。 我可以在没有它的情况下序列化 int64 对象......

这解决了吗?
我似乎无法 fig_to_html 生成熊猫图(我得到TypeError: 0 is not JSON serializable )。 图生成良好。
当我使用 plt.bar 重试时,如果我将 yticks 与自定义字符串一起使用,我也会收到错误消息。

怎么解决?

不确定。 轴标签是整数的不可序列化版本似乎是一些问题。 如果你有什么发现,请告诉我们。

只是想指出我在使用时收到此错误

dates = df.Date.apply(lambda dt: dt.strftime('%B')[:3] + dt.strftime(' %d')).values
plt.xticks(x, dates, rotation='vertical')

但不与

ax.set_xticklabels(dates, rotation='vertical')

希望这可以帮助。

编辑:在进一步检查中,虽然后一个版本不会产生错误,但结果图的 xticks 实际上并没有设置。

编辑 2:我的错,刚刚发现不支持刻度(#22)。

FWIW,使用箱线图可以重现问题:

import numpy as np, mpld3
np.random.seed(937)
data = np.random.lognormal(size=(37, 4), mean=1.5, sigma=1.75)
labels = list('ABCD')
fs = 10  # fontsize

fig, axes = plt.subplots(1, 1, figsize=(6, 6)) 
axes.boxplot(data, labels=labels)
axes.set_title('Default', fontsize=fs)

html_fig = mppld3.fig_to_html(fig)

具体来说,这里是 pip freeze 的版本

cycler==0.10.0
Jinja2==2.8
MarkupSafe==0.23
matplotlib==1.5.1
mpld3==0.2
numpy==1.10.4
pandas==0.17.1
ptyprocess==0.5.1
pyparsing==2.1.0
python-dateutil==2.5.0
pytz==2015.7
six==1.10.0
wheel==0.29.0

对于 Python 3.4.3。

@lvasseur建议的

要使原始示例正常工作,请使用 [float(x) for x in range(2000,2002)] 而不是 np.arange(2000,2002,1)。

不确定是否相关,但我在尝试绘制这个 seaborn 图时遇到了类似的问题: http :

我在尝试mtld3.display(fig)为 seaborn barplot 图时遇到同样的错误:

TypeError: 0 不是 JSON 可序列化的

任何人都可以用mpld3渲染seaborn地块吗?

这似乎是因为数据值中有nan 。 如果我在_display.py:243中断figure_json字典中用None替换nan ,我得到了预期的输出。

编辑:上面似乎没有解决问题(我在调试解释器中进行测试,它工作但在使用 mpld3 时没有)。
因此,渲染sns.barplot()不起作用,而渲染plt.bar()工作正常。 我看不出两个图中的数字有明显差异,但提供的补丁(https://github.com/mpld3/mpld3/pull/213)解决了这个问题。

我通过添加行来解决这个问题

elif isinstance(obj, (numpy.ndarray,)):
        return obj.tolist()

到 /mpld3/_display.py:NumpyEncoder

谢谢@jaklinger这工作!!!

@jaklinger ,您好,感谢您的建议,它工作得很好! 我只是想澄清一件事-我将numpy数组转换为字典并尝试返回它,但它抛出错误“float 32 is not json serializable”,尽管字典没有问题,打印并检查它。 只需使用您的 tolist() 方法,它就可以将数组转换为 python 列表。
上一个:[100。 0. 0. 0. 0.]
与 tolist: [100.0, 0.0, 0.0, 0.0, 0.0] 并完美返回。
那么究竟是什么问题呢? 提前谢谢了。

@padmaksha18我不是 100% 确定你的意思

将 numpy 数组转换为字典

但是(简而言之) numpypython类型不同( float32floatarraylist等不同)并且JSONEncoder 类仅“允许”本机python类型。 所以......这个函数(包含新修复)的重点是将输入obj转换为原生python等价物。

@jaklinger :嗨乔尔,再次非常感谢。 通过转换为字典,我只是意味着我采用了两个这样的数组并形成了一个键值对,抱歉没有清楚地解释它。 非常感谢您让我清楚这一点,我必须先将其转换为原生 python 类型,这就是问题所在。 只是想让一件事更清楚,比如如果不 jsonify 字典并尝试按原样返回它,那么 jsonencoder 类会出现吗? 非常感谢!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

dansteingart picture dansteingart  ·  31评论

arnaudrenaud picture arnaudrenaud  ·  4评论

ajasja picture ajasja  ·  17评论

pranet picture pranet  ·  6评论

dmiller7115 picture dmiller7115  ·  5评论