2D сюжет xy-списков разной длины - PullRequest
1 голос
/ 04 июля 2019

У меня есть произвольное большое количество (50-1000) списков, представляющих координаты X и Y, я хотел бы нарисовать их на одной фигуре.

Списки имеют разную длину, обычно по 100-1000 элементов каждый. Я получаю списки в виде пар координат x и y (см. Пример), но могу легко преобразовать их в массивы 2xN. Они должны быть построены по порядку, от первого до последнего элемента. Каждая строка отдельно.

Есть ли способ упаковать все мои списки в один (или два; x и y) объект, который может прочитать matplotlib?

Этот пример дает желаемый результат, но неудобен при большом количестве данных.

Я рад за решение, которое использует Numpy.

from matplotlib import pyplot as plt
fig, ax = plt.subplots(1,1)

x1 = [1,2,5] # usually much longer and a larger number of lists
y1 = [3,2,4]

x2 = [1,6,5,3]
y2 = [7,6,3,2]

x3 = [4]
y3 = [4]

for x, y, in zip([x1, x2, x3],[y1, y2, y3]):
    ax.plot(x,y, 'k.-')
plt.show()

Example

Я бы предпочел что-то вроде этого:

# f() is the function i need, to formats the data for plotting
X = f(x1, x2, x3) 
Y = f(y1, y2, y3)

#... so that I can do some processing of the arrays X, and Y here. 

ax.plot(X, Y, 'k.-')

1 Ответ

1 голос
/ 04 июля 2019

Для этого вы можете использовать LineCollection.К сожалению, если вы хотите, чтобы в ваших линиях были маркеры, LineCollection не поддерживает это, поэтому вам нужно будет проделать некоторый трюк, такой как добавление графика рассеяния сверху (см. Добавление маркеров линий при использовании LineCollection ).

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

fig, ax = plt.subplots(1,1)

x1 = [1,2,5]
y1 = [3,2,4]

x2 = [1,6,5,3]
y2 = [7,6,3,2]

x3 = [4]
y3 = [4]

# Add lines
X = [x1, x2, x3]
Y = [y1, y2, y3]
lines = LineCollection((list(zip(x, y)) for x, y in zip(X, Y)),
                       colors='k', linestyles='-')
ax.add_collection(lines)
# Add markers
ax.scatter([x for xs in X for x in xs], [y for ys in Y for y in ys], c='k', marker='.')
# If you do not use the scatter plot you need to manually autoscale,
# as adding the line collection will not do it for you
ax.autoscale()

plt.show()

Если вы работаете с массивами, вы также можете сделать следующее:

import numpy as np
# ...
X = [x1, x2, x3]
Y = [y1, y2, y3]
lines = LineCollection((np.stack([x, y], axis=1) for x, y in zip(X, Y)),
                       colors='k', linestyles='-')
ax.add_collection(lines)
ax.scatter(np.concatenate(X), np.concatenate(Y), c='k', marker='.')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...