Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.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
Python matplotlib pyplot无法沿x轴准确表示时间_Python_Pandas_Matplotlib_Dataframe - Fatal编程技术网

Python matplotlib pyplot无法沿x轴准确表示时间

Python matplotlib pyplot无法沿x轴准确表示时间,python,pandas,matplotlib,dataframe,Python,Pandas,Matplotlib,Dataframe,我有一个JSON数组,大约有3000条记录,每条记录间隔1分钟,我想使用matplotlib在时间序列图上绘制这些记录。但是,我无法将数据正确地显示在日期和时间沿x轴的图表上 记录的格式如下: { "datetime": "10-07-2017 21:57:37", "deviceid": "PiJCLabDoor", "dht11": 24.0, "dht22": null, "id": 39751, "motion": 0.0,

我有一个JSON数组,大约有3000条记录,每条记录间隔1分钟,我想使用
matplotlib
在时间序列图上绘制这些记录。但是,我无法将数据正确地显示在日期和时间沿x轴的图表上

记录的格式如下:

{
    "datetime": "10-07-2017  21:57:37", 
    "deviceid": "PiJCLabDoor", 
    "dht11": 24.0, 
    "dht22": null, 
    "id": 39751, 
    "motion": 0.0, 
    "pressure": null, 
    "uv": 0.04, 
    "voc": 126.0
  }


我有以下代码

import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt

data = pd.read_json('PiJCLabDoor.json', convert_dates=['datetime'])
dataframe = DataFrame(data)

for i in range(0, dataframe.shape[0] -1):

    if (dataframe.loc[i, 'dht11'] - dataframe.loc[i+1, 'dht11']) > 3 :
    dataframe.loc[i+1, 'dht11'] = dataframe.loc[i,'dht11']
这些代码行生成以下图表:

plt.figure(figsize=(20,7)
plt.plot(dataframe['datetime'], dataframe['dht11'])
plt.show()
plt.rcParams['figure.figsize'] = (20,6)
plt.plot(dataframe['dht11'])
plt.show()

这些代码行生成以下图表:

plt.figure(figsize=(20,7)
plt.plot(dataframe['datetime'], dataframe['dht11'])
plt.show()
plt.rcParams['figure.figsize'] = (20,6)
plt.plot(dataframe['dht11'])
plt.show()

第二个图表是数据的外观,但是第一个图表在x轴上有日期

如何获取显示在第二张图表x轴上的日期和时间?
谢谢

首先,请记住将datetime转换为datetime(pd.to_datetime()) 要使日期显示在第二个图形上,请将datetime列设置为索引,如下所示:

plt.plot(dataframe.set_index('datetime')['dht11'])
编辑:

如果我没弄错的话,你会得到这样的结果:

plt.xticks(x[::3], a['date'][::3], rotation=45)

日期之间有一周的间隔,您希望它们彼此相邻,因此:

x = np.arange(len(a['date']))

plt.plot(x, a['value'])
plt.xticks(x, a['date'], rotation=45)
首先,我在你的第一张图中做了一些类似的事情,然后我将xlabel的名称更改为与日期相同。结果如下:

但您可能会发现xticks出现得太频繁,然后只需更改其中一行,如下所示:

plt.xticks(x[::3], a['date'][::3], rotation=45)
因此,现在图表上只会显示第三个日期

编辑2:

如果要在X轴上仅设置X个主要日期,请使用以下选项:

from matplotlib.ticker import LinearLocator
plt.plot(x, a['value'])
plt.xticks(x, a['date'], rotation=45)
ax = plt.gca()
ax.get_xaxis().set_major_locator(LinearLocator(numticks=5))

在numticks中,您指定应该显示多少个记号

首先,请记住将datetime转换为datetime(pd.to_datetime()) 要使日期显示在第二个图形上,请将datetime列设置为索引,如下所示:

plt.plot(dataframe.set_index('datetime')['dht11'])
编辑:

如果我没弄错的话,你会得到这样的结果:

plt.xticks(x[::3], a['date'][::3], rotation=45)

日期之间有一周的间隔,您希望它们彼此相邻,因此:

x = np.arange(len(a['date']))

plt.plot(x, a['value'])
plt.xticks(x, a['date'], rotation=45)
首先,我在你的第一张图中做了一些类似的事情,然后我将xlabel的名称更改为与日期相同。结果如下:

但您可能会发现xticks出现得太频繁,然后只需更改其中一行,如下所示:

plt.xticks(x[::3], a['date'][::3], rotation=45)
因此,现在图表上只会显示第三个日期

编辑2:

如果要在X轴上仅设置X个主要日期,请使用以下选项:

from matplotlib.ticker import LinearLocator
plt.plot(x, a['value'])
plt.xticks(x, a['date'], rotation=45)
ax = plt.gca()
ax.get_xaxis().set_major_locator(LinearLocator(numticks=5))


在numticks中,您可以指定应该显示多少个刻度。

好吧,它可以准确地表示您的数据,
“dht11”
在2017-06-14和2017-09-04之间的日期可以很好且稳定。请注意,第二个图显示了均匀x分布的代码。换句话说,在第二个图上显示日期是没有意义的,因为这意味着轴比例变得不稳定和非线性。第一张图表是以时间为单位的数据的精确表示,因此这是应该使用的图表。嗨,Vinicius,谢谢你的回复。第二个是精确的表示,因为每条记录相隔一分钟,所以它们绝对是线性间隔的。我在d3.js中绘制了数据,效果很好(如第二张图)。数据也是关于温度的,检查数据集发现数据分布与图1完全不同。i、 e温度不会在24小时内保持稳定,然后上升和下降2小时,然后再次保持稳定。再看一遍,我确信它将一天解释为一个月,因为只有2天的数据,它用两条静态线填充了其余的数据。好吧,它可以准确地表示您的数据,
“dht11”
在2017-06-14和2017-09-04之间的日期可以很好且稳定。请注意,第二个图显示了均匀x分布的代码。换句话说,在第二个图上显示日期是没有意义的,因为这意味着轴比例变得不稳定和非线性。第一张图表是以时间为单位的数据的精确表示,因此这是应该使用的图表。嗨,Vinicius,谢谢你的回复。第二个是精确的表示,因为每条记录相隔一分钟,所以它们绝对是线性间隔的。我在d3.js中绘制了数据,效果很好(如第二张图)。数据也是关于温度的,检查数据集发现数据分布与图1完全不同。i、 e温度不会在24小时内保持稳定,然后上升和下降2小时,然后再次保持稳定。再看一次,我确信它将一天解释为一个月,因为只有2天的数据,它将用两条静态线填充其余的数据。谢谢,这将创建第一个图表,但它仍然将月份解释为日期,反之亦然。我已经尝试过pd.to_datetime()的各种方法,但都无法使其发挥作用。因此,您希望删除不稳定数据之间的直线,使三组数据更接近,并保持日期不变?编辑:抱歉,我误读了您的答案。让我改变我的代码!非常感谢你,卡珀!这几乎正是我想要的,我现在唯一的问题是,XTICK打印在彼此的顶部,即使我限制它们每500个日期说一次对不起,这样一个需要n00b的人!再次感谢!非常感谢。你是真正的主人!谢谢,这创建了第一个图表,但是它仍然将月份解释为日期,反之亦然。我已经尝试过pd.to_datetime()的各种方法,但都无法使其发挥作用。因此,您希望删除不稳定数据之间的直线,使三组数据更接近,并保持日期不变?编辑:抱歉,我误读了您的答案。让我改变我的代码!非常感谢你,卡珀!这几乎正是我想要的,我现在唯一的问题是,XTICK打印在彼此的顶部,即使我限制它们每500个日期说一次对不起,这样一个需要n00b的人!再次感谢!非常感谢。你是真正的主人!