我正在尝试使用熊猫系列绘制多色线.我知道matplotlib.collections.LineCollection将大大提升效率. 但是LineCollection要求线段必须是浮点数.我想使用pandas的数据时间索引作为x轴. points = np.array((n
但是LineCollection要求线段必须是浮点数.我想使用pandas的数据时间索引作为x轴.
points = np.array((np.array[df_index.astype('float'), values]).T.reshape(-1,1,2)) segments = np.concatenate([points[:-1],points[1:]], axis=1) lc = LineCollection(segments) fig = plt.figure() plt.gca().add_collection(lc) plt.show()
但图片不能让我满意.
有什么解决方案吗?
对于转换,matplotlib提供了matplotlib.dates.date2num.这可以理解日期时间对象,因此您首先需要使用series.index.to_pydatetime()将时间序列转换为datetime,然后应用date2num.
s = pd.Series(y, index=dates) inxval = mdates.date2num(s.index.to_pydatetime())
然后,您可以像往常一样使用数字点,例如绘制为Polygon或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() #convert dates to numbers first 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) # set color to date values lc.set_array(inxval) # note that you could also set the colors according to y values # lc.set_array(s.values) # add collection to axes 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()
由于人们似乎在解释这个概念时遇到了问题,因此这里的代码与上面的代码相同,没有使用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() #convert dates to numbers first 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) # set color to date values lc.set_array(c) ax.add_collection(lc) loc = mdates.AutoDateLocator() ax.xaxis.set_major_locator(loc) ax.xaxis.set_major_formatter(mdates.AutoDateFormatter(loc)) ax.autoscale_view() plt.show()