[英]ipython plotly: cannot plot x-axis as datetime
So, I have data in pandas dataframe, where row names are given in datetime pandas.tseries. 因此,我在pandas数据框中有数据,在datetime pandas.tseries中给出了行名。 I can plot the data in matplotlib and I get this figure:
我可以在matplotlib中绘制数据,得到以下图:
however, I want to use plotly to draw the same graph in inetarctive mode. 但是,我想在Inetarctive模式下使用plotly绘制相同的图形。 It works follows, but it doesn't show the datetime, instead it replaces the x-axis with integer indexing!
它可以正常工作,但是不显示日期时间,而是将x轴替换为整数索引!
https://plot.ly/~vmirjalily/5/ https://plot.ly/~vmirjalily/5/
The figure in the URL above is plotted using this code: 上面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')
but this code doesn't show the datetime index in the x-axis. 但是此代码未在x轴上显示日期时间索引。 I tried to force the datetime index as below:
我试图强制日期时间索引如下:
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')
but it gave a long list of errors as below 但是它给出了很多错误,如下所示
:
---------------------------------------------------------------------------
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
Here is my package versions: 这是我的软件包版本:
IPython 2.0.0
numpy 1.9.0
numexpr 2.2.2
pandas 0.15.0
matplotlib 1.4.0
plotly 1.4.7
And the first 10 lines of my dataframe: 还有我数据框的前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
There are a couple things going on here. 这里发生了几件事情。
This traceback is telling you that you can't serialize masked numbers . 该回溯告诉您无法序列化屏蔽数字 。 Masked numbers are slightly different than NaN.
掩码的数字与NaN略有不同。 Here's a bit of info if you're curious: http://pandas.pydata.org/pandas-docs/dev/gotchas.html#nan-integer-na-values-and-na-type-promotions
如果您好奇,这里有一些信息: http : //pandas.pydata.org/pandas-docs/dev/gotchas.html#nan-integer-na-values-and-na-type-promotions
The reason you have masked numbers is the moving average calculation you do. 已屏蔽号码的原因是你做的移动平均计算。 It makes the first
N
values, where N
is the number of points you're averaging over, masked. 它使前
N
值(其中N
是您要平均的点数)被屏蔽。
Therefore, if you get rid of the masked values by manipulating the data frame, you wouldn't see that issue any more. 因此,如果通过操纵数据框摆脱了掩盖的值,您将再也不会看到该问题。
Taking a queue from what DataFrame.to_json()
does with masked values (turns them to null
), the most appropriate value to replace with in your list would be None
if you try to go down that road. 从
DataFrame.to_json()
掩码值(将其设置为null
)的操作中DataFrame.to_json()
一个队列,如果您尝试沿着掩码方向使用,则在列表中替换为最合适的值将为None
。 None
translates best to null
. None
最好转换为null
。
A bit of background. 有点背景。 When dates are in matplotlib, they are floating-point values representing the number of days since
0001-01-01
+ 1, (see matplotlib dates for more info). 当日期在matplotlib中时,它们是浮点值,表示自
0001-01-01
+ 1开始的天数(有关更多信息,请参见matplotlib日期)。 However, importing pandas
will alter this to use a different date representation, the number of days since the unix epoch, another floating point number. 但是,导入
pandas
会将其更改为使用不同的日期表示形式,即距unix纪元以来的天数(另一个浮点数)。 Version 1.4.7 in plotly was meant to handle both discrepancies by converting back to an ISO string, but perhaps there's another avenue that you've found. 1.4.7版中的目的是通过转换回ISO字符串来处理这两种差异,但是也许您发现了另一条途径。 I can't seem to recreate this error on my end though.
我似乎无法在终端上重新创建此错误。 Here's the code I tried:
这是我尝试的代码:
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
on the series plt.plot
It looks like you try to plot the portions of your data twice? 看起来您尝试两次绘制数据的一部分? I'm more familiar with calling the
plot
method directly on a data frame, which is why I chose to only include this version in the code snippet above. 我对直接在数据帧上调用
plot
方法更为熟悉,这就是为什么我选择仅在上面的代码片段中包含此版本。
There's a PR open on Plotly's python api GH repo to handle this: https://github.com/plotly/python-api/pull/159 . 在Plotly的python api GH repo上有一个PR打开来处理此问题: https : //github.com/plotly/python-api/pull/159 。 It should be up on PyPi tomorrow.
明天应该在PyPi上进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.