如何在一张图中为不同的图绘制不同颜色的线

2025-02-12 10:03:00
admin
原创
63
摘要:问题描述:我用它matplotlib来创建图表。我必须用不同的颜色来标识每个图表,这些颜色应该由 Python 自动生成。您能否给我一种方法,让我能够将同一幅图中的不同图表用不同的颜色表示?解决方案 1:Matplotlib 默认执行此操作。例如:import matplotlib.pyplot as plt...

问题描述:

我用它matplotlib来创建图表。我必须用不同的颜色来标识每个图表,这些颜色应该由 Python 自动生成。

您能否给我一种方法,让我能够将同一幅图中的不同图表用不同的颜色表示?


解决方案 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,本教程是一个很好的起点。

编辑:

首先,如果您有很多(>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()

根据给定的颜色图为 20 条线指定独特的颜色

解决方案 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
#                                    _____ VV______
my_colors = plt.rcParams['axes.prop_cycle']() 
# note that we CALLED the prop_cycle ‾‾‾‾‾‾ΛΛ‾‾‾‾‾‾

fig, axes = plt.subplots(2,3)
for ax in axes.flatten(): ax.plot((0,1), (0,1), **next(my_colors))

在此处输入图片描述


原帖写道

[...] 我必须用不同的颜色来标识每个图,这些颜色应该由[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]:

在此处输入图片描述

那么楼主为什么会提出这个要求呢?如果我们继续读下去,就会发现

您能否给我一种方法,让我能够将同一幅图中的不同图表用不同的颜色表示?

这是有道理的,因为每个图(axes用 Matplotlib 的说法是每个)都有自己的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.Cycler但是type(actual_cycler)itertools.cycle

解决方案 4:

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

...
# 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 不起作用

解决方案 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="... " 参数中提到的图例来引用您的彩色线条。

解决方案 7:

老实说,我最喜欢的方法非常简单:现在这对于任意数量的图都不起作用,但它最多可以达到 1163。这是通过使用所有 matplotlib 命名颜色的映射,然后随机选择它们。

from random import choice

import matplotlib.pyplot as plt
from matplotlib.colors import mcolors

# Get full named colour map from matplotlib
colours = mcolors._colors_full_map # This is a dictionary of all named colours
# Turn the dictionary into a list
color_lst = list(colours.values()) 

# Plot using these random colours
for n, plot in enumerate(plots):
    plt.scatter(plot[x], plot[y], color=choice(color_lst), label=n) 
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用