Pyhon-根据函数的值填充曲线下的

时间:2018-11-19 22:05:22

标签: python matplotlib plot fill spectrum

我有一个在铜棒中进行一维热扩散的动画。我每秒测量一次杆上8个位置的温度,并绘制每秒/帧的测量温度。 (因此,每个图都是使用np.linspace(1,8,8)数据数组绘制的,该数据数组在X轴上指示8个测量点,在Y轴上指示其对应的温度值。) 动画的每一帧如下所示(此图最终会更改):

https://i.stack.imgur.com/iCA5x.png

开始时,所有温度都在约25°C,并且当我们加热棒的右侧(测量点8)时,它会相应地发生变化。

我想实现以下目标,最好使用matplotlib:我想使用一些漂亮的光谱颜色图,根据特定点的值来填充曲线下的空间(如上图所示)。 “喷射”,蓝色表示低温,红色表示高温。因此,在我看来,一开始整个区域都是蓝色,然后当右侧变热时,右侧变为绿色,然后变为黄色,最后变为红色,依此类推,最终绘制出一个光谱。

我尝试在曲线下简单绘制“喷射”颜色图,但没有任何值相关性,但未成功。我的问题:

  1. 我需要定义一个“波长”阵列,以有效地创建漂亮的光谱,而不仅仅是8种颜色不同的列...我对此很满意。
  2. 为什么色谱是在曲线上而不是曲线下绘制的。图片显示了我的问题:https://i.stack.imgur.com/3j4zK.png
  3. 打开此条目的主要原因是:我不知道如何解决问题,如上所述:如何为曲线下方的空间上色

我现在有以下代码,只需将“ 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个温度计的每秒温度数据)。这里会发生什么:

  1. (必需)我用相应的数据刷新当前帧。
  2. (必填),我从图中清除了所有内容,其中fill_between位于上一帧的左侧。
  3. 我正在尝试遵循以下stackoverflow线程:Matplotlib - color under curve based on spectral color
  4. ,绘制白色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_cutupper_cut只是我对数据集的人工裁剪, 我正在做情节。 (我在bottom_cut=100supper_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()

我希望这些信息就足够了。如果您有任何问题,请问他们。感谢您的帮助! :)

0 个答案:

没有答案