[英]ipython plotly: cannot plot x-axis as datetime
因此,我在pandas数据框中有数据,在datetime pandas.tseries中给出了行名。 我可以在matplotlib中绘制数据,得到以下图:
但是,我想在Inetarctive模式下使用plotly绘制相同的图形。 它可以正常工作,但是不显示日期时间,而是将x轴替换为整数索引!
https://plot.ly/~vmirjalily/5/
上面URL中的图是使用以下代码绘制的:
dfmean = df.mean(axis=1)
dfmean_mavg = pd.rolling_mean(dfmean, 50)
dfmean.plot(linewidth=1.5, label='Mean of 20')
dfmean_mavg.plot(linewidth=3, label='Moving Avg.')
#plt.legend(loc=2)
l1 = plt.plot(dfmean, 'b-', linewidth=3)
l2 = plt.plot(dfmean_mavg, 'g-', linewidth=4)
mpl_fig1 = plt.gcf()
py.iplot_mpl(mpl_fig1, filename='avg-price.20stocks')
但是此代码未在x轴上显示日期时间索引。 我试图强制日期时间索引如下:
l1 = plt.plot(np.array(dfmean.index), dfmean, 'b-', linewidth=3)
l2 = plt.plot(np.array(dfmean_mavg.index), dfmean_mavg, 'g-', linewidth=4)
mpl_fig1 = plt.gcf()
py.iplot_mpl(mpl_fig1, filename='avg-price.20stocks')
但是它给出了很多错误,如下所示
:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-35-4a3ca217202d> in <module>()
14 mpl_fig1 = plt.gcf()
15
---> 16 py.iplot_mpl(mpl_fig1, filename='avg-price.20stocks')
/usr/local/lib/python2.7/dist-packages/plotly/plotly/plotly.pyc in iplot_mpl(fig, resize, strip_style, update, **plot_options)
257 "object. Run 'help(plotly.graph_objs.Figure)' for more info."
258 )
--> 259 return iplot(fig, **plot_options)
260
261
/usr/local/lib/python2.7/dist-packages/plotly/plotly/plotly.pyc in iplot(figure_or_data, **plot_options)
113 if 'auto_open' not in plot_options:
114 plot_options['auto_open'] = False
--> 115 res = plot(figure_or_data, **plot_options)
116 urlsplit = res.split('/')
117 username, plot_id = urlsplit[-2][1:], urlsplit[-1] # TODO: HACKY!
/usr/local/lib/python2.7/dist-packages/plotly/plotly/plotly.pyc in plot(figure_or_data, validate, **plot_options)
212 pass
213 plot_options = _plot_option_logic(plot_options)
--> 214 res = _send_to_plotly(figure, **plot_options)
215 if res['error'] == '':
216 if plot_options['auto_open']:
/usr/local/lib/python2.7/dist-packages/plotly/plotly/plotly.pyc in _send_to_plotly(figure, **plot_options)
971 fig = tools._replace_newline(figure) # does not mutate figure
972 data = json.dumps(fig['data'] if 'data' in fig else [],
--> 973 cls=utils._plotlyJSONEncoder)
974 username, api_key = _get_session_username_and_key()
975 kwargs = json.dumps(dict(filename=plot_options['filename'],
/usr/lib/python2.7/json/__init__.pyc in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, encoding, default, **kw)
236 check_circular=check_circular, allow_nan=allow_nan, indent=indent,
237 separators=separators, encoding=encoding, default=default,
--> 238 **kw).encode(obj)
239
240
/usr/lib/python2.7/json/encoder.pyc in encode(self, o)
199 # exceptions aren't as detailed. The list call should be roughly
200 # equivalent to the PySequence_Fast that ''.join() would do.
--> 201 chunks = self.iterencode(o, _one_shot=True)
202 if not isinstance(chunks, (list, tuple)):
203 chunks = list(chunks)
/usr/lib/python2.7/json/encoder.pyc in iterencode(self, o, _one_shot)
262 self.key_separator, self.item_separator, self.sort_keys,
263 self.skipkeys, _one_shot)
--> 264 return _iterencode(o, 0)
265
266 def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
/usr/local/lib/python2.7/dist-packages/plotly/utils.pyc in default(self, obj)
144 if s is not None:
145 return s
--> 146 raise e
147 return json.JSONEncoder.default(self, obj)
148
TypeError: masked is not JSON serializable
这是我的软件包版本:
IPython 2.0.0
numpy 1.9.0
numexpr 2.2.2
pandas 0.15.0
matplotlib 1.4.0
plotly 1.4.7
还有我数据框的前10行:
Date
2011-01-04 54.2430
2011-01-05 54.3935
2011-01-06 54.4665
2011-01-07 54.5920
2011-01-10 54.9435
2011-01-11 54.9340
2011-01-12 55.4755
2011-01-13 55.5495
2011-01-14 56.0230
dtype: float64
这里发生了几件事情。
该回溯告诉您无法序列化屏蔽数字 。 掩码的数字与NaN略有不同。 如果您好奇,这里有一些信息: http : //pandas.pydata.org/pandas-docs/dev/gotchas.html#nan-integer-na-values-and-na-type-promotions
已屏蔽号码的原因是你做的移动平均计算。 它使前N
值(其中N
是您要平均的点数)被屏蔽。
因此,如果通过操纵数据框摆脱了掩盖的值,您将再也不会看到该问题。
从DataFrame.to_json()
掩码值(将其设置为null
)的操作中DataFrame.to_json()
一个队列,如果您尝试沿着掩码方向使用,则在列表中替换为最合适的值将为None
。 None
最好转换为null
。
有点背景。 当日期在matplotlib中时,它们是浮点值,表示自0001-01-01
+ 1开始的天数(有关更多信息,请参见matplotlib日期)。 但是,导入pandas
会将其更改为使用不同的日期表示形式,即距unix纪元以来的天数(另一个浮点数)。 1.4.7版中的目的是通过转换回ISO字符串来处理这两种差异,但是也许您发现了另一条途径。 我似乎无法在终端上重新创建此错误。 这是我尝试的代码:
import random
import pandas as pd
import matplotlib.pyplot as plt
import plotly.plotly as py
import plotly.tools as tls
num_pts = 1000
data = [random.random() for i in range(num_pts)]
index = pd.date_range('2011-01-04', periods=num_pts)
df = pd.DataFrame(data=data, index=index)
dfmean = df.mean(axis=1)
dfmean_mavg = pd.rolling_mean(dfmean, 50)
dfmean.plot(linewidth=1.5, label='Mean of 20')
# dfmean_mavg.plot(linewidth=3, label='Moving Avg.')
mpl_fig1 = plt.gcf()
py.plot_mpl(mpl_fig1, filename='avg-price.20stocks')
plt.plot
看起来您尝试两次绘制数据的一部分? 我对直接在数据帧上调用plot
方法更为熟悉,这就是为什么我选择仅在上面的代码片段中包含此版本。
在Plotly的python api GH repo上有一个PR打开来处理此问题: https : //github.com/plotly/python-api/pull/159 。 明天应该在PyPi上进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.