Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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 沿每列时间绘制观察值(数据可用性)_Python_Matplotlib_Plot_Time Series - Fatal编程技术网

Python 沿每列时间绘制观察值(数据可用性)

Python 沿每列时间绘制观察值(数据可用性),python,matplotlib,plot,time-series,Python,Matplotlib,Plot,Time Series,我有一个数据框,包含每天的日期和几个站点,在这些站点中有一些天没有测量值,但日期是完整的。我制作了一些样本数据: import pandas as pd import numpy as np np.random.seed(0) rng = pd.date_range('1980-01-01', periods = 24, freq='MS') df = pd.DataFrame({'Date':rng,'Stn1':np.random.randn(len(rng)),'Stn2':np.ran

我有一个数据框,包含每天的日期和几个站点,在这些站点中有一些天没有测量值,但日期是完整的。我制作了一些样本数据:

import pandas as pd
import numpy as np

np.random.seed(0)
rng = pd.date_range('1980-01-01', periods = 24, freq='MS')
df = pd.DataFrame({'Date':rng,'Stn1':np.random.randn(len(rng)),'Stn2':np.random.randn(len(rng)),'Stn3':np.random.randn(len(rng))  })
df.loc[df['Stn1'] > 1,'Stn1'] = np.nan
df.loc[df['Stn2'] < -1,'Stn2'] = np.nan
df.loc[df['Stn3'] > 0,'Stn3'] = np.nan
我想做的是得到这样的东西:

在X轴上有日期,在Y轴上有每个测站和每个测站的测量日期,因此当测站有NaN时,会有一个间隙。
有什么想法吗?

最好的选择是用其他东西更改NAN,或者完全删除它们


您可以使用此选项删除NAN值。

最好的选择是使用其他内容更改NAN,或者完全删除它们

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

np.random.seed(0)
rng = pd.date_range('1980-01-01', periods = 24, freq='MS')
df = pd.DataFrame({'Date':rng,'Stn1':np.random.randn(len(rng)),'Stn2':np.random.randn(len(rng)),'Stn3':np.random.randn(len(rng))  })
df.loc[df['Stn1'] > 1,'Stn1'] = np.nan
df.loc[df['Stn2'] < -1,'Stn2'] = np.nan
df.loc[df['Stn3'] > 0,'Stn3'] = np.nan

df = df.set_index('Date')

for i, col in enumerate(df.columns):
    df[col].loc[~df[col].isnull()] = i+1

fig, ax = plt.subplots(1, 1, figsize = (15, 5), dpi=300)
p = sns.pointplot(y=0,x='Date', data=df1, hue='level_1')
ax.set_ylabel('')
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles=handles[0:], labels=labels[0:])
fig.autofmt_xdate()
p.set(yticklabels=[]);
您可以使用此选项删除NAN值。

将熊猫作为pd导入
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

np.random.seed(0)
rng = pd.date_range('1980-01-01', periods = 24, freq='MS')
df = pd.DataFrame({'Date':rng,'Stn1':np.random.randn(len(rng)),'Stn2':np.random.randn(len(rng)),'Stn3':np.random.randn(len(rng))  })
df.loc[df['Stn1'] > 1,'Stn1'] = np.nan
df.loc[df['Stn2'] < -1,'Stn2'] = np.nan
df.loc[df['Stn3'] > 0,'Stn3'] = np.nan

df = df.set_index('Date')

for i, col in enumerate(df.columns):
    df[col].loc[~df[col].isnull()] = i+1

fig, ax = plt.subplots(1, 1, figsize = (15, 5), dpi=300)
p = sns.pointplot(y=0,x='Date', data=df1, hue='level_1')
ax.set_ylabel('')
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles=handles[0:], labels=labels[0:])
fig.autofmt_xdate()
p.set(yticklabels=[]);
将numpy作为np导入 导入seaborn作为sns 将matplotlib.pyplot作为plt导入 np.random.seed(0) rng=pd.日期范围('1980-01-01',周期=24,频率=MS') df=pd.DataFrame({'Date':rng,'Stn1':np.random.randn(len(rng)),'Stn2':np.random.randn(len(rng)),'Stn3':np.random.randn(len(rng))) df.loc[df['Stn1']>1,'Stn1']=np.nan df.loc[df['Stn2']<-1,'Stn2']=np.nan df.loc[df['Stn3']>0,'Stn3']=np.nan df=df.set_索引(“日期”) 对于i,枚举中的列(df.列): df[col].loc[~df[col].isnull()]=i+1 图,ax=plt.子批次(1,1,figsize=(15,5),dpi=300) p=sns.pointplot(y=0,x='Date',data=df1,hue='level_1') ax.set_ylabel(“”) 句柄,标签=ax.get\u legend\u handles\u labels() 图例(句柄=句柄[0:],标签=标签[0:] 图autofmt_xdate() p、 设置(yticklabels=[]);
输出

将熊猫作为pd导入
将numpy作为np导入
导入seaborn作为sns
将matplotlib.pyplot作为plt导入
np.random.seed(0)
rng=pd.日期范围('1980-01-01',周期=24,频率=MS')
df=pd.DataFrame({'Date':rng,'Stn1':np.random.randn(len(rng)),'Stn2':np.random.randn(len(rng)),'Stn3':np.random.randn(len(rng)))
df.loc[df['Stn1']>1,'Stn1']=np.nan
df.loc[df['Stn2']<-1,'Stn2']=np.nan
df.loc[df['Stn3']>0,'Stn3']=np.nan
df=df.set_索引(“日期”)
对于i,枚举中的列(df.列):
df[col].loc[~df[col].isnull()]=i+1
图,ax=plt.子批次(1,1,figsize=(15,5),dpi=300)
p=sns.pointplot(y=0,x='Date',data=df1,hue='level_1')
ax.set_ylabel(“”)
句柄,标签=ax.get\u legend\u handles\u labels()
图例(句柄=句柄[0:],标签=标签[0:]
图autofmt_xdate()
p、 设置(yticklabels=[]);
输出

像这样的事

import matplotlib.pylab as plt
import datetime
from matplotlib import dates as mdates

n = 3 # number of stations
stns = ['']
for i in range(n):
    stn = 'Stn' + str(i+1)
    stns.append(stn)
    df.loc[~np.isnan(df[stn]), stn] = i+1
df['Date'] = df['Date'].dt.strftime('%Y-%m-%d')
dates = df.Date
df.set_index('Date', inplace=True)
ax = df.plot(legend=False)
ax.set_yticks(range(n+1))
ax.set_yticklabels(stns)
ax.set_xticks(range(len(dates)))
ax.set_xticklabels(dates, rotation=45, ha='right')
plt.tight_layout()
plt.show()
有输出

像这样的事

import matplotlib.pylab as plt
import datetime
from matplotlib import dates as mdates

n = 3 # number of stations
stns = ['']
for i in range(n):
    stn = 'Stn' + str(i+1)
    stns.append(stn)
    df.loc[~np.isnan(df[stn]), stn] = i+1
df['Date'] = df['Date'].dt.strftime('%Y-%m-%d')
dates = df.Date
df.set_index('Date', inplace=True)
ax = df.plot(legend=False)
ax.set_yticks(range(n+1))
ax.set_yticklabels(stns)
ax.set_xticks(range(len(dates)))
ax.set_xticklabels(dates, rotation=45, ha='right')
plt.tight_layout()
plt.show()
有输出


但我不想删除Nan,我想保留每个电台没有测量值的位置。您可以使用非常清楚的值对其进行更改,然后执行if语句并保留这些值。但我不想删除Nan,我想保留每个站点没有测量值的位置。您可以使用非常已知和清晰的值更改它们,然后执行if语句并保留这些值。您好,我尝试运行您的代码。然而,我注意到在p=sns.pointplot(…)中,数据中有一个“df1”。我将其更改为df。但是我得到一个错误,上面写着“ValueError:无法解释输入‘Date’”。您知道如何修复它吗?您好,我试着运行您的代码。然而,我注意到在p=sns.pointplot(…)中,数据中有一个“df1”。我将其更改为df。但是,我得到一个错误,上面写着“ValueError:无法解释输入‘日期’”.你知道如何修复它吗?是的!就像那样。但是如果我有更多的电台,我就必须把它放在一个for循环中,对吗?用更通用的解决方案@Ann MYes!像那样更新帖子。但是如果我有更多的电台,我就必须把它放在一个for循环中对吗?用更通用的解决方案@Ann M更新帖子