Линейный сюжет Python Matplotlib: изменить цвет линии в середине
Я пытаюсь построить непрерывную линию из ряда координат, но я хотел бы изменить цвет линии в определенных местах.
Input arrays:
layerdict['Xc'] = [50.6, 69.4, 69.4, 50.6, **50.6**, **50.2**, 69.8, 69.8, 50.2, **50.2**, **69.053**, 69.12, 69.12]
layerdict['Yc'] = [50.6, 50.6, 69.4, 69.4, **50.6**, **50.2**, 50.2, 69.8, 69.8, **50.2**, **50.88**, 50.996, 51.796]
** только для наглядности
Я хочу изменить цвет линии, которая идет с (50,6, 50,6) на (50,2,50,2) и (50,2, 50,6) на (69,053,5088) и так далее... Каков наилучший способ сделать это? У меня есть условный оператор, который может обнаружить условия и вставить пустые значения или другие операции
Вот что у меня так далеко.
layerdict = {'Xc': [], 'Yc': [], 'Xt': [], 'Yt': []}
with open(inputfilepath, 'r') as ifile:
for item in ifile:
gonematch = gonepattern.match(item)
gtrmatch = gtrpattern.match(item)
if gonematch:
tlist = item.split(' ')
layerdict['Xc'].append(float(tlist[1][1:]))
layerdict['Yc'].append(float(tlist[2][1:]))
elif gtrmatch:
tlist = item.split(' ')
layerdict['Xt'].append(float(tlist[1][1:]))
layerdict['Yt'].append(float(tlist[2][1:]))
plt.plot(layerdict['Xc'], layerdict['Yc'], label='linepath', linewidth=3.5)
plt.xlabel('X')
plt.ylabel('Y')
plt.show(block=True)
Пример входного файла будет выглядеть следующим образом (просто для справки, откуда я извлекаю координаты)
X10 Y10 A10 B10
X11 Y11 A10
X12.4 Y23.5 A5 ...
1 ответ
Я бы использовал маскированные массивы из созданного модуля numpy. Хотя числовые массивы уже лучше, чем простые списки в отношении индексации и математики, маскированные массивы автоматически отображаются только в том случае, если значения маски равны False. Однако вы все равно можете извлечь весь немаскированный массив, просто используя свойство data, поэтому построение сначала всего массива, а затем только подмножества - это вопрос двух почти одинаковых команд построения:
import matplotlib.pyplot as plt
import numpy as np
import numpy.ma as ma
layerdict = dict()
layerdict['Xc'] = [50.6, 69.4, 69.4, 50.6, 50.6, 50.2, 69.8, 69.8, 50.2, 50.2, 69.053, 69.12, 69.12]
layerdict['Yc'] = [50.6, 50.6, 69.4, 69.4, 50.6, 50.2, 50.2, 69.8, 69.8, 50.2, 50.88, 50.996, 51.796]
highlightmask = np.ones(len(layerdict['Xc'])).astype(bool)
highlightmask[4:6] = highlightmask[9:11] = False
layerdict['Xc'] = ma.array(layerdict['Xc'])
layerdict['Yc'] = ma.array(layerdict['Yc'], mask=highlightmask)
plt.plot(layerdict['Xc'], layerdict['Yc'].data, label='linepath', linewidth=3.5)
plt.plot(layerdict['Xc'], layerdict['Yc'], 'r', linewidth=3.5)
plt.xlabel('X')
plt.ylabel('Y')
plt.show()