我有一个在铜棒中进行一维热扩散的动画。我每秒测量一次杆上8个位置的温度,并绘制每秒/帧的测量温度。 (因此,每个图都是使用np.linspace(1,8,8)
数据数组绘制的,该数据数组在X轴上指示8个测量点,在Y轴上指示其对应的温度值。)
动画的每一帧如下所示(此图最终会更改):
https://i.stack.imgur.com/iCA5x.png
开始时,所有温度都在约25°C,并且当我们加热棒的右侧(测量点8)时,它会相应地发生变化。
我想实现以下目标,最好使用matplotlib:我想使用一些漂亮的光谱颜色图,根据特定点的值来填充曲线下的空间(如上图所示)。 “喷射”,蓝色表示低温,红色表示高温。因此,在我看来,一开始整个区域都是蓝色,然后当右侧变热时,右侧变为绿色,然后变为黄色,最后变为红色,依此类推,最终绘制出一个光谱。
我尝试在曲线下简单绘制“喷射”颜色图,但没有任何值相关性,但未成功。我的问题:
我现在有以下代码,只需将“ jet” cmap绘制在从“ x”值1到8的曲线下。
首先定义图形:
nrows=1
ncols=1
fig, axes = plt.subplots(nrows=nrows, ncols=ncols)
wavelengths = np.linspace(1, 8, 1000)
for i in range(0,8):
y_arr[i] = hidegmeleg[bottom_cut, i+1]
line, = axes.plot([], [], c='red')
axes.set_xlim(1,8)
axes.set_ylim(20,100)
动画(coldhot_dataset
包含所有8个温度计的每秒温度数据)。这里会发生什么:
fill_between
位于上一帧的左侧。fill_between
,并在其顶部绘制cmap='jet'
光谱。
所以动画:
def animate(current_time):
x_arr = np.linspace(1,8,8)
y_arr = np.empty(8)
for i in range(0,8):
y_arr[i] = coldhot_dataset[current_time, i+1]
# Clear fill_between canvas
axes.collections.clear()
line.set_data(x_arr, y_arr)
X,Y = np.meshgrid(wavelengths, y_arr)
extent=(np.min(wavelengths), np.max(wavelengths), np.min(y_arr), np.max(y_arr))
axes.imshow(X, clim=(min(wavelengths), max(wavelengths)), extent=extent, cmap=plt.get_cmap('jet'), aspect='auto')
plt.fill_between(x_arr, y_arr, 8, color='w')
return line,
这里bottom_cut
和upper_cut
只是我对数据集的人工裁剪,
我正在做情节。 (我在bottom_cut=100s
和upper_cut=2500s
处裁剪了数据集)
steps = [i for i in range(bottom_cut, upper_cut+1)]
anim = FuncAnimation(fig=fig, func=animate, init_func=init_func, frames=steps, interval=20, blit=False, repeat=True)
plt.show()
我希望这些信息就足够了。如果您有任何问题,请问他们。感谢您的帮助! :)