Mam listę 3-krotek reprezentujących zbiór punktów w przestrzeni 3D. Chcę wykreślić powierzchnię obejmującą wszystkie te punkty.
plot_surface
Funkcji w mplot3d
opakowaniu wymaga jako argumenty X, Y i Z może być 2d tablice. Czy plot_surface
odpowiednia funkcja do kreślenia powierzchni i jak przekształcić moje dane do wymaganego formatu?
data = [(x1,y1,z1),(x2,y2,z2),.....,(xn,yn,zn)]
python
numpy
matplotlib
surface
Graddy
źródło
źródło
Odpowiedzi:
W przypadku powierzchni jest to trochę inne niż lista 3-krotek, należy przekazać siatkę dla domeny w tablicach 2d.
Jeśli masz tylko listę punktów 3D, a nie jakąś funkcję
f(x, y) -> z
, będziesz mieć problem, ponieważ istnieje wiele sposobów triangulacji chmury punktów 3D na powierzchnię.Oto przykład gładkiej powierzchni:
źródło
f(x,y) -> z
pozwala uzyskać więcej informacji, niż zwykłe stosowanie podejścia opartego na liście, takiego jak początkowo PO.plot_trisurf
zamiast tego spojrzeć . Ale jak już wspomniałem, jest to nietrywialne, ponieważ musisz triangulować powierzchnię i istnieje wiele rozwiązań. Jako podstawowy przykład rozważ tylko 4 punkty podane przez (0, 0, 0,2), (0, 1, 0), (1, 1, 0,2), (1, 0, 0). Oglądany z góry wygląda jak kwadrat z lekkim fałdem. Ale na której przekątnej występuje „fałda”? Czy jest to „wysoka” przekątna przy 0,2 czy „mała” przekątna przy 0? Obie są ważnymi powierzchniami! Musisz więc wybrać algorytm triangulacji, zanim będziesz miał dobrze zdefiniowane rozwiązanie.projection='3d'
w wywołaniufig.add_subplot
będzie niedostępne bez tego importu.Możesz czytać dane bezpośrednio z jakiegoś pliku i wykresu
W razie potrzeby możesz podać vmin i vmax, aby zdefiniować zakres kolorów, np
Sekcja bonusowa
Zastanawiałem się, jak wykonać interaktywne wykresy, w tym przypadku ze sztucznymi danymi
źródło
Właśnie natknąłem się na ten sam problem. I równomiernie rozmieszczone dane, które są w 3 1-D tablic zamiast macierzy 2-D, że
matplotlib
„Splot_surface
pragnie. Moje dane znalazły się w postaci,pandas.DataFrame
więc otomatplotlib.plot_surface
przykład z modyfikacjami wykresu 3 tablic 1-D.To jest oryginalny przykład. Dodanie tego następnego bitu powoduje utworzenie tego samego wykresu z 3 tablic 1-W.
Oto wynikowe liczby:
źródło
Żeby się wtrącić, Emanuel miał odpowiedź, której ja (i prawdopodobnie wielu innych) szukam. Jeśli masz rozproszone dane 3D w 3 oddzielnych tablicach, pandy są niesamowitą pomocą i działają znacznie lepiej niż inne opcje. Aby rozwinąć, załóżmy, że twoje x, y, z są pewnymi dowolnymi zmiennymi. W moim przypadku były to błędy c, gamma i błędy, ponieważ testowałem maszynę wektorów nośnych. Istnieje wiele potencjalnych możliwości wykreślenia danych:
Wykres szkieletowy danych
Rozrzut danych w 3D
Kod wygląda następująco:
Oto ostateczny wynik:
źródło
sprawdź oficjalny przykład. X, Y i Z są rzeczywiście tablicami 2d, numpy.meshgrid () to prosty sposób na uzyskanie siatki 2d x, y z wartości 1d x i y.
http://matplotlib.sourceforge.net/mpl_examples/mplot3d/surface3d_demo.py
oto pythonowy sposób na konwersję 3-krotek na 3 tablice 1d.
Oto triangulacja mtaplotlib delaunay (interpolacja), konwertuje 1d x, y, z na coś zgodnego (?):
http://matplotlib.sourceforge.net/api/mlab_api.html#matplotlib.mlab.griddata
źródło
Dodam tylko kilka myśli, które mogą pomóc innym z problemami z nieregularnym typem domeny. W sytuacji, gdy użytkownik ma trzy wektory / listy, x, y, z reprezentujące rozwiązanie 2D, gdzie z ma być narysowane na prostokątnej siatce jako powierzchni, mają zastosowanie komentarze „plot_trisurf ()” autorstwa ArtifixR. Podobny przykład, ale z domeną inną niż prostokątna, to:
Powyższy kod daje:
Jednak może to nie rozwiązać wszystkich problemów, zwłaszcza gdy problem dotyczy nieregularnej domeny. Również w przypadku, gdy domena ma jeden lub więcej obszarów wklęsłych, triangulacja delaunaya może skutkować generowaniem fałszywych trójkątów na zewnątrz domeny. W takich przypadkach te nieuczciwe trójkąty muszą zostać usunięte z triangulacji, aby uzyskać prawidłową reprezentację powierzchni. W takich sytuacjach użytkownik może być zmuszony do jawnego włączenia obliczeń triangulacji delaunaya, aby można było programowo usunąć te trójkąty. W takich okolicznościach poniższy kod mógłby zastąpić poprzedni kod wydruku:
Poniżej przedstawiono przykładowe wykresy ilustrujące rozwiązanie 1) z fałszywymi trójkątami i 2) z których zostały usunięte:
Mam nadzieję, że powyższe może być pomocne dla osób z sytuacjami wklęsłymi w danych rozwiązania.
źródło
W Matlab Zrobiłem coś podobnego za pomocą
delaunay
funkcji nax
,y
koordy tylko (niez
), a następnie wykreślenie ztrimesh
lubtrisurf
, używającz
jako wysokość.SciPy ma klasę Delaunay , która jest oparta na tej samej podstawowej bibliotece QHull, co funkcja Matlab
delaunay
, więc powinieneś uzyskać identyczne wyniki.Stamtąd powinno być kilka wierszy kodu, aby przekonwertować ten przykład Plotting 3D Polygons w python-matplotlib na to, co chcesz osiągnąć, ponieważ
Delaunay
podaje specyfikację każdego trójkątnego wielokąta.źródło
ax.plot_trisurf(..)
.Nie ma możliwości bezpośredniego wykonania powierzchni 3D przy użyciu danych. Poleciłbym zbudowanie modelu interpolacji za pomocą narzędzi, takich jak pykridge . Proces będzie obejmował trzy kroki:
pykridge
X
iY
używającmeshgrid
Z
Po utworzeniu siatki i odpowiadających jej
Z
wartości możesz teraz zacząćplot_surface
. Zwróć uwagę, że w zależności od rozmiaru danychmeshgrid
funkcja może działać przez chwilę. Sposób obejścia problemu polega na utworzeniu równo rozmieszczonych próbek przy użyciu osinp.linspace
forX
iY
, a następnie zastosowaniu interpolacji w celu ustalenia niezbędnychZ
wartości. Jeśli tak, to interpolowane wartości mogą różnić się od oryginałuZ
, ponieważX
iY
uległy zmianie.źródło