matplotlib 如何根据第三个值绘制线段的颜色

wribegjk  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(106)

我得到了以下python3代码,它生成线段

import numpy as np
import pylab as pl
from matplotlib import collections as mc
from matplotlib.colors import to_rgba # https://matplotlib.org/2.0.2/api/colors_api.html#matplotlib.colors.to_rgba
#https://stackoverflow.com/questions/21352580/matplotlib-plotting-numerous-disconnected-line-segments-with-different-colors

# to_rgba('violet')
lines = [
    [(0, 1), (1, 1)],
    [(2, 3), (3, 3)],
    [(1, 2), (1, 3)]
]

colors = [
    (1,0,0,1), # red
    (0,1,0,1), # green
    (0,0,1,1), # blue
]

z = [1,2,3]
c = np.array([(1, 0, 0, 1), (0, 1, 0, 1), (0, 0, 1, 1)])

lc = mc.LineCollection(lines, colors=('r','g','b'), linewidths=2)
fig, ax = pl.subplots()
ax.add_collection(lc)
ax.autoscale()
ax.margins(0.1)
fig.savefig('line.segments.svg', bbox_inches='tight', pad_inches = 0.05)

我一直在阅读Matplotlib: Plotting numerous disconnected line segments with different colorsMatplotlib: Assign Colors to Lines以及文档。
然而,我想根据z的索引为线段着色。在元素e处的线将具有由z[e]的值设置的颜色。这就像散点图如何用颜色作为第三维来绘制。类似于此页面,https://www.statology.org/matplotlib-scatterplot-color-by-value/,但使用线段,而不是散点图。
我们的想法是设置一个比例,这样z的最小值就可以算作coolwarm色图的一端,而z就可以算作最大值。在图的右侧会绘制一个颜色条,这样颜色就可以Map到z
我怎么能这样做?

sqserrrh

sqserrrh1#

in the second example of this gallery所述,可以使用Linecollection中的array参数直接将颜色Map到coolwarm比例。
可以通过将创建的line集合对象传递到fig.colorbar中来添加颜色条。

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

lines = [[(0, 1), (1, 1)], [(2, 3), (3, 3)], [(1, 2), (1, 3)]]
z = [1, 2, 3]
colormap = "coolwarm"

lc = LineCollection(lines, array=z, cmap=colormap)

fig, ax = plt.subplots()
ax.add_collection(lc)
ax.autoscale()

fig.colorbar(lc)

plt.show()

相关问题