<h3>编辑</h3>
<p>为了回答编辑后的问题,这里有一种替代方法,它垂直地进行渐变,但不使用<code>imshow</code>。你知道吗</p>
<pre class="lang-py prettyprint-override"><code>import matplotlib.pyplot as plt
from matplotlib import colors, patches
import numpy as np
import pandas as pd
n = 100
nc = 100
x = np.linspace(0, np.pi*5, n)
y1 = [-50.0]
y2 = [50.0]
for ii in range(1, n):
y1.append(y1[ii-1] + (np.random.random()-0.3)*3)
y2.append(y2[ii-1] + (np.random.random()-0.5)*3)
y1 = np.array(y1)
y2 = np.array(y2)
z = np.linspace(0, 10, nc)
normalize = colors.Normalize(vmin=z.min(), vmax=z.max())
cmap = plt.cm.get_cmap('winter')
fig, ax = plt.subplots(1)
for ii in range(len(df['x'].values)-1):
y = np.linspace(y1[ii], y2[ii], nc)
yn = np.linspace(y1[ii+1], y2[ii+1], nc)
for kk in range(nc - 1):
p = patches.Polygon([[x[ii], y[kk]],
[x[ii+1], yn[kk]],
[x[ii+1], yn[kk+1]],
[x[ii], y[kk+1]]], color=cmap(normalize(z[kk])))
ax.add_patch(p)
plt.plot(x, y1, 'k-', lw=1)
plt.plot(x, y2, 'k-', lw=1)
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/d4LJX.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/d4LJX.png" alt="enter image description here"/></a></p>
<p>这里的想法与我最初的答案相似,只是梯形被分成<code>nc</code>个部分,每个部分分别着色。这种方法的优点是可以正确地缩放不同的<code>y1[ii]</code>,<code>y2[ii]</code>距离,如比较中所示</p>
<p><a href="https://i.stack.imgur.com/WWpn3.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/WWpn3.png" alt="enter image description here"/></a></p>
<p>然而,它确实有许多缺点,<em>比<code>imshow</code>或水平梯度法慢得多,并且不能正确处理“交叉”。你知道吗</p>
<hr/>
<h3>原始</h3>
<p>这有点像黑客,部分基于<a href="https://stackoverflow.com/questions/11564273/matplotlib-continuous-colormap-fill-between-two-lines/29656697">this question</a>中的答案。它似乎工作得相当好,但在沿<code>x</code>轴的密度较高时效果最好。其思想是分别为对应于<code>x</code>对的每个梯形<code>fill_between</code>调用<code>[x[ii], x[ii+1]]</code>。下面是一个使用一些生成的数据的完整示例</p>
<pre class="lang-py prettyprint-override"><code>import matplotlib.pyplot as plt
from matplotlib import colors
import numpy as np
import pandas as pd
n = 1000
X = np.linspace(0, np.pi*5, n)
Y1 = np.sin(X)
Y2 = np.cos(X)
Z = np.linspace(0, 10, n)
normalize = colors.Normalize(vmin=Z.min(), vmax=Z.max())
cmap = plt.cm.get_cmap('winter')
df = pd.DataFrame({'x': X, 'y1': Y1, 'y2': Y2, 'z': Z})
x = df['x'].values
y1 = df['y1'].values
y2 = df['y2'].values
z = df['z'].values
for ii in range(len(df['x'].values)-1):
plt.fill_between([x[ii], x[ii+1]], [y1[ii], y1[ii+1]],
[y2[ii], y2[ii+1]], color=cmap(normalize(z[ii])))
plt.plot(x, y1, 'k-', x, y2, 'k-')
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/wyfrS.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/wyfrS.png" alt="enter image description here"/></a></p>
<p>这可以推广到一个二维的颜色网格,但需要非平凡的修改</p>