matplotlib 如何在一个图形中为不同的图获得不同颜色的线

lrpiutwd  于 2023-05-01  发布在  其他
关注(0)|答案(7)|浏览(120)

我使用matplotlib来创建图。我必须用不同的颜色来标识每个图,这应该是由Python自动生成的。
你能给予我一个方法,把不同的颜色不同的情节在同一个图?

ca1c2owp

ca1c2owp1#

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.将它们放在不同的图上(考虑在一个图上使用几个子图),或
1.使用颜色以外的东西(i.即标记样式或线条粗细)来区分它们。
否则,你会得到一个非常混乱的情节!对那些将要阅读你正在做的任何事情的人好一点,不要试图把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()

dfuffjeb

dfuffjeb2#

稍后设置

如果你不知道你要绘制的图的数量,你可以改变颜色,一旦你绘制了它们,使用.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)

结果如下:

mutmk8jj

mutmk8jj3#

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

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)

另一种可能性是示例化一个cycler对象

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

zpqajqem

zpqajqem4#

我想对上一篇文章中给出的最后一个循环答案做一个小小的改进(那篇文章是正确的,仍然应该被接受)。在标记最后一个示例时所做的隐含假设是,plt.label(LIST)将标签编号X放在LIST中,其中行对应于第X次调用plot的行。我以前遇到过这种方法的问题。根据matplotlib文档构建图例并自定义图例标签的推荐方法(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

1sbrub3j

1sbrub3j5#

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()
monwx1rj

monwx1rj6#

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="中提到的图例的帮助下引用。..”参数。

ao218c7q

ao218c7q7#

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

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)

相关问题