作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我想要完成的任务的简化版本。我正在关注this example来自 matplotlib 网站的五彩线条。
我正在尝试绘制一组时间序列数据,并根据不同的数组对线条进行着色。在下面的简单示例中,我绘制了 y=x^2,并根据其导数 dy/dx = 2x 对线条进行了着色。
当我使用仅包含 float 的 x 轴时(如下所示),它工作得很好。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
# Generate data
x = np.linspace(0,10, 60)
y = x ** 2
dydx = 2*x
# Create arrays needed for multicolored lines
points = np.array([x, y]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
norm = plt.Normalize(dydx.min(), dydx.max())
# Plot
fig, ax = plt.subplots(1,1, figsize=(10,10))
lc = LineCollection(segments, cmap='jet', norm=norm)
lc.set_array(dydx)
lc.set_linewidth(2)
line = ax.add_collection(lc)
fig.colorbar(line, ax=ax)
ax.set_xlim(x.min(), x.max())
ax.set_ylim(y.min(), y.max())
plt.show()
哪个产生
但是,如果我尝试绘制时间序列数据(其中 x 轴是 datetime64[ns] 数组),则无法正常工作。在下面的示例中,我将 x 替换为 x_time。
# Generate time array
ts = np.datetime64('2020-01-01T00:00:00')
te = np.datetime64('2020-01-01T01:00:00')
x_time = np.arange(ts, te, np.timedelta64(1,'m'), dtype='datetime64[ns]')
# Create arrays needed for multicolored lines
points = np.array([x_time, y]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
norm = plt.Normalize(dydx.min(), dydx.max())
# Plot
fig, ax = plt.subplots(1,1, figsize=(10,10))
lc = LineCollection(segments, cmap='jet', norm=norm)
lc.set_array(dydx)
lc.set_linewidth(2)
line = ax.add_collection(lc)
fig.colorbar(line, ax=ax)
ax.set_xlim(x_time.min(), x_time.max())
ax.set_ylim(y.min(), y.max())
plt.show()
这会产生一个带有右侧 x 任何 y 轴刻度的图形,但没有线条
编辑:好吧,我知道线路去了哪里。当我创建 segments
数组时,它将 datetime64[ns]
转换为整数表示形式。通常,matplotlib 能够将其解释为日期时间,但在本例中,由于 LineCollection
,它将其保留为 int
设置ax.set_xlim(segments[:,:,0].min(),segments[:,:,0].max())
显示我的线,但轴是错误的(不显示为时间)。
最佳答案
您需要
所以:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
import matplotlib.dates as mdates
# Generate data
x = np.linspace(0,10, 60)
y = x ** 2
dydx = 2*x
# Generate time array
ts = np.datetime64('2020-01-01T00:00:00')
te = np.datetime64('2020-01-01T01:00:00')
x_time = np.arange(ts, te, np.timedelta64(1,'m'), dtype='datetime64[ns]')
x_time = mdates.date2num(x_time)
# Create arrays needed for multicolored lines
points = np.array([x_time, y]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
norm = plt.Normalize(dydx.min(), dydx.max())
# Plot
fig, ax = plt.subplots(1,1, figsize=(10,10))
lc = LineCollection(segments, cmap='jet', norm=norm)
lc.set_array(dydx)
lc.set_linewidth(2)
line = ax.add_collection(lc)
fig.colorbar(line, ax=ax)
ax.xaxis_date()
ax.autoscale()
plt.show()
关于python - 带 datetime64[ns] 轴的 Matplotlib 多彩线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59689024/
我是一名优秀的程序员,十分优秀!