2012-05-26 3 views
7

У меня есть большой набор данных, которые я пытаюсь представить в 3D, надеясь обнаружить узор. Я потратил довольно много времени на чтение, исследование и кодирование, но потом я понял, что главная проблема - это не программирование, а фактически выбор способа визуализации данных.Как вы представляете следующие 3D данные в Matplotlib или Mayavi?

mplot3d Matplotlib предлагает множество опций (каркас, контур, заполненный контур и т. Д.), А также MayaVi. Но есть так много вариантов (и каждый со своей собственной кривой обучения), что я практически потерян и не знаю с чего начать! Итак, мой вопрос в том, какой метод построения шрифтов вы бы использовали, если бы вам приходилось иметь дело с этими данными?

Мои данные основаны на дате. Для каждого момента времени я рисую значение (список «Фактический»).

Но для каждого момента времени у меня также есть верхний предел, нижний предел и точка среднего диапазона. Эти пределы и средние точки основаны на семенах в разных плоскостях.

Я хочу определить точку или определить шаблон, когда или прежде произошли серьезные изменения в моем «Фактическом» чтении. Это когда встречаются верхние пределы на всех плоскостях? Или подходите друг к другу? Это когда фактическое значение касается верхнего/среднего/нижнего предела? Это когда Uppers в одном плане касаются Lowers другого самолета?

В коде, который я вставляю, я уменьшил набор данных до нескольких элементов. Я просто использую простые разброс и линейные графики, но из-за размера набора данных (и, возможно, ограничений mplot3d?), Я не могу использовать его для определения тенденций, которые я ищу.

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

Я получаю этот сюжет, но это просто не помогает мне видеть какие-либо отношения.

enter image description here Я не математик или ученый, поэтому мне действительно нужна помощь в выборе FORMAT для визуализации моих данных. Есть ли эффективный способ показать это в mplot3d? Или вы бы использовали MayaVis? В любом случае, какую библиотеку и классы вы используете?

Заранее спасибо.

+2

Если вы ищете корреляции, 3d может быть не самым лучшим образом. Перспектива мешает интерпретации. Вместо этого вы можете использовать фасетные диаграммы, над графикой и диаграммами рассеяния. – gauden

ответ

7

Чтобы прокомментировать часть визуализации вашего вопроса (а не программирование), я изложил некоторые примеры фасетных графов, чтобы предложить альтернативы, которые вы можете использовать для изучения ваших данных.

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

В первом примере, тонкая синяя линия представляет собой фактическое значение накладывается на всех трех уровней в каждой из осей г.

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

Во втором наборе, каждая панель имеет разброс фактического значения против трех уровней (Top, Mid, Low) в каждом из осей г.

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

Спасибо, gauden. Что касается второго набора (тот, у которого серый сюжет вокруг серого), что такое диаграмма, известная как R? И знаете ли вы название эквивалента Python/matplotlib? Я смотрел [галерею matplotlib] (http://matplotlib.sourceforge.net/gallery.html) и, похоже, не нашел ничего подобного. – Zambi

+1

@ Zambi Я рад опубликовать код R. Вы можете добавить тег 'R' в свой вопрос, чтобы добавить к числу возможных ответов. Я не уверен, что второй сюжет имеет определенное имя. Это набор диаграмм рассеяния, связанных двумя переменными (ось z и уровни). Линия представляет собой установленную кривую «лесс», а облако представляет стандартную ошибку. Я использую пакет ['ggplot2'] (http://had.co.nz/ggplot2/) для его создания. – gauden

+2

Некоторые общие названия для такого подхода к разбиению данных на подмножества и построение сетки двумерных подсетей являются «гранями» (ggplot [Wickham]) или «малыми кратными» (Tufte) или «условными графиками», часто сокращенными до «coplots» (решетка/Треллис [Кливленд, Чамберс, Саркар]) –

2

Спасибо, Gauden. R на самом деле был частью моего исследования, и я установил его, но не слишком далеко продвинулся в этом учебнике. Если это не противоречит правилам StackOverFlow, я был бы рад видеть ваш R-код.

Я уже пробовал 2D-представления, но во многих случаях значения для Tops1/Tops2/Tops3 (и аналогично для минимумов) были бы равны, поэтому линии заканчиваются перекрытием и затенением друг друга. Вот почему я пытаюсь использовать 3D-вариант. Ваша идея трех панелей 2D-графиков - отличное предложение, которое я не изучил.

Я попробую, но я бы подумал, что 3D-график даст мне более четкую картину, особенно график каркаса/сетки, который будет показывать ценности, и я увижу голубую точку, плавающую в трехмерном пространстве в тот момент, когда линии на каркасе начинают создавать пик или желоб. Я просто не могу заставить его работать.

Я пробовал адаптировать matplotlib's Wireframe example, но сюжет, который я получаю, совсем не похож на каркас.

Это то, что я получаю из кода ниже enter image description here только с двумя из элементов данных (Tops1 и 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 для экспериментов. Я надеюсь, что другие придут, чтобы помочь, и я помог решить вопрос. – gauden

Смежные вопросы