Введение
Я собираюсь использовать коллекцию строк .
Поскольку у меня нет ваших исходных данных, я подделал некоторые данные, используя простую синусоидальную кривую и нанеся на базовую линию цветовые коды, соответствующие малым, средним и высоким значениям кривой
код
Обычный шаблон, нам нужно явно импортировать LineCollection
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.collections import LineCollection
Просто чтобы построить что-то, синусоида (х г
x = np.linspace(0, 50, 101)
y = np.sin(0.3*x)
Цветовое кодирование от значений кривой (соответствующих типам вашей поверхности) до LineCollection
цветов, обратите внимание, что LineCollection
требует , чтобы цвета были заданы как кортежи RGBA, но я видел примеры использования цветные струны, ба!
# 1 when near min, 2 when near 0, 3 when near max
z = np.where(y<-0.5, 1, np.where(y<+0.5, 2, 3))
col_d = {1:(0.4, 0.4, 1.0, 1), # blue, near min
2:(0.4, 1.0, 0.4, 1), # green, near zero
3:(1.0, 0.4, 0.4, 1)} # red, near max
# prepare the list of colors
colors = [col_d[n] for n in z]
В наборе строк нам нужна последовательность сегментов, здесь я решил разместить мою кодированную линию в y=0
, но вы можете просто добавить константу к s
, чтобы перемещать ее вверх и вниз.
Я признаю, что формирование последовательности сегментов немного сложнее ...
# build the sequence of segments
s = np.zeros(101)
segments=np.array(list(zip(zip(x,x[1:]),zip(s,s[1:])))).transpose((0,2,1))
# and fill the LineCollection
lc = LineCollection(segments, colors=colors, linewidths=5,
antialiaseds=0, # to prevent artifacts between lines
zorder=3 # to force drawing over the curve) lc = LineCollection(segments, colors=colors, linewidths=5) # possibly add zorder=...
Наконец-то мы положили все на холст
# plot the function and the line collection
fig, ax = plt.subplots()
ax.plot(x,y)
ax.add_collection(lc)