在 matplotlib 中同时更改线宽和颜色

Han*_*gzu 7 python visualization matplotlib

在此处输入图片说明

上图是一幅精美的艺术品,同时显示了风速、风向和温度。详细:

  • X 轴代表日期
  • Y 轴显示风向(南风、西风等)
  • 线的不同宽度代表通过时间序列的风速
  • 线条的不同颜色代表大气温度

这个简单的图形在没有冗余的情况下可视化了 3 个不同的属性。

所以,我真的很想在 matplotlib 中重现类似的情节。

我现在的尝试

## Reference 1 http://stackoverflow.com/questions/19390895/matplotlib-plot-with-variable-line-width
## Reference 2 http://stackoverflow.com/questions/17240694/python-how-to-plot-one-line-in-different-colors

def plot_colourline(x,y,c):
    c = plt.cm.jet((c-np.min(c))/(np.max(c)-np.min(c)))
    lwidths=1+x[:-1]
    ax = plt.gca()
    for i in np.arange(len(x)-1):
        ax.plot([x[i],x[i+1]], [y[i],y[i+1]], c=c[i],linewidth = lwidths[i])# = lwidths[i])
    return

x=np.linspace(0,4*math.pi,100)
y=np.cos(x)
lwidths=1+x[:-1]

fig = plt.figure(1, figsize=(5,5))
ax  = fig.add_subplot(111)
plot_colourline(x,y,prop)

ax.set_xlim(0,4*math.pi)
ax.set_ylim(-1.1,1.1)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

有人有更感兴趣的方法来实现这一目标吗?任何建议将不胜感激!

arm*_*ita 6

作为灵感另一个问题

一种选择是使用fill_between. 但也许不是按照预期的方式。不要用它来创建你的线条,而是用它来掩盖所有不是线条的东西。在它下面,您可以使用pcolormeshcontourf(例如)以您想要的任何方式映射颜色。

例如,看看这个例子:

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d

def windline(x,y,deviation,color):
    y1 = y-deviation/2
    y2 = y+deviation/2
    tol = (y2.max()-y1.min())*0.05
    X, Y = np.meshgrid(np.linspace(x.min(), x.max(), 100), np.linspace(y1.min()-tol, y2.max()+tol, 100))
    Z = X.copy()
    for i in range(Z.shape[0]):
        Z[i,:] = c

    #plt.pcolormesh(X, Y, Z)
    plt.contourf(X, Y, Z, cmap='seismic')

    plt.fill_between(x, y2, y2=np.ones(x.shape)*(y2.max()+tol), color='w')
    plt.fill_between(x, np.ones(x.shape) * (y1.min() - tol), y2=y1, color='w')
    plt.xlim(x.min(), x.max())
    plt.ylim(y1.min()-tol, y2.max()+tol)
    plt.show()

x = np.arange(100)
yo = np.random.randint(20, 60, 21)
y = interp1d(np.arange(0, 101, 5), yo, kind='cubic')(x)
dv = np.random.randint(2, 10, 21)
d = interp1d(np.arange(0, 101, 5), dv, kind='cubic')(x)
co = np.random.randint(20, 60, 21)
c = interp1d(np.arange(0, 101, 5), co, kind='cubic')(x)
windline(x, y, d, c)
Run Code Online (Sandbox Code Playgroud)

,这导致:

具有不同粗细和颜色的 matplotlib 线

该函数windline接受带有 x、y、偏差(如每个 x 值的厚度值)的 numpy 数组作为参数,以及用于颜色映射的颜色数组。我认为通过混杂其他细节可以大大改善它,但原理虽然不完美,但应该是扎实的。