首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matplotlib通过Colormap绘制带有颜色的线条

Matplotlib通过Colormap绘制带有颜色的线条
EN

Stack Overflow用户
提问于 2016-07-06 00:49:40
回答 5查看 87.2K关注 0票数 52

我在一张图上绘制了多条线,我希望它们贯穿于色彩映射表的光谱中,而不仅仅是相同的6或7种颜色。代码类似于:

代码语言:javascript
复制
for i in range(20):
     for k in range(100):
          y[k] = i*x[i]
     plt.plot(x,y)
plt.show()

无论是使用色彩映射表"jet“还是我从seaborn导入的另一种色彩,我都会得到相同的7种颜色,并以相同的顺序重复。我希望能够绘制多达60条不同的线条,所有线条都有不同的颜色。

EN

回答 5

Stack Overflow用户

发布于 2016-07-06 16:02:29

Matplotlib色彩映射表接受参数(0..1、标量或数组),您可以使用该参数从色彩映射表中获取颜色。例如:

代码语言:javascript
复制
col = plt.cm.jet([0.25,0.75])    

为您提供具有(两个) RGBA颜色的数组:

数组([ 0.,0.50392157,1,1,1,0.58169935,0。,1. )

你可以用它来创建不同颜色的N

代码语言:javascript
复制
import numpy as np
import matplotlib.pylab as pl

x = np.linspace(0, 2*np.pi, 64)
y = np.cos(x) 

pl.figure()
pl.plot(x,y)

n = 20
colors = pl.cm.jet(np.linspace(0,1,n))

for i in range(n):
    pl.plot(x, i*y, color=colors[i])

票数 82
EN

Stack Overflow用户

发布于 2018-04-26 02:51:13

Bart的解决方案很好,很简单,但有两个缺点。

  1. plt.colorbar()不会以一种很好的方式工作,因为线条图是不可映射的(与图像相比),对于大量的线条,由于

循环,

  1. 可能会很慢(尽管这对于大多数applications?)

来说可能不是问题

这些问题可以通过使用LineCollection来解决。然而,在我(谦虚的)观点中,这并不是很友好。与plt.scatter(...)函数类似,有一个用于添加多色线条图函数的开放suggestion on GitHub

这是一个我能够拼凑在一起的工作示例

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

def multiline(xs, ys, c, ax=None, **kwargs):
    """Plot lines with different colorings

    Parameters
    ----------
    xs : iterable container of x coordinates
    ys : iterable container of y coordinates
    c : iterable container of numbers mapped to colormap
    ax (optional): Axes to plot on.
    kwargs (optional): passed to LineCollection

    Notes:
        len(xs) == len(ys) == len(c) is the number of line segments
        len(xs[i]) == len(ys[i]) is the number of points for each line (indexed by i)

    Returns
    -------
    lc : LineCollection instance.
    """

    # find axes
    ax = plt.gca() if ax is None else ax

    # create LineCollection
    segments = [np.column_stack([x, y]) for x, y in zip(xs, ys)]
    lc = LineCollection(segments, **kwargs)

    # set coloring of line segments
    #    Note: I get an error if I pass c as a list here... not sure why.
    lc.set_array(np.asarray(c))

    # add lines to axes and rescale 
    #    Note: adding a collection doesn't autoscalee xlim/ylim
    ax.add_collection(lc)
    ax.autoscale()
    return lc

下面是一个非常简单的例子:

代码语言:javascript
复制
xs = [[0, 1],
      [0, 1, 2]]
ys = [[0, 0],
      [1, 2, 1]]
c = [0, 1]

lc = multiline(xs, ys, c, cmap='bwr', lw=2)

产生:

以及一些更复杂的东西:

代码语言:javascript
复制
n_lines = 30
x = np.arange(100)

yint = np.arange(0, n_lines*10, 10)
ys = np.array([x + b for b in yint])
xs = np.array([x for i in range(n_lines)]) # could also use np.tile

colors = np.arange(n_lines)

fig, ax = plt.subplots()
lc = multiline(xs, ys, yint, cmap='bwr', lw=2)

axcb = fig.colorbar(lc)
axcb.set_label('Y-intercept')
ax.set_title('Line Collection with mapped colors')

产生:

希望这能有所帮助!

票数 31
EN

Stack Overflow用户

发布于 2018-09-24 17:10:00

与巴特的答案不同的是,您不必在每次调用plt.plot时都指定颜色,而是使用set_prop_cycle定义一个新的颜色周期。他的示例可以翻译成以下代码(我还将matplotlib的导入更改为推荐的样式):

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2*np.pi, 64)
y = np.cos(x) 

n = 20
ax = plt.axes()
ax.set_prop_cycle('color',[plt.cm.jet(i) for i in np.linspace(0, 1, n)])

for i in range(n):
    plt.plot(x, i*y)
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38208700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档