Merencanakan daftar koordinat (x, y) di python matplotlib

110

Saya memiliki daftar pasangan (a, b)yang ingin saya plot dengan matplotlibpython sebagai koordinat xy sebenarnya. Saat ini, ia membuat dua plot, di mana indeks daftar memberikan koordinat x, dan nilai y plot pertama adalah as pada pasangan dan nilai y plot kedua adalah bs pada pasangan.

Untuk memperjelas, data saya terlihat seperti ini: li = [(a,b), (c,d), ... , (t, u)] Saya ingin melakukan one-liner yang hanya menyebut plt.plot()salah. Jika saya tidak memerlukan one-liner, saya bisa melakukannya dengan mudah:

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

Bagaimana caranya agar matplotlib memplot pasangan ini sebagai koordinat xy?

CodeKingPlusPlus
sumber

Jawaban:

180

Sesuai contoh ini :

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

akan menghasilkan:

masukkan deskripsi gambar di sini

Untuk mengekstrak data Anda dari pasangan ke dalam daftar, gunakan zip:

x, y = zip(*li)

Jadi, satu baris:

plt.scatter(*zip(*li))
sashkello
sumber
7
Untuk larik numpy 2 kolom, plt.scatter( * xy.T )karya: pendek dan tidak jelas untukx, y = xy.T; plt.scatter( x, y )
denis
2
x, y = zip(*li)adalah kode python yang sangat elegan! Saya telah melakukan dua baris kode yang lebih lurus ke depan dengan kompresi daftar pada setiap baris (seperti pertanyaan asli)
Trevor Boyd Smith
1
Agak membingungkan apa hubungan plt.scattercontoh acak dengan pertanyaan.
jamesdlin
36

Jika Anda memiliki array numpy, Anda dapat melakukan ini:

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
sumber
1
Jadi tidak ada cara untuk memiliki np.arraydari data=np.array([[x1,y1],[x2,y2],etc.])dan menggunakan plt.plot(data). Saya selalu harus memberikan dua array, bukan array array?
Max Coplan
1
@MaxCoplan, itu benar, tetapi Anda dapat menggunakan plt.plot(*data.T)yang melakukan hal yang sama seperti di atas tetapi melewati langkah perantara.
Zweedeend
7

Jika Anda ingin menggambar satu garis yang menghubungkan semua titik dalam daftar

plt . plot ( li [ : ] )

plt . show ( )

Ini akan memplot sebuah garis yang menghubungkan semua pasangan dalam daftar sebagai titik-titik pada bidang Kartesius dari awal daftar hingga akhir. Saya harap ini yang Anda inginkan.

Shubham Rana
sumber
3
Dia tidak ingin menggambar satu baris pun, dia ingin menggambar dengan "satu baris" (satu baris kode). Jawaban yang dia cari (dan dapatkan 3 tahun lalu) adalah untuk digunakan scatter().
Dartmouth
8
Karena jawaban ini menyatakan kondisi di mana ia bekerja, yaitu "Jika Anda ingin menggambar satu baris yang menghubungkan semua poin dalam daftar", apakah itu benar-benar layak mendapat suara rendah?
Gathide