Линейный сюжет 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()
Другие вопросы по тегам