Matplotlib:如何根据坐标改变LineCollection的颜色?

时间:2018-01-19 22:50:49

标签: python matplotlib colors

考虑下面的情节:

enter image description here

fig, ax = plt.subplots(figsize = (14, 6))
ax.set_facecolor('k')
ax.set_xlim(0, 100)
ax.set_ylim(0, 100)

xs = np.arange(60, 70)          # xs = np.linspace(60, 70, 100)
ys = np.arange(0, 100, .5)      # ys = np.linspace(0, 100, 100)

v = [[[x, y] for x in xs] for y in ys]

lines = LineCollection(v, linewidth = 1, cmap = plt.cm.Greys_r)
lines.set_array(xs)
ax.add_collection(lines)

如何根据x坐标(水平)更改线条的颜色,以便创建“阴影”效果,如下所示:

enter image description here

此处,x越大,LineCollection就越“白”。

根据这个推理,我认为指定lines.set_array(xs)会有效,但正如你在我的绘图中所看到的那样,颜色渐变仍然跟随y轴。奇怪的是,这种模式正在重复,从黑色到白色(每5个)一遍又一遍(最多100个)。

我认为(根本不确定)问题在于包含坐标的v变量。 xy的串联可能不合适。

1 个答案:

答案 0 :(得分:1)

您提供给v的列表LineCollection的形状确实不适合创建所需方向的渐变。这是因为LineCollection中的每一行只能有一种颜色。这里的线条范围从x = 60到x = 70,并且每条线条都有一种颜色。

您需要做的是创建一个行集合,其中每行分成几个段,每个段都可以有自己的颜色。

为此,维度(n, m, l)数组,其中n是细分数量,m是每个细分的点数,l是维度(2D,因此l=2)需要使用。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.collections import LineCollection
fig, ax = plt.subplots(figsize = (14, 6))
ax.set_facecolor('k')
ax.set_xlim(0, 100)
ax.set_ylim(0, 100)

xs = np.linspace(60, 70, 100)
ys = np.linspace(0, 100, 100)


X,Y = np.meshgrid(xs,ys)
s = X.shape
segs = np.empty(((s[0])*(s[1]-1),2,2))
segs[:,0,0] = X[:,:-1].flatten()
segs[:,1,0] = X[:,1:].flatten()
segs[:,0,1] = Y[:,:-1].flatten()
segs[:,1,1] = Y[:,1:].flatten()

lines = LineCollection(segs, linewidth = 1, cmap = plt.cm.Greys_r)
lines.set_array(X[:,:-1].flatten())
ax.add_collection(lines)

plt.show()

enter image description here