Как построить ряд точек на строках в matplotlib? - PullRequest
3 голосов
/ 20 марта 2012

Я использую matplotlib и Python 2.7

У меня есть MxN-матрица кортежей, X-координата и скорость.Как построить M рядов точек с N точками в каждом ряду в указанных координатах x?Предпочтительно с первой строкой вверху?

Я пробовал различные примеры из документации, но, честно говоря, я ничего не нашел.

Вот грубый пример того, что я хочуВыполните, t-координата идет от 0 до M, диапазон x имеет фиксированный размер.Точки располагаются в горизонтальной линии в соответствии с их значениями.Это несколько читабельно?Plot mockup

Ответы [ 2 ]

5 голосов
/ 20 марта 2012

Похоже, у вас есть что-то вроде этого:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.random((10, 20))
x = x.cumsum(axis=1)

fig, ax = plt.subplots()
for i, row in enumerate(x):
    ax.plot(row, i * np.ones_like(row), 'ko')

ax.set_ylim([-0.5, 9.5])
ax.set_yticks(range(10))
ax.invert_yaxis()
plt.show()

enter image description here

Редактировать:

@ EMS совершенно прав, я пропустил довольно ключевой пункт вашего вопроса.

Однако, если у вас есть вложенные списки кортежей, просто преобразуйте их в массив. Это будет трехмерный массив, который вы можете нарезать по мере необходимости для положения х и скорости. Нет абсолютно никакой необходимости генерировать второй набор данных, и matplotlib преобразует все, что вы вводите в него, в массив с нулевыми значениями, поэтому нет снижения производительности.

например.

import numpy as np

data = [[(1, 2), (3, 4)],
        [(5, 6), (7, 8)]]

data = np.array(data)

x = data[:,:,0]
velocity = data[:,:,1]

Это дает:

x: 
array([[1, 3],
       [5, 7]])

velocity:
array([[2, 4],
       [6, 8]])
3 голосов
/ 20 марта 2012

Вот скрипт Python, который создает фальшивые данные, которые должны быть немного похожи на ваши.

import numpy as np
import matplotlib.pyplot as plt


num_rows = 7
num_cols = 10

# Make a fake data array that's just a list of lists.
# And each list has num_cols number of different tuples.
# The x-data is assumed to be the first coordinate of the
# tuple

my_data = []
for ii in range(num_rows):
    my_data.append([])
    for jj in range(num_cols):
        my_data[ii].append( (24*np.random.rand(),np.random.rand()) )


# Now plot the different rows as separate plots.
fig = plt.figure()
ax = fig.add_subplot(111)
for ii in range(num_rows):

    # The y-axis values are just a constant based on the current row.
    cur_tvals = [ii]*num_cols

    # The x values are gotten by using a list comprehension to
    # grab just the first tuple element. 
    cur_xvals = [tup[0] for tup in my_data[ii]]

    # Add the current curve to the plot. Specifying '.' as the
    # symbol get rid of any lines connecting the markers.
    ax.plot(cur_xvals,cur_tvals,'.',markersize=5)

# Setting axes based on num_rows
ax.set_ylim([-0.5, num_rows-1+0.5])
ax.set_yticks(range(num_rows))
ax.invert_yaxis()
plt.show()

Это отображает точки, как вы хотите: plot as requested

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