Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ipython plotly:无法将x轴打印为日期时间_Python_Datetime_Matplotlib_Plotly - Fatal编程技术网

ipython plotly:无法将x轴打印为日期时间

ipython plotly:无法将x轴打印为日期时间,python,datetime,matplotlib,plotly,Python,Datetime,Matplotlib,Plotly,所以,我在pandas数据框中有数据,其中的行名称在datetime pandas.tseries中给出。我可以在matplotlib中绘制数据,得到如下图: 但是,我想使用plotly在inetarctive模式下绘制相同的图形。它的工作原理如下,但它不显示日期时间,而是用整数索引替换x轴 上面URL中的图是使用以下代码绘制的: dfmean = df.mean(axis=1) dfmean_mavg = pd.rolling_mean(dfmean, 50) dfmean.plot(l

所以,我在pandas数据框中有数据,其中的行名称在datetime pandas.tseries中给出。我可以在matplotlib中绘制数据,得到如下图:

但是,我想使用plotly在inetarctive模式下绘制相同的图形。它的工作原理如下,但它不显示日期时间,而是用整数索引替换x轴

上面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轴上显示datetime索引。我试图强制日期时间索引,如下所示:

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
以及我的数据帧的前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略有不同。如果你好奇,这里有一些信息:

隐藏数字的原因是移动平均线计算。它生成第一个
N
值,其中
N
是你平均的点数

因此,如果您通过操纵数据帧来消除屏蔽值,您将不会再看到该问题

DataFrame.to_json()
对屏蔽值所做的事情(将它们转换为
null
)中获取一个队列,如果您尝试这样做,则列表中最合适的值将是
None
None
最适合转换为
null

整数在x轴上 一点背景知识。当日期在matplotlib中时,它们是浮点值,表示自
0001-01-01
+1以来的天数(有关详细信息,请参阅matplotlib日期)。但是,导入
pandas
将改变此设置,以使用不同的日期表示形式,即自unix纪元以来的天数,另一个浮点数。plotly中的版本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
方法,这就是为什么我选择在上面的代码片段中只包含这个版本

TL;博士,修好它。
Plotly的python api GH repo上有一个PR打开来处理此问题:。明天应该在PyPi上发布。

谢谢!是的,这就是问题所在!当我删除移动平均线图时,x轴正确地显示了日期
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')