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

标签 python matplotlib visualization

enter image description here

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

  • 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)

enter image description here

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

最佳答案

用作灵感 another question .

一种选择是使用 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)

,结果是:

matplotlib line with different thickness and color

windline 函数接受带有 x、y、偏差(如每个 x 值的厚度值)和用于颜色映射的颜色数组的 numpy 数组作为参数。我觉得可以通过在其他细节上做一些改动来改善它,但原理虽然不完美,但应该是扎实的。

关于python - 在 matplotlib 中同时更改线宽和颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37708166/

相关文章:

python - 等值区域图未显示输出中的颜色变化

python - 为什么我的函数用一个值代替另一个值?

python - 如何从一系列 2D 图像创建 3D 模型?使用Python

python - 文件处理程序的日志级别与记录器的日志级别

python - 计算椭圆中的平均像素 RGB 值

java - 使用拾取模式时如何使用 Jung 更新布局的大小?

javascript - 在 shell 排序中为受影响的值添加样式?

python - 多层感知器,在 Python 中可视化决策边界 (2D)

python - 使用 matplotlib 堆叠 3d 条形图

python - 如何找到 cp 和 cp_p_g 在 M 轴上的交点?