2012-05-26 21 views
7

Mam duży zestaw danych, które próbuję reprezentować w 3D mając nadzieję wykryć wzór. Spędziłem sporo czasu na czytaniu, badaniu i kodowaniu, ale wtedy zdałem sobie sprawę, że moim głównym problemem NIE jest programowanie, ale w rzeczywistości wybieranie sposobu wizualizacji danych.W jaki sposób można reprezentować następujące dane 3D w Matplotlib lub Mayavi?

Program mplot3d firmy Matplotlib oferuje wiele opcji (szkielet, kontur, wypełniony kontur itp.), Podobnie jak MayaVi. Ale jest tak wiele wyborów (i każda z własną krzywą uczenia się), że praktycznie jestem zagubiony i nie wiem od czego zacząć! Moje pytanie brzmi więc zasadniczo, którą metodę kreślenia używałbyś, gdybyś miał do czynienia z tymi danymi?

Moje dane są oparte na datach. Dla każdego punktu w czasie wykreślam wartość (lista "Rzeczywisty").

Ale dla każdego punktu w czasie mam również górny limit, dolny limit i środkowy punkt zakresu. Te ograniczenia i punkty środkowe są oparte na ziarnie, w różnych płaszczyznach.

Chcę rozpoznać punkt lub zidentyfikować wzór, kiedy lub w czasie mojej ważnej zmiany nastąpi mój "aktualny" odczyt. Czy to się dzieje, gdy spotykają się górne limity dla wszystkich samolotów? Lub podejść do siebie? Czy to jest, gdy wartość rzeczywista dotyka górnego/środkowego/dolnego limitu? Czy to jest, gdy wierzchy w jednej płaszczyźnie dotykają Niższych z innej płaszczyzny?

W kodzie, który wklejam, zmniejszyłem zestaw danych do zaledwie kilku elementów. Używam tylko prostych wykresów rozproszenia i linii, ale ze względu na rozmiar zbioru danych (i być może ograniczenia mplot3d?), Nie jestem w stanie użyć go do wykrycia trendów, których szukam.

dates = [20110101,20110104,20110105,20110106,20110107,20110108,20110111,20110112] 

zAxis0= [  0,  0,  0,  0,  0,  0,  0,  0] 
Actual= [ 1132, 1184, 1177,  950, 1066, 1098, 1116, 1211] 

zAxis1= [  1,  1,  1,  1,  1,  1,  1,  1] 
Tops1 = [ 1156, 1250, 1156, 1187, 1187, 1187, 1156, 1156] 
Mids1 = [ 1125, 1187, 1125, 1156, 1156, 1156, 1140, 1140] 
Lows1 = [ 1093, 1125, 1093, 1125, 1125, 1125, 1125, 1125] 

zAxis2= [  2,  2,  2,  2,  2,  2,  2,  2] 
Tops2 = [ 1125, 1125, 1125, 1125, 1125, 1250, 1062, 1250] 
Mids2 = [ 1062, 1062, 1062, 1062, 1062, 1125, 1000, 1125] 
Lows2 = [ 1000, 1000, 1000, 1000, 1000, 1000,  937, 1000] 

zAxis3= [  3,  3,  3,  3,  3,  3,  3,  3] 
Tops3 = [ 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250] 
Mids3 = [ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187] 
Lows3 = [ 1125, 1125, 1000, 1125, 1125, 1093, 1093, 1000] 

import matplotlib.pyplot 
from mpl_toolkits.mplot3d import Axes3D 

fig = matplotlib.pyplot.figure() 
ax = fig.add_subplot(111, projection = '3d') 

#actual values 
ax.scatter(dates, zAxis0, Actual, color = 'c', marker = 'o') 

#Upper limits, Lower limts, and Mid-range for the FIRST plane 
ax.plot(dates, zAxis1, Tops1, color = 'r') 
ax.plot(dates, zAxis1, Mids1, color = 'y') 
ax.plot(dates, zAxis1, Lows1, color = 'b') 

#Upper limits, Lower limts, and Mid-range for the SECOND plane 
ax.plot(dates, zAxis2, Tops2, color = 'r') 
ax.plot(dates, zAxis2, Mids2, color = 'y') 
ax.plot(dates, zAxis2, Lows2, color = 'b') 

#Upper limits, Lower limts, and Mid-range for the THIRD plane 
ax.plot(dates, zAxis3, Tops3, color = 'r') 
ax.plot(dates, zAxis3, Mids3, color = 'y') 
ax.plot(dates, zAxis3, Lows3, color = 'b') 

#These two lines are just dummy data that plots transparent circles that 
#occpuy the "wall" behind my actual plots, so that the last plane appears 
#floating in 3D rather than being pasted to the plot's background 
zAxis4= [  4,  4,  4,  4,  4,  4,  4,  4] 
ax.scatter(dates, zAxis4, Actual, color = 'w', marker = 'o', alpha=0) 

matplotlib.pyplot.show() 

Dostaję ten spisek, ale to nie pomaga mi widzieć żadnych współpracowników relacji.

enter image description here Nie jestem matematykiem ani naukowcem, więc potrzebuję pomocy przy wyborze FORMATU, w którym będę wizualizował moje dane. Czy istnieje skuteczny sposób pokazania tego w mplot3d? A może użyłbyś MayaVis? W obu przypadkach, której biblioteki i klasy (klas) używałbyś?

Z góry dziękuję.

+2

Jeśli szukasz korelacji, 3D może nie być najlepszym sposobem. Perspektywa staje na drodze do interpretacji. Zamiast tego możesz użyć wykadrowanych wykresów, wykresów i wykresów rozrzutu. – gauden

Odpowiedz

7

Aby skomentować część pytania związaną z wizualizacją (a nie programowanie), wyśmiewałem kilka przykładowych wykresów, aby zaproponować alternatywne rozwiązania, które można wykorzystać do eksploracji danych.

library("lubridate") 
library("ggplot2") 
library("reshape2") 

dates <- c("2011-01-01","2011-01-04","2011-01-05", 
      "2011-01-06","2011-01-07","2011-01-08", 
      "2011-01-11","2011-01-12") 
dates <- ymd(dates) 

Actual<- c( 1132, 1184, 1177,  950, 1066, 1098, 1116, 1211, 
       1132, 1184, 1177,  950, 1066, 1098, 1116, 1211, 
       1132, 1184, 1177,  950, 1066, 1098, 1116, 1211) 
z  <- c(  1,  1,  1,  1,  1,  1,  1,  1, 
        2,  2,  2,  2,  2,  2,  2,  2, 
        3,  3,  3,  3,  3,  3,  3,  3) 
Tops <- c( 1156, 1250, 1156, 1187, 1187, 1187, 1156, 1156, 
       1125, 1125, 1125, 1125, 1125, 1250, 1062, 1250, 
       1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250) 
Mids <- c( 1125, 1187, 1125, 1156, 1156, 1156, 1140, 1140, 
       1062, 1062, 1062, 1062, 1062, 1125, 1000, 1125, 
       1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187) 
Lows <- c( 1093, 1125, 1093, 1125, 1125, 1125, 1125, 1125, 
       1000, 1000, 1000, 1000, 1000, 1000,  937, 1000, 
       1125, 1125, 1000, 1125, 1125, 1093, 1093, 1000) 

df <- data.frame(cbind(z, dates, Actual, Tops, Mids, Lows)) 

dfm <- melt(df, id.vars=c("z", "dates", "Actual")) 

W pierwszym przykładzie cienka niebieska linia to wartość rzeczywista nakładana na wszystkie trzy poziomy w każdej z osi Z.

p <- ggplot(data = dfm, 
      aes(x = dates, 
       y = value, 
       group = variable, 
       colour = variable) 
      ) + geom_line(size = 3) + 
       facet_grid(variable ~ z) + 
       geom_point(aes(x = dates, 
           y = Actual), 
          colour = "steelblue", 
          size = 3) + 
           geom_line(aes(x = dates, 
              y = Actual), 
             colour = "steelblue", 
             size = 1) + 
              theme_bw() 
p 

line charts

W drugim secie, każdy panel ma rozrzutu wartości rzeczywistej z trzech poziomów (Top, Mid, Low) w każdej z osi Z.

p <- ggplot(data = dfm, 
      aes(x = Actual, 
       y = value, 
       group = variable, 
       colour = variable) 
      ) + geom_point(size = 3) + 
       geom_smooth() + 
       facet_grid(variable ~ z) + 
       theme_bw() 
p 

correlation

+0

Dzięki, gauden. Jeśli chodzi o drugi zestaw (ten z szarą kopertą otaczającą fabułę), jaki jest ten rodzaj wykresu znany jako R? Czy znasz nazwę odpowiednika Python/matplotlib? Patrzyłem na [galeria matplotlib] (http://matplotlib.sourceforge.net/gallery.html) i nie mogę znaleźć czegoś podobnego. – Zambi

+1

@Zambi Z przyjemnością umieszczam kod R. Możesz dodać tag "R" do swojego pytania, aby dodać do liczby możliwych odpowiedzi. Nie jestem pewien, czy drugi wątek ma konkretne imię. Jest to zestaw wykresów rozrzutu podzielonych na dwie zmienne (oś i poziomy Z). Linia jest dopasowaną krzywą "lessową", a chmura reprezentuje standardowy błąd. Używam pakietu ['ggplot2'] (http://had.co.nz/ggplot2/), aby to zrobić. – gauden

+2

Niektóre popularne nazwy tego podejścia polegające na rozbijaniu danych na podzbiory i nanoszeniu siatki na dwie partycje 2D to "fasety" (ggplot [Wickham]) lub "małe wielokrotności" (Tufte) lub "spacje kondycjonujące", często skracane do "coplots" (krata/Trellis [Cleveland, Chambers, Sarkar]) –

2

Dziękuję Gauden. R był w rzeczywistości częścią moich badań i zainstalowałem go, ale po prostu nie poszedłem wystarczająco daleko z tutorialem. O ile nie jest to sprzeczne z zasadami StackOverFlow, byłbym wdzięczny za zobaczenie twojego kodu R.

Próbowałem już reprezentacji 2D, ale w wielu przypadkach wartości dla Tops1/Tops2/Tops3 (i podobnie dla Lows) byłyby równe, więc linie kończą się nakładaniem i zaciemniają. Właśnie dlatego próbuję opcji 3D. Twój pomysł na 3 panele wykresów 2D to świetna propozycja, której nie odkryłem.

Spróbuję, ale pomyślałbym, że działka 3D da mi wyraźniejszy obraz, zwłaszcza wykres siatkowy/siatkowy, który pokazywałby zbieżność wartości i zobaczyłbym niebieską kropkę unoszącą się w przestrzeni 3D w punkcie, w którym linie na krawędziowej krawędzi zaczynają tworzyć pik lub koryto. Po prostu nie mogę go uruchomić.

Próbowałem przystosować matplotlib's Wireframe example, ale fabuła, którą otrzymuję, wcale nie wygląda jak szkielet.

To co dostaję z kodu poniżej enter image description here tylko z dwóch elementów danych (Tops1 i Tops2):

dates = [20110101,20110104,20110105,20110106,20110107,20110108,20110111,20110112] 

zAxis0= [  0,  0,  0,  0,  0,  0,  0,  0] 
Actual= [ 1132, 1184, 1177,  950, 1066, 1098, 1116, 1211] 

zAxis1= [  1,  1,  1,  1,  1,  1,  1,  1] 
Tops1 = [ 1156, 1250, 1156, 1187, 1187, 1187, 1156, 1156] 
Mids1 = [ 1125, 1187, 1125, 1156, 1156, 1156, 1140, 1140] 
Lows1 = [ 1093, 1125, 1093, 1125, 1125, 1125, 1125, 1125] 

zAxis2= [  2,  2,  2,  2,  2,  2,  2,  2] 
Tops2 = [ 1125, 1125, 1125, 1125, 1125, 1250, 1062, 1250] 
Mids2 = [ 1062, 1062, 1062, 1062, 1062, 1125, 1000, 1125] 
Lows2 = [ 1000, 1000, 1000, 1000, 1000, 1000,  937, 1000] 

zAxis3= [  3,  3,  3,  3,  3,  3,  3,  3] 
Tops3 = [ 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1250] 
Mids3 = [ 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187] 
Lows3 = [ 1125, 1125, 1000, 1125, 1125, 1093, 1093, 1000] 

import matplotlib.pyplot 
from mpl_toolkits.mplot3d import Axes3D 

fig = matplotlib.pyplot.figure() 
ax = fig.add_subplot(111, projection = '3d') 

####example code from: http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/tutorial.html#wireframe-plots 
#from mpl_toolkits.mplot3d import axes3d 
#import matplotlib.pyplot as plt 
#import numpy as np 

#fig = plt.figure() 
#ax = fig.add_subplot(111, projection='3d') 
#X, Y, Z = axes3d.get_test_data(0.05) 
#ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10) 

#plt.show() 

X, Y, Z = dates, Tops1, Tops2 
ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1, color = 'g') 

matplotlib.pyplot.show() 
+0

+1 do eksperymentów. Mam nadzieję, że inni wkroczą, aby pomóc, a ja faworyzowałem pytanie, aby zobaczyć, co się pojawia. – gauden