Позначення списку координат (x, y) в матплотлібі python


110

У мене є список пар, з (a, b)якими я хотів би побудувати matplotlibв python як фактичні координати xy. В даний час він складає два графіки, де індекс списку дає координату x, а значення y 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?

Відповіді:


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
Для масиву з двома стовпцями plt.scatter( * xy.T )працює: короткий і незрозумілий дляx, y = xy.T; plt.scatter( x, y )
denis

2
x, y = zip(*li)це дійсно елегантний код пітона! я робив більш прямолінійні два рядки коду зі стисненням списку в кожному рядку (як оригінальне запитання)
Тревор Бойд Сміт,

1
Це щось заплутане, що стосується випадкового plt.scatterприкладу до питання.
jamesdlin

36

Якщо у вас є масивний рядок, ви можете зробити це:

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()

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.