Как построить список списков на разных высотах оси Y? - PullRequest
0 голосов
/ 07 декабря 2018

Имея список списков в Python, мне нужно построить их (используя Matplotlib и Python) один список под другим, используя шаг по оси Y.
Например: ll = [[1,2,3], [0,3,4]]

Дляll, список списков, шаг по оси Y будет 4 (наибольшее значение).Смещение инициализируется равным 0. При каждом построенном списке смещение будет увеличиваться с шагом по оси Y.Значения на оси X будут 1,2,3 для каждого списка, потому что в каждом подсписке есть 3 точки.
Значения на оси Y будут 1,2,3 (смещение 0) для первого списка и4,6,7 для второго списка, я добавил смещение (0 + step (4) = 4) для каждого элемента.

Для следующего элемента смещение будет равно 8. Это значение будет добавлено к каждомуэлемент в 3-м списке (если он существует в примере) и так далее ... Также мне нужно, чтобы точки из того же списка были подключены.ll может содержать более 2 списков.Сюжет будет выглядеть так:
Plotted list of lists

Код, который я написал:

x = np.arange(0, len(list_of_lists[0]))
y = list_of_lists[0]

step_on_y = max([item for sublist in list_of_lists for item in sublist])

lines = []
rows = 0
for list_in in range(len(list_of_lists)):
    for i in range(0, len(list_of_lists[list_in]) - 1):
        pair = [(x[i], list_of_lists[list_in][i] + rows), (x[i + 1], list_of_lists[list_in][i+1] + rows)]
        lines.append(pair)
    rows = rows + step_on_y

linecoll = matcoll.LineCollection(lines)
fig, ax = plt.subplots()

ax.add_collection(linecoll)
print(len(x), len(list_of_lists)*len(list_of_lists[0]))
plt.scatter(x, y, s=1)

plt.xlabel('X')
plt.ylabel('Y')
plt.xticks(x)
plt.ylim(0, 30)

plt.show()

Результат, который я получаю: The result I get

Как я могу получить желаемый результат?Что я должен изменить в своем коде?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Мой подход заключается в том, чтобы построить все линии в одной команде заговора, включая круги.

Поэтому я использую представление массива numpy ll и добавляю смещения ко всем подспискам, начиная со второго.Массив смещений - это просто совокупная сумма максимальных значений каждого подсписка.

import numpy as np
import matplotlib.pyplot as plt

ll = [[1,2,3], [1,3,4], [2, 3, 4], [1, 1, 2]]
arr = np.array(ll).T

arr[:, 1:] += np.cumsum(np.max(arr[:, :-1], axis=0))

plt.subplots()
plt.plot([1, 2, 3], arr, '-o', mfc='w')

enter image description here

0 голосов
/ 07 декабря 2018

Я вполне уверен, что вы делаете это намного более замысловатым, чем следовало бы.

Вот фрагмент кода, который должен делать то, что вы ищете (я добавил горизонтальную серую пунктирную линию, чтобы показатьгде начинается график следующего «списка»)
PS: в этом примере я использую максимальное значение предыдущего списка в качестве смещения для следующего, чтобы гарантировать отсутствие перекрытия между графиками, но вы можете легко сделатьэто постоянный или настроить его

import numpy as np
import matplotlib.pyplot as plt

ll = [[1,2,3], [1,3,4], [1,1,1], [4,5,6]]
c = ['k','r','b','g','c']

x = np.arange(0, len(ll[0]))
a = np.array( ll)


step = 0
ax = plt.subplot()
for n,l in enumerate( a):
    ax.plot(x, l + step)
    ax.scatter(x, l + step)
    ax.axhline(y=step, color='#cccccc', dashes=[5,3])

    step += np.max(l)

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...