考虑下面的情节:
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
坐标(水平)更改线条的颜色,以便创建“阴影”效果,如下所示:
此处,x
越大,LineCollection
就越“白”。
根据这个推理,我认为指定lines.set_array(xs)
会有效,但正如你在我的绘图中所看到的那样,颜色渐变仍然跟随y轴。奇怪的是,这种模式正在重复,从黑色到白色(每5个)一遍又一遍(最多100个)。
我认为(根本不确定)问题在于包含坐标的v
变量。 x
和y
的串联可能不合适。
答案 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()