要生成一个多色线条,您需要首先将日期转换为数字,因为Matplotlib内部只使用数值。为了进行转换,Matplotlib提供了
matplotlib.dates.date2num
。这个函数可以理解日期时间对象,所以您需要首先将时间序列转换为日期时间,使用
series.index.to_pydatetime()
,然后应用
date2num
。
s = pd.Series(y, index=dates)
inxval = mdates.date2num(s.index.to_pydatetime())
然后您可以像往常一样使用数字点,例如将其绘制为多边形或LineCollection[1,2]。
完整示例:
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
from matplotlib.collections import LineCollection
dates = pd.date_range("2017-01-01", "2017-06-20", freq="7D" )
y = np.cumsum(np.random.normal(size=len(dates)))
s = pd.Series(y, index=dates)
fig, ax = plt.subplots()
inxval = mdates.date2num(s.index.to_pydatetime())
points = np.array([inxval, s.values]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-1],points[1:]], axis=1)
lc = LineCollection(segments, cmap="plasma", linewidth=3)
lc.set_array(inxval)
ax.add_collection(lc)
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_minor_locator(mdates.DayLocator())
monthFmt = mdates.DateFormatter("%b")
ax.xaxis.set_major_formatter(monthFmt)
ax.autoscale_view()
plt.show()
![在此输入图像描述](https://istack.dev59.com/wd40V.webp)
由于人们似乎难以抽象化这个概念,因此在这里提供了一个不使用pandas和具有独立颜色数组的相同代码片段:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np; np.random.seed(42)
from matplotlib.collections import LineCollection
dates = np.arange("2017-01-01", "2017-06-20", dtype="datetime64[D]" )
y = np.cumsum(np.random.normal(size=len(dates)))
c = np.cumsum(np.random.normal(size=len(dates)))
fig, ax = plt.subplots()
inxval = mdates.date2num(dates)
points = np.array([inxval, y]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-1],points[1:]], axis=1)
lc = LineCollection(segments, cmap="plasma", linewidth=3)
lc.set_array(c)
ax.add_collection(lc)
ax.xaxis_date()
ax.autoscale_view()
plt.show()