Saya memiliki daftar 3-tupel yang mewakili satu set titik dalam ruang 3D. Saya ingin menggambar permukaan yang mencakup semua titik ini.
The plot_surface
fungsi dalam mplot3d
paket memerlukan sebagai argumen X, Y dan Z menjadi array 2d. Apakah plot_surface
fungsi yang tepat untuk memplot permukaan dan bagaimana cara mengubah data saya ke dalam format yang diperlukan?
data = [(x1,y1,z1),(x2,y2,z2),.....,(xn,yn,zn)]
python
numpy
matplotlib
surface
Graddy
sumber
sumber
Jawaban:
Untuk permukaan ini sedikit berbeda dari daftar 3-tupel, Anda harus meneruskan grid untuk domain dalam array 2d.
Jika yang Anda miliki hanyalah daftar titik 3d, bukan beberapa fungsi
f(x, y) -> z
, Anda akan mendapat masalah karena ada beberapa cara untuk melakukan triangulasi titik awan 3d tersebut ke permukaan.Berikut contoh permukaan yang halus:
sumber
f(x,y) -> z
memberi Anda lebih banyak informasi daripada hanya menggunakan pendekatan daftar seperti yang awalnya dimiliki OP.plot_trisurf
. Tapi seperti yang saya sebutkan, ini tidak sepele karena Anda perlu melakukan triangulasi permukaan dan ada banyak solusi. Sebagai contoh dasar, pertimbangkan hanya 4 poin yang diberikan oleh (0, 0, 0.2), (0, 1, 0), (1, 1, 0.2), (1, 0, 0). Dilihat dari atas, terlihat seperti persegi dengan sedikit lipatan di dalamnya. Tapi sepanjang diagonal manakah "lipatan" itu terjadi? Apakah diagonal "tinggi" pada 0,2 atau diagonal "rendah" pada 0? Keduanya adalah permukaan yang valid! Jadi, Anda perlu memilih algoritme triangulasi sebelum Anda memiliki solusi yang terdefinisi dengan baik.projection='3d'
dalam panggilanfig.add_subplot
tidak akan tersedia tanpa impor ini.Anda dapat membaca data langsung dari beberapa file dan plot
Jika perlu, Anda dapat meneruskan vmin dan vmax untuk menentukan rentang colorbar, mis
Bagian Bonus
Saya bertanya-tanya bagaimana melakukan beberapa plot interaktif, dalam hal ini dengan data buatan
sumber
Saya baru saja menemukan masalah yang sama ini. Saya telah merata spasi data yang ada di 3 array 1-D bukan array 2-D yang
matplotlib
'splot_surface
keinginan. Data saya kebetulan ada dipandas.DataFrame
sini, jadi inilahmatplotlib.plot_surface
contoh dengan modifikasi untuk memplot 3 array 1-D.Itu contoh aslinya. Menambahkan bit berikutnya ini akan membuat plot yang sama dari array 3 1-D.
Berikut angka-angka yang dihasilkan:
sumber
Sekadar berpadu, Emanuel memiliki jawaban yang saya (dan mungkin banyak lainnya) cari. Jika Anda memiliki data 3d yang tersebar dalam 3 larik terpisah, panda adalah bantuan luar biasa dan bekerja jauh lebih baik daripada opsi lainnya. Untuk menguraikan, anggaplah x, y, z Anda adalah beberapa variabel sembarang. Dalam kasus saya ini adalah c, gamma, dan kesalahan karena saya sedang menguji mesin vektor dukungan. Ada banyak pilihan potensial untuk memplot data:
Plot data wireframe
3d penyebaran data
Kodenya terlihat seperti ini:
Inilah hasil akhirnya:
sumber
periksa contoh resminya. X, Y dan Z memang array 2d, numpy.meshgrid () adalah cara sederhana untuk mendapatkan 2d x, y mesh dari nilai 1d x dan y.
http://matplotlib.sourceforge.net/mpl_examples/mplot3d/surface3d_demo.py
inilah cara pythonic untuk mengubah 3-tuple Anda menjadi 3 1d array.
Berikut triangulasi penundaan mtaplotlib (interpolasi), ini mengubah 1d x, y, z menjadi sesuatu yang sesuai (?):
http://matplotlib.sourceforge.net/api/mlab_api.html#matplotlib.mlab.griddata
sumber
Di Matlab saya melakukan hal serupa dengan menggunakan
delaunay
fungsi padax
,y
hanya coord (bukanz
), lalu memplot dengantrimesh
atautrisurf
, menggunakanz
sebagai ketinggian.SciPy memiliki kelas Delaunay , yang didasarkan pada pustaka QHull dasar yang sama dengan
delaunay
fungsi Matlab , jadi Anda harus mendapatkan hasil yang identik.Dari sana, harus ada beberapa baris kode untuk mengubah Plotting 3D Polygons ini dalam contoh python-matplotlib menjadi apa yang ingin Anda capai, seperti yang
Delaunay
memberi Anda spesifikasi dari setiap poligon segitiga.sumber
ax.plot_trisurf(..)
.Hanya untuk menambahkan beberapa pemikiran lebih lanjut yang dapat membantu orang lain dengan masalah jenis domain tidak teratur. Untuk situasi di mana pengguna memiliki tiga vektor / daftar, x, y, z mewakili solusi 2D di mana z akan diplot pada kisi persegi panjang sebagai permukaan, komentar 'plot_trisurf ()' oleh ArtifixR dapat diterapkan. Contoh serupa tetapi dengan domain non persegi panjang adalah:
Kode di atas menghasilkan:
Namun, ini mungkin tidak menyelesaikan semua masalah, khususnya di mana masalah didefinisikan pada domain tidak beraturan. Juga, dalam kasus di mana domain memiliki satu atau lebih area cekung, triangulasi penundaan dapat mengakibatkan munculnya segitiga palsu di luar domain. Dalam kasus seperti itu, segitiga nakal ini harus dihilangkan dari triangulasi untuk mencapai representasi permukaan yang benar. Untuk situasi ini, pengguna mungkin harus secara eksplisit menyertakan penghitungan triangulasi penundaan sehingga segitiga ini dapat dihapus secara terprogram. Dalam keadaan ini, kode berikut dapat menggantikan kode plot sebelumnya:
Contoh plot diberikan di bawah ini menggambarkan solusi 1) dengan segitiga palsu, dan 2) di mana mereka telah dihilangkan:
Saya berharap hal di atas dapat membantu orang-orang dengan situasi cekung dalam data solusi.
sumber
Tidak mungkin membuat permukaan 3d secara langsung menggunakan data Anda. Saya akan merekomendasikan Anda untuk membangun model interpolasi menggunakan beberapa alat seperti pykridge . Prosesnya akan mencakup tiga langkah:
pykridge
X
danY
gunakanmeshgrid
Z
Setelah membuat kisi Anda dan nilai yang sesuai
Z
, sekarang Anda siap untuk menggunakannyaplot_surface
. Perhatikan bahwa tergantung pada ukuran data Anda,meshgrid
fungsi tersebut dapat berjalan untuk sementara waktu. Solusi adalah untuk membuat sampel merata spasi menggunakannp.linspace
untukX
danY
kapak, kemudian menerapkan interpolasi untuk menyimpulkan diperlukanZ
nilai-nilai. Jika demikian, nilai interpolasi mungkin berbeda dari aslinyaZ
karenaX
danY
telah berubah.sumber