Matplotlib:如何根据X坐标为LineCollection设置渐变颜色?
Fixing Horizontal Gradient for LineCollection in Matplotlib
我懂你遇到的问题了——你想让颜色随X坐标从左到右逐渐变白,但现在却在Y轴方向重复黑到白的循环。问题确实出在v的结构上,咱们一步步来解决:
问题根源
你当前生成的v是按Y值分组的水平线段:每个子列表对应一个固定Y值,包含从X=60到X=70的所有点。而LineCollection的set_array()是给每个线段分配一个颜色值,不是给线段上的每个点。因为你的v有200个线段(对应ys的200个值),但xs只有10个值,所以颜色会循环复用,导致Y轴方向重复渐变。
解决方案
要实现横向渐变,我们需要把线段改成按X值分组的垂直线段:每个线段对应一个固定X值,覆盖整个Y轴范围。这样每个线段就能对应一个唯一的X坐标,颜色就能正确随X增大渐变。
修正后的完整代码
import matplotlib.pyplot as plt from matplotlib.collections import LineCollection import numpy as np 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) # X从60到69,共10个值 ys = np.arange(0, 100, .5) # Y从0到99.5,共200个值 # 关键修改:生成垂直线段,每个X对应一条覆盖全Y的线段 v = [[[x, y] for y in ys] for x in xs] lines = LineCollection(v, linewidth=1, cmap=plt.cm.Greys_r) lines.set_array(xs) # 每个线段对应一个X值,颜色随X渐变 ax.add_collection(lines) plt.show()
为什么这样管用?
- 现在
v的长度等于xs的长度(10个线段),每个线段对应一个固定的X值,从Y=0延伸到Y=100。 set_array(xs)给每个线段分配对应的X值作为颜色映射的依据,配合Greys_r(反向灰度,小值黑,大值白),就会实现X从60到70时,颜色从黑逐渐变白的横向渐变效果。
内容的提问来源于stack exchange,提问作者solub
相关产品推荐
相关产品推荐

