Эффективно нанесите несколько линий с одинаковой осью X - PullRequest
0 голосов
/ 04 января 2019

У меня есть пустой массив Y формы (1360, 1024), который содержит агрегированный набор данных 1360, каждый из которых имеет длину 1024. У меня есть еще один массив формы (1024,), который называется X.

Этокак выглядит Y [0: 5] (в качестве примера):

array([[13.72059917, 16.27633476, 18.49536324, ...,  0.81599081,
         0.99834043,  0.92653233],
       [13.42022991, 15.06573963, 17.45792198, ...,  0.85495144,
         0.75660354,  1.02977574],
       [13.6416111 , 16.03499603, 17.46924019, ...,  0.85070604,
         0.94057351,  0.87749392],
       [14.69120216, 16.85452461, 17.6070137 , ...,  0.86291492,
         0.99953759,  0.81989962],
       [13.57082653, 16.15143394, 17.55677032, ...,  0.93469822,
         0.96676576,  1.09142995]])

Теперь я хочу построить все 1360 наборов данных друг над другом.Для всех них ось X одинакова, то есть X.

Я знаю, что могу сделать это, чтобы построить несколько вещей:

pyplot.plot(X,Y[0],X,Y[1],X,Y[2])

, но это выглядит как грубая сила.Также это может быть решено с помощью цикла, но не очень элегантно.

Я немного попробовал с пониманием списка, чтобы сделать X, Y [0] ... автоматически, но не получилось.

В идеале я хочу однострочное решение без цикла.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

plt.plot читает графики по столбцам. вот полный пример:

import numpy as np
import matplotlib.pyplot as plt

xa = np.array([1, 2, 3])  # shape (3,)
xb = np.array([[1],
               [2],
               [3]])  # shape (3,1)
xc = np.array([[1, 4],
               [2, 5],
               [3, 6]])  # shape (3,2)

ya = np.array([[1, 4],
               [2, 5],
               [3, 6]])  # shape (3,2)
yb = np.array([1, 2, 3])  # shape (3,)

plt.figure()
plt.plot(xa, ya)  # res- 2 lines: ((1,1), (2,2), (3,3)) & ((1,4), (2,5), (3,6))

plt.figure()
plt.plot(xb, ya)  # res- 2 lines: ((1,1), (2,2), (3,3)) & ((1,4), (2,5), (3,6))

plt.figure()
plt.plot(xc, ya)  # res- 2 lines: ((1,1), (2,2), (3,3)) & ((4,4), (5,5), (6,6))

plt.figure()
plt.plot(xc.T, ya.T)  # res- 3 lines: ((1,1), (4,4)) & ((2,2),(5,5)) & ((3,3), (6,6))

plt.figure()
plt.plot(xa, yb)  # res- 1 line: ((1,1), (2,2), (3,3))

plt.figure()
plt.plot(xb, yb)  # res- 1 line: ((1,1), (2,2), (3,3))

plt.figure()
plt.plot(xc, yb)  # res- 2 lines: ((1,1), (2,2), (3,3)) & ((4,1), (5,2), (6,3))

plt.show()
0 голосов
/ 04 января 2019

Вы можете указать двумерный массив для plot(x,y). Если x имеет длину n, y должен иметь форму (n,m) для построения m линий (одна строка на столбец).

import numpy as np
import matplotlib.pyplot as plt

Y = np.random.rand(5,7)
X = np.arange(7)

plt.plot(X, Y.T)

plt.show()

Для большого количества столбцов это, однако, неэффективно. Более эффективный способ создать этот график - нарисовать одну «линию» через LineCollection

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

Y = np.random.rand(5,7)
X = np.arange(7)

x = np.tile(X, Y.shape[0]).reshape(*Y.shape)
v = np.stack((x,Y), axis=-1)
c = LineCollection(v)

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