【问题标题】:How to get different colored lines for different plots in a single figure?如何在单个图中为不同的图获得不同的颜色线?
【发布时间】:2011-06-15 20:35:53
【问题描述】:

我正在使用matplotlib 创建绘图。我必须用 Python 自动生成的不同颜色识别每个图。

你能不能给我一个方法,在同一个图中为不同的图放置不同的颜色?

【问题讨论】:

    标签: python colors matplotlib


    【解决方案1】:

    Matplotlib 默认会这样做。

    例如:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(10)
    
    plt.plot(x, x)
    plt.plot(x, 2 * x)
    plt.plot(x, 3 * x)
    plt.plot(x, 4 * x)
    plt.show()
    

    而且,您可能已经知道,您可以轻松添加图例:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(10)
    
    plt.plot(x, x)
    plt.plot(x, 2 * x)
    plt.plot(x, 3 * x)
    plt.plot(x, 4 * x)
    
    plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')
    
    plt.show()
    

    如果你想控制循环的颜色:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(10)
    
    plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])
    
    plt.plot(x, x)
    plt.plot(x, 2 * x)
    plt.plot(x, 3 * x)
    plt.plot(x, 4 * x)
    
    plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')
    
    plt.show()
    

    如果你不熟悉 matplotlib,the tutorial is a good place to start

    编辑:

    首先,如果您想在一个图形上绘制很多 (>5) 事物,则:

    1. 将它们放在不同的图上(考虑在一个图上使用几个子图),或者
    2. 使用颜色以外的东西(即标记样式或线条粗细)来区分它们。

    否则,您将得到一个非常混乱的情节!善待那些将要阅读您正在做的任何事情的人,不要试图将 15 种不同的东西塞进一个人物!

    除此之外,许多人都有不同程度的色盲,而且对于更多的人来说,区分众多细微不同的颜色比您可能意识到的还要困难。

    话虽如此,如果您真的想在一个轴上放置 20 条线,并使用 20 种相对不同的颜色,这里有一种方法:

    import matplotlib.pyplot as plt
    import numpy as np
    
    num_plots = 20
    
    # Have a look at the colormaps here and decide which one you'd like:
    # http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
    colormap = plt.cm.gist_ncar
    plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))
    
    # Plot several different functions...
    x = np.arange(10)
    labels = []
    for i in range(1, num_plots + 1):
        plt.plot(x, i * x + 5 * i)
        labels.append(r'$y = %ix + %i$' % (i, 5*i))
    
    # I'm basically just demonstrating several different legend options here...
    plt.legend(labels, ncol=4, loc='upper center', 
               bbox_to_anchor=[0.5, 1.1], 
               columnspacing=1.0, labelspacing=0.0,
               handletextpad=0.0, handlelength=1.5,
               fancybox=True, shadow=True)
    
    plt.show()
    

    【讨论】:

    • 请注意最后一个示例,在较新版本的 matplotlib 中,set_color_cycle 已被弃用,因此该行应为 plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots)))),只需更改 plt.cm.YOUR_PREFERED_COLOR_MAP 以满足您的需要。跨度>
    • @JoeKington: 讲解很精彩,非常感谢
    • 这很棒。有没有办法让它们互动?例如在 R 中,我将 ggplot 转换为 ggplotly(),并且绘图变为 html 交互
    • 我确信 OP 知道 Matplotlib 在单个图中(在单个 axes 中)适当地为不同的曲线着色,并询问在不同的图中改变单条线的颜色(不同 @ 987654334@)...也就是说,对一个重要问题的出色回答(可能与 OP 所问的不同,但没有人知道,因为他们问了这个问题并消失了!)- +1
    【解决方案2】:

    稍后设置

    如果您不知道要绘制的图的数量,您可以在绘制它们后更改颜色,使用 .lines 直接从图中检索数字,我使用此解决方案:

    一些随机数据

    import matplotlib.pyplot as plt
    import numpy as np
    
    fig1 = plt.figure()
    ax1 = fig1.add_subplot(111)
    
    
    for i in range(1,15):
        ax1.plot(np.array([1,5])*i,label=i)
    

    你需要的一段代码:

    colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired   
    colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
    for i,j in enumerate(ax1.lines):
        j.set_color(colors[i])
      
    
    ax1.legend(loc=2)
    

    结果如下:

    【讨论】:

      【解决方案3】:

      TL;DR不,它不能自动完成。是的,有可能。

      import matplotlib.pyplot as plt
      my_colors = plt.rcParams['axes.prop_cycle']() # <<< note that we CALL the prop_cycle
      fig, axes = plt.subplots(2,3)
      for ax in axes.flatten(): ax.plot((0,1), (0,1), **next(my_colors))
      

      图 (figure) 中的每个图 (axes) 都有自己的颜色循环——如果您不为每个图强制使用不同的颜色,所有图共享相同的颜色顺序,但是,如果我们 拉伸一点“自动”的意思,可以做到。


      OP 写的

      [...] 我必须用 [Matplotlib] 自动生成的不同颜色识别每个图。

      但是... Matplotlib 会自动为每条不同的曲线生成不同的颜色

      In [10]: import numpy as np
          ...: import matplotlib.pyplot as plt
      
      In [11]: plt.plot((0,1), (0,1), (1,2), (1,0));
      Out[11]:
      

      那么为什么是 OP 请求呢?如果我们继续阅读,我们有

      你能不能给我一个方法,在同一个图中为不同的情节设置不同的颜色?

      这是有道理的,因为每个图(用 Matplotlib 的说法是每个 axes)都有自己的 color_cycle(或者更确切地说,在 2018 年,它的 prop_cycle)并且每个图(axes)都重复使用相同的颜色顺序相同。

      In [12]: fig, axes = plt.subplots(2,3)
      
      In [13]: for ax in axes.flatten():
          ...:     ax.plot((0,1), (0,1))
      

      如果这是原始问题的含义,一种可能性是为每个图明确命名不同的颜色。

      如果图(经常发生)是在循环中生成的,我们必须有一个额外的循环变量来覆盖 Matplotlib 选择的颜色自动

      In [14]: fig, axes = plt.subplots(2,3)
      
      In [15]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'):
          ...:     ax.plot((0,1), (0,1), short_color_name)
      

      另一种可能性是实例化循环器对象

      from cycler import cycler
      my_cycler = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])
      actual_cycler = my_cycler()
      
      fig, axes = plt.subplots(2,3)
      for ax in axes.flat:
          ax.plot((0,1), (0,1), **next(actual_cycler))
      

      注意type(my_cycler)cycler.Cyclertype(actual_cycler)itertools.cycle

      【讨论】:

        【解决方案4】:

        我想对上一篇文章中给出的最后一个循环答案进行小幅改进(该帖子是正确的,仍应被接受)。标记最后一个示例时的隐含假设是 plt.label(LIST) 将标签编号 X 放入 LIST 中,对应于第 X 次调用 plot 的行。我以前遇到过这种方法的问题。根据 matplotlibs 文档 (http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item) 构建图例和自定义标签的推荐方法是让标签与您认为的确切图一致:

        ...
        # Plot several different functions...
        labels = []
        plotHandles = []
        for i in range(1, num_plots + 1):
            x, = plt.plot(some x vector, some y vector) #need the ',' per ** below
            plotHandles.append(x)
            labels.append(some label)
        plt.legend(plotHandles, labels, 'upper left',ncol=1)
        

        **:Matplotlib Legends not working

        【讨论】:

        • 仅供参考:您也可以使用“label”kwarg 进行绘图,然后调用 legend 而无需任何参数。
        【解决方案5】:

        Matplot 用不同的颜色为你的绘图着色,但如果你想使用特定的颜色

            import matplotlib.pyplot as plt
            import numpy as np
                    
            x = np.arange(10)
                    
            plt.plot(x, x)
            plt.plot(x, 2 * x,color='blue')
            plt.plot(x, 3 * x,color='red')
            plt.plot(x, 4 * x,color='green')
            plt.show()
        

        【讨论】:

          【解决方案6】:
          from mpl_toolkits.mplot3d import Axes3D
          import matplotlib.pyplot as plt
          import numpy as np
          from skspatial.objects import Line, Vector
          
          for count in range(0,len(LineList),1):
                  Line_Color = np.random.rand(3,)
                  Line(StartPoint,EndPoint)).plot_3d(ax,c="Line"+str(count),label="Line"+str(count))
          
          
          plt.legend(loc='lower left')
          plt.show(block=True)     
          

          以上代码可能会帮助您以随机方式添加具有不同颜色的 3D 线条。您的彩色线条也可以在 label="..." 参数中提到的图例的帮助下被引用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-10-29
            • 2021-07-08
            • 1970-01-01
            • 2022-10-05
            • 2018-01-14
            相关资源
            最近更新 更多