当我使用xticks
参数时,我在摆弄熊猫情节时遇到了这个错误。
概念证明在这里:
http://nbviewer.ipython.org/gist/edvakf/a47a41ace10afbd891ff
(修改http://pandas.pydata.org/pandas-docs/stable/visualization.html)
啊 - 看起来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 数组转换为字典
但是(简而言之) numpy
和python
类型不同( float32
与float
; array
与list
等不同)并且JSONEncoder 类仅“允许”本机python
类型。 所以......这个函数(包含新修复)的重点是将输入obj
转换为原生python
等价物。
@jaklinger :嗨乔尔,再次非常感谢。 通过转换为字典,我只是意味着我采用了两个这样的数组并形成了一个键值对,抱歉没有清楚地解释它。 非常感谢您让我清楚这一点,我必须先将其转换为原生 python 类型,这就是问题所在。 只是想让一件事更清楚,比如如果不 jsonify 字典并尝试按原样返回它,那么 jsonencoder 类会出现吗? 非常感谢!
点安装“git+ https://github.com/javadba/mpld3@display_fix ”
最有用的评论
我通过添加行来解决这个问题
到 /mpld3/_display.py:NumpyEncoder