Vẽ danh sách tọa độ (x, y) trong python matplotlib


110

Tôi có một danh sách các cặp (a, b)mà tôi muốn vẽ matplotlibtrong python dưới dạng tọa độ xy thực tế. Hiện tại, nó đang tạo ra hai biểu đồ, trong đó chỉ mục của danh sách cho tọa độ x và các giá trị y của ô thứ nhất là as trong các cặp và giá trị y của ô thứ hai là bs trong các cặp.

Để làm rõ, dữ liệu của tôi trông như thế này: li = [(a,b), (c,d), ... , (t, u)] Tôi muốn tạo một lớp lót chỉ gọi plt.plot()sai. Nếu tôi không yêu cầu một lớp lót, tôi có thể làm được:

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

Làm cách nào tôi có thể lấy matplotlib để vẽ các cặp này dưới dạng tọa độ xy?

Câu trả lời:


180

Theo ví dụ này :

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

sẽ sản xuất:

nhập mô tả hình ảnh ở đây

Để giải nén dữ liệu của bạn từ các cặp thành danh sách, hãy sử dụng zip:

x, y = zip(*li)

Vì vậy, một lớp lót:

plt.scatter(*zip(*li))

7
Đối với một mảng NumPy 2 cột, plt.scatter( * xy.T )hoạt động: ngắn và che khuất chox, y = xy.T; plt.scatter( x, y )
denis

2
x, y = zip(*li)là mã trăn thực sự tao nhã! tôi đã làm hai dòng hơn thẳng về phía trước của mã với một nén danh sách trên mỗi dòng (như câu hỏi ban đầu)
Trevor Boyd Smith

1
Thật khó hiểu plt.scatterví dụ ngẫu nhiên có liên quan gì đến câu hỏi.
jamesdlin

36

Nếu bạn có một mảng numpy, bạn có thể thực hiện điều này:

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
Vì vậy, không có cách nào để có một np.arraysố data=np.array([[x1,y1],[x2,y2],etc.])và sử dụng plt.plot(data). Tôi sẽ luôn phải cung cấp hai mảng thay vì mảng của mảng?
Max Coplan

1
@MaxCoplan, đúng vậy, nhưng bạn có thể sử dụng plt.plot(*data.T)cái nào tương tự như ở trên nhưng bỏ qua bước trung gian.
Zweedeend

7

Nếu bạn muốn vẽ một đường thẳng nối tất cả các điểm trong danh sách

plt . plot ( li [ : ] )

plt . show ( )

Thao tác này sẽ vẽ một đường thẳng nối tất cả các cặp trong danh sách dưới dạng các điểm trên mặt phẳng Descartes từ đầu danh sách đến cuối danh sách. Tôi hy vọng rằng đây là những gì bạn muốn.


3
Anh ấy không muốn vẽ một dòng duy nhất, anh ấy muốn vẽ bằng một "one-liner" (một dòng mã duy nhất). Câu trả lời mà anh ấy đang tìm kiếm (và đã nhận được 3 năm trước) là sử dụng scatter().
Dartmouth

8
Vì câu trả lời này nêu điều kiện mà nó hoạt động, tức là "Nếu bạn muốn vẽ một đường thẳng nối tất cả các điểm trong danh sách", nó có thực sự xứng đáng được bỏ phiếu không?
Gathide
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.