Python Matlibplot和scipy插值:显示并均匀分散日期

Python Matlibplot和scipy插值:显示并均匀分散日期,python,matplotlib,scipy,Python,Matplotlib,Scipy,在Python中,我试图绘制两个图形,但我确实在疯狂地处理x轴上的日期,因为我使用的是来自scipy的插值,它不接受matlibplot所接受的日期格式。我实现了到可接受格式的转换,但随后我的图表被压扁,日期都在一个位置上彼此打印 这是原始代码: f = interp1d(dates_unix_raw, pis_raw, kind='cubic') g = interp1d(dates_unix_io, pis_io, kind='cubic') x = np.linspace(dates_un

在Python中,我试图绘制两个图形,但我确实在疯狂地处理x轴上的日期,因为我使用的是来自scipy的插值,它不接受matlibplot所接受的日期格式。我实现了到可接受格式的转换,但随后我的图表被压扁,日期都在一个位置上彼此打印

这是原始代码:

f = interp1d(dates_unix_raw, pis_raw, kind='cubic')
g = interp1d(dates_unix_io, pis_io, kind='cubic')
x = np.linspace(dates_unix_raw[0],dates_unix_raw[-1],smooth_factor_raw)
y = np.linspace(dates_unix_io[0],dates_unix_io[-1],smooth_factor_io)

plt.plot(x, f(x), '-') 
plt.plot(y, g(y), '--')
plt.xlabel("Time-Delta: " + str(dates_raw[0]) + " - " + str(dates_raw[-1]))
plt.ylabel('PIs')
plt.gcf().autofmt_xdate()
plt.title(domain)
我有上面的代码生成下面的输出
您可以在此处找到完整的代码:

dates\u raw
dates\u io
中,我有一个假定Matlibplot可接受的列表.strftime格式的“日期”,在dates\u unix\u raw和
dates\u io\u raw中,我有unix时间戳

pis_raw
pis_io
是带有整数值的列表


Q:我如何在x轴上均匀地显示dates\u io或dates\u raw(哪一个不重要)的日期?

看起来您的
数据\u raw
数据\u io
是相同的。下面的示例应该可以帮助您实现这一目标:

import matplotlib as mpl
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d

dates_unix_raw = [1402185606.0, 1402272005.0, 1402358406.0, 1402444805.0, 1402531206.0, 1402617606.0, 1402704005.0, 1402790405.0, 1402876804.0, 1402963205.0, 1403049605.0, 1403136005.0, 1403222406.0, 1403308807.0, 1403395206.0, 1403481606.0, 1403568006.0, 1403654405.0, 1403740805.0, 1403827205.0, 1403913605.0, 1404000006.0, 1404086405.0, 1404172805.0, 1404259206.0, 1404345605.0, 1404432004.0, 1404518405.0, 1404604806.0, 1404691206.0]
dates_unix_io = [1402178400.0, 1402264800.0, 1402351200.0, 1402437600.0, 1402524000.0, 1402610400.0, 1402696800.0, 1402783200.0, 1402869600.0, 1402956000.0, 1403042400.0, 1403128800.0, 1403215200.0, 1403301600.0, 1403388000.0, 1403474400.0, 1403560800.0, 1403647200.0, 1403733600.0, 1403820000.0, 1403906400.0, 1403992800.0, 1404079200.0, 1404165600.0, 1404252000.0, 1404338400.0, 1404424800.0, 1404511200.0, 1404597600.0, 1404684000.0]

dates_raw = ['2014-06-08', '2014-06-09', '2014-06-10', '2014-06-11', '2014-06-12', '2014-06-13', '2014-06-14', '2014-06-15', '2014-06-16', '2014-06-17', '2014-06-18', '2014-06-19', '2014-06-20', '2014-06-21', '2014-06-22', '2014-06-23', '2014-06-24', '2014-06-25', '2014-06-26', '2014-06-27', '2014-06-28', '2014-06-29', '2014-06-30', '2014-07-01', '2014-07-02', '2014-07-03', '2014-07-04', '2014-07-05', '2014-07-06', '2014-07-07']
dates_io = ['2014-06-08', '2014-06-09', '2014-06-10', '2014-06-11', '2014-06-12', '2014-06-13', '2014-06-14', '2014-06-15', '2014-06-16', '2014-06-17', '2014-06-18', '2014-06-19', '2014-06-20', '2014-06-21', '2014-06-22', '2014-06-23', '2014-06-24', '2014-06-25', '2014-06-26', '2014-06-27', '2014-06-28', '2014-06-29', '2014-06-30', '2014-07-01', '2014-07-02', '2014-07-03', '2014-07-04', '2014-07-05', '2014-07-06', '2014-07-07']

pis_raw = [205742, 233162, 290272, 364284, 363555, 340799, 313614, 274266, 311757, 353822, 360780, 335548, 355210, 342263, 246891, 321237, 69446, 20, 24, 12, 9, 10, 22, 11, 12, 266469, 323873, 256060, 281979, 313210]
pis_io = [213660, 240602, 298600, 374582, 375739, 353645, 324713, 281913, 318321, 364016, 368859, 345466, 364679, 352250, 253938, 327049, 73698, 21, 19, 9, 9, 16, 11, 9, 6, 272650, 338088, 264947, 284192, 314740]

f = interp1d(dates_unix_raw, pis_raw, kind='cubic')
g = interp1d(dates_unix_io, pis_io, kind='cubic')
x = np.linspace(dates_unix_raw[0],dates_unix_raw[-1],100)
y = np.linspace(dates_unix_io[0],dates_unix_io[-1],100)
T = pd.to_datetime(dates_raw)
plt.plot(mpl.dates.num2date(np.linspace(*mpl.dates.date2num(T.to_pydatetime())[[0, -1]], num=100)), f(x), '-') 
plt.plot(mpl.dates.num2date(np.linspace(*mpl.dates.date2num(T.to_pydatetime())[[0, -1]], num=100)), g(y), '--')
plt.xlabel("Time-Delta " + str(dates_raw[0]) + " - " + str(dates_raw[-1]))
plt.ylabel('PIs')
plt.gcf().autofmt_xdate()
基本上有
mpl.dates.num2date
mpl.dates.date2num
方法,您可以使用它们来来回转换时间到数字。我使用
pandas
转换
str
列表中的日期。当然还有其他的方法,但我认为pd.to_datetime是最简洁的


示例性答案,呈现得非常好。