Составьте несколько значений с помощью matplotlib без цикла - PullRequest
0 голосов
/ 28 октября 2018

У меня есть два вложенных списка со значениями для оси x и оси y, которые я хочу построить на одном и том же рисунке.

Если цикл for для итерации по значениям создает ожидаемый график,но для больших списков это относительно медленно.Поэтому я искал ту же функциональность, но без цикла, который, я думал, мог бы обработать matplotlib, но сюжет не тот, который я ожидал.

Вот код:

import matplotlib.pyplot as plt
xs = [[11, 20], [31, 31], [32, 33]]
ys = [[1, 10], [3, 4], [6, 10]]

Сцикл, фигура в порядке:

fig, ax = plt.subplots()
for i, x in enumerate(xs):
    ax.plot(x, ys[i])
plt.show()

enter image description here

Но просто передача списков в matplotlib не создает тот же график:

fig, ax = plt.subplots()
ax.plot(xs, ys)
plt.show()

enter code here

Каким будет правильный способ сделать это без цикла?

1 Ответ

0 голосов
/ 28 октября 2018

Когда список сегментов строки большой, вы можете повысить производительность, используя LineCollection вместо нескольких вызовов plt.plot:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.collections as mcoll

xs = [[11, 20], [31, 31], [32, 33]]
ys = [[1, 10], [3, 4], [6, 10]]
fig, ax = plt.subplots()

# https://matplotlib.org/gallery/color/color_cycle_default.html
prop_cycle = plt.rcParams['axes.prop_cycle']
colors = prop_cycle.by_key()['color']
segments = np.array(list(zip(xs, ys))).swapaxes(1,2)
line_segments = mcoll.LineCollection(segments, colors=colors)
ax.add_collection(line_segments)
ax.set(xlim=(10,34), ylim=(0,11))
plt.show()

enter image description here

Вот несколько дополнительных примеров, которые используют LineCollection:


LineCollection ожидает, что первый аргумент будет последовательностью формы [(pt0, pt1), (pt2, pt3), (pt4, pt5), ...], где каждый pt имеет форму (x-coord, y-coord). Затем Matplotlib отобразит это LineCollection как отрезки

pt0 --> pt1 
pt2 --> pt3
pt4 --> pt5
etc.

Причина использования swapaxes в приведенном выше коде заключается в том, что zip(xs, ys) создает пары вида ((x0, x1), (y0, y1)), тогда как LineCollection хочет, чтобы пары точек имели форму ((x0, y0), (x1, y1)).

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