加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如果x轴是pandas的日期时间索引,如何绘制多色线

发布时间:2020-12-20 10:34:17 所属栏目:Python 来源:网络整理
导读:我正在尝试使用熊猫系列绘制多色线.我知道matplotlib.collections.LineCollection将大大提升效率. 但是LineCollection要求线段必须是浮点数.我想使用pandas的数据时间索引作为x轴. points = np.array((np.array[df_index.astype('float'),values]).T.reshape
我正在尝试使用熊猫系列绘制多色线.我知道matplotlib.collections.LineCollection将大大提升效率.
但是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提供了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,2)
segments = np.concatenate([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()

enter image description here

由于人们似乎在解释这个概念时遇到了问题,因此这里的代码与上面的代码相同,没有使用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",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,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()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读