【问题标题】:Color cycling for multiple matplotlib pyplot contour plots多个 matplotlib pyplot 等高线图的颜色循环
【发布时间】:2017-12-08 14:58:06
【问题描述】:

可以在matplotlib.pyplot 中使用基本图循环线条颜色:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_prop_cycle(plt.cycler('color', ['c', 'm', 'y', 'k']))

x = np.linspace(-1.0, 1.0, 50)
for f in [1.0, 2.0, 3.0, 4.0]:
    ax.plot(x, np.sin(x * f))
plt.show()

这会导致每个部分正弦波图具有循环器列表中的下一种颜色,并且会根据需要进行换行:

我正在使用contour 绘图来绘制单个轮廓。对于每种情况,我想绘制一个轮廓,但我希望显示的颜色自动循环通过指定的调色板(这样我就可以显示一个可读的颜色编码图例)。不过ax.set_prop_cycle在这里似乎没有同样的效果:

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_prop_cycle(plt.cycler('color', ['c', 'm', 'y', 'k']))

x = np.linspace(-1.0, 1.0, 50)
y = np.linspace(-1.0, 1.0, 50)
z = np.zeros((len(x), len(y)))

# simple function to create useful contours:
def get_z(x, y, f):
    for i, u in enumerate(x):
        for j, v in enumerate(y):
            z[i, j] = (f * u) ** 2 + (f * v) ** 2
    return z

# plot for multiple values of `f`
for f in [1.0, 2.0, 3.0, 4.0]:
    ax.contour(x, y, get_z(x, y, f), levels=[1], linewidth=2)
plt.show()

每个图(环)都有相同的颜色 - 它没有自动循环。我想让每个情节都有不同的颜色。我知道每个“完整”等高线图都会循环显示作为单个图的一部分绘制的每个等高线的颜色,但在我的情况下,我只是在固定“级别”上绘制单个等高线。

是否有一种相当简单的方法可以在不为每个图明确指定颜色的情况下做到这一点?我最终计划绘制动态数量的图,因此将它们全部指定并不实际,我需要在需要时将其环绕。

也许有一种方法可以设置或旋转等高线图的颜色图的起始偏移量?

【问题讨论】:

    标签: python matplotlib plot colors


    【解决方案1】:

    您可以在plt.contour 中指定关键字colors。我不知道这是否是最好的解决方案,但我为您的颜色值编写了一个小的循环器函数,这样我就可以在 for-loop 的每次迭代时将它们提供给 plt.contour

    from matplotlib import pyplot as plt
    import numpy as np
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ##ax.set_prop_cycle(plt.cycler('color', ['c', 'm', 'y', 'k']))
    
    x = np.linspace(-1.0, 1.0, 50)
    y = np.linspace(-1.0, 1.0, 50)
    z = np.zeros((len(x), len(y)))
    
    # simple function to create useful contours:
    def get_z(x, y, f):
        for i, u in enumerate(x):
            for j, v in enumerate(y):
                z[i, j] = (f * u) ** 2 + (f * v) ** 2
        return z
    
    def col_cycler(cols):
        count = 0
        while True:
            yield cols[count]
            count = (count + 1)%len(cols)
    
    # plot for multiple values of `f`
    col_iter = col_cycler(['c','m', 'y','k'])
    for f in [1.0, 2.0, 3.0, 4.0, 5.0]:
        ax.contour(x, y, get_z(x, y, f), levels=[1], linewidth=2, colors=next(col_iter))
    plt.show()
    

    结果如下:

    在 Python 3.5 上测试

    【讨论】:

    • 啊,很好地使用了永久生成器功能 - 谢谢。
    【解决方案2】:

    由于您无论如何都要循环您的参数,您可以简单地同时循环颜色。

    # plot for multiple values of `f`
    for f, c in zip([1.0, 2.0, 3.0, 4.0], ['c', 'm', 'y', 'k']):
        ax.contour(x, y, get_z(x, y, f), levels=[1], linewidth=2, colors=c)
    

    或者,如果小区数量未知,

    colors = ['c', 'm', 'y', 'k']
    for i,f in enumerate([1.0, 2.0, 3.0, 4.0]):
        ax.contour(x, y, get_z(x, y, f), levels=[1], linewidth=2, colors=colors[i%len(colors)])
    plt.show()
    

    因此,不希望“为每个图明确指定颜色”的论点只有在不使用循环时才有意义。

    所以要在没有循环的情况下获得相同的结果,您可以为同一个等高线图指定多个级别并使用颜色图。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.colors
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    
    x = np.linspace(-1.0, 1.0, 50)
    y = np.linspace(-1.0, 1.0, 50)
    z = np.zeros((len(x), len(y)))
    
    # simple function to create useful contours:
    def get_z(x, y, f):
        for i, u in enumerate(x):
            for j, v in enumerate(y):
                z[i, j] = (f * u) ** 2 + (f * v) ** 2
        return z
    
    colors = ['c', 'm', 'y', 'k']
    levels = 1./np.array([1.0, 2.0, 3.0, 4.0][::-1])**2
    cmcol =  zip(plt.Normalize(levels.min(), levels.max())(levels),colors[::-1])
    
    cmap=matplotlib.colors.LinearSegmentedColormap.from_list("m", cmcol)
    cont = ax.contour(x, y, get_z(x, y, 1), levels=levels, linewidth=2, cmap=cmap)
    
    plt.show()
    

    【讨论】:

    • 谢谢。在我的简单示例中,我使用了循环,但实际上我需要“按需”绘制图,并且循环不是那么明确。但是,我确实认为可以将颜色指定为contour 的参数。我想我真正想要的是是否存在自动“基色”循环功能,就像它对线图等一样。
    • 另外,将数据组合成一个图的有趣想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    相关资源
    最近更新 更多