Построение списка координат (x, y) в python matplotlib

110

У меня есть список пар, (a, b)которые я хотел бы построить matplotlibв Python как фактические координаты xy. В настоящее время он создает два графика, где индекс списка дает координату x, а значения y первого графика - это as в парах, а значения y второго графика - bs в парах.

Чтобы прояснить, мои данные выглядят так: li = [(a,b), (c,d), ... , (t, u)] я хочу сделать однострочник, который просто вызывает plt.plot()неправильный. Если бы мне не требовался однострочник, я мог бы тривиально:

xs = [x[0] for x in li]
ys = [x[1] for x in li]
plt.plot(xs, ys)

Как я могу заставить matplotlib построить эти пары как координаты xy?

CodeKingPlusPlus
источник

Ответы:

180

Согласно этому примеру :

import numpy as np
import matplotlib.pyplot as plt

N = 50
x = np.random.rand(N)
y = np.random.rand(N)

plt.scatter(x, y)
plt.show()

произведет:

введите описание изображения здесь

Чтобы распаковать данные из пар в списки, используйте zip:

x, y = zip(*li)

Итак, однострочный:

plt.scatter(*zip(*li))
сашкелло
источник
7
Для массива numpy с 2 столбцами plt.scatter( * xy.T )работает: кратко и неясно дляx, y = xy.T; plt.scatter( x, y )
денис
2
x, y = zip(*li)действительно элегантный код Python! Я делал более простые две строки кода со сжатием списка в каждой строке (как в исходном вопросе)
Тревор Бойд Смит
1
Непонятно, какое отношение случайный plt.scatterпример имеет к вопросу.
jamesdlin
37

Если у вас есть массив numpy, вы можете сделать это:

import numpy as np
from matplotlib import pyplot as plt

data = np.array([
    [1, 2],
    [2, 3],
    [3, 6],
])
x, y = data.T
plt.scatter(x,y)
plt.show()
Zweedeend
источник
1
Таким образом , нет никакого способа , чтобы иметь np.arrayот data=np.array([[x1,y1],[x2,y2],etc.])и использования plt.plot(data). Мне всегда придется давать два массива вместо массивов массивов?
Макс Коплан
1
@MaxCoplan, это верно, но вы можете использовать plt.plot(*data.T)который делает то же, что и выше, но пропускает промежуточный шаг.
Zweedeend
7

Если вы хотите построить одну линию, соединяющую все точки в списке

plt . plot ( li [ : ] )

plt . show ( )

Это построит линию, соединяющую все пары в списке как точки на декартовой плоскости от начала списка до конца. Я надеюсь, что это то, что вы хотели.

Шубхам Рана
источник
3
Он не хотел рисовать одну строку, он хотел рисовать «однострочно» (одна строка кода). Ответ, который он искал (и получил 3 года назад), заключался в использовании scatter().
Дартмут,
8
Поскольку в этом ответе указано условие, при котором он работает, например: «Если вы хотите построить одну линию, соединяющую все точки в списке», действительно ли он заслуживает голоса против?
Gathide