2012-05-26 33 views
7

Tôi có một bộ dữ liệu lớn mà tôi đang cố gắng trình bày trong 3D với hy vọng phát hiện ra một mẫu. Tôi đã dành khá nhiều thời gian để đọc, nghiên cứu và viết mã, nhưng sau đó tôi nhận ra vấn đề chính của mình KHÔNG phải là lập trình, nhưng thực sự là chọn cách để trực quan hóa dữ liệu.Bạn sẽ trình bày dữ liệu 3D sau đây như thế nào trong Matplotlib hoặc Mayavi?

mplot3d Matplotlib của cung cấp rất nhiều tùy chọn (wireframe, đường viền, điền đường viền, vv), và do đó, MayaVi. Nhưng có rất nhiều sự lựa chọn (và mỗi lựa chọn với đường cong học tập của riêng mình) mà tôi thực tế đã mất và không biết bắt đầu từ đâu! Vì vậy, câu hỏi của tôi về cơ bản là phương pháp âm mưu bạn sẽ sử dụng nếu bạn đã phải đối phó với dữ liệu này?

dữ liệu của tôi là ngày-based. Đối với mỗi điểm trong thời gian, tôi vẽ một giá trị (danh sách 'Thực tế').

Nhưng đối với mỗi điểm trong thời gian, tôi cũng có một giới hạn trên, giới hạn thấp hơn, và một điểm tầm trung. Các giới hạn và điểm giữa này dựa trên hạt giống, trong các mặt phẳng khác nhau.

Tôi muốn để phát hiện các điểm hoặc xác định mô hình khi, hoặc trước đó, một sự thay đổi lớn xảy ra trong đọc 'thực tế' của tôi. Có phải khi các giới hạn trên trên tất cả các máy bay gặp nhau không? Hoặc tiếp cận nhau? Có phải khi giá trị thực tế chạm vào giới hạn Trên/Trung/Thấp hơn không? Có phải khi Uppers trong một mặt phẳng chạm vào các Máy bay của một chiếc máy bay khác không?

Trong mã Tôi dán, tôi đã giảm dữ liệu thiết lập để chỉ một vài yếu tố. Tôi chỉ sử dụng các ô phân tán và đường kẻ đơn giản, nhưng vì kích thước của tập dữ liệu (và có thể là giới hạn của mplot3d?), Tôi không thể sử dụng nó để phát hiện ra xu hướng tôi đang tìm kiếm.

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

Tôi nhận được cốt truyện này, nhưng nó không giúp tôi thấy bất kỳ mối quan hệ nào.

enter image description here Tôi không phải là nhà toán học hay nhà khoa học, vì vậy điều tôi thực sự cần là giúp chọn FORMAT để hiển thị dữ liệu của tôi. Có một cách hiệu quả để hiển thị điều này trong mplot3d? Hay bạn sẽ sử dụng MayaVis? Trong cả hai trường hợp, bạn sẽ sử dụng thư viện và lớp học nào?

Xin cảm ơn trước.

+2

Nếu bạn đang tìm kiếm mối tương quan, 3d thể không phải là cách tốt nhất. Quan điểm nhận được trong cách giải thích. Bạn có thể muốn sử dụng các biểu đồ có khía cạnh, thay vì vẽ sơ đồ và các ô phân tán. – gauden

Trả lời

7

Để nhận xét về phần hình dung câu hỏi của bạn (không phải là lập trình), tôi đã chế nhạo lên một số ví dụ facetted đồ thị để đề nghị giải pháp thay thế, bạn có thể muốn sử dụng để khám phá dữ liệu của bạn.

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

Trong ví dụ đầu tiên, dòng màu xanh lam mỏng là giá trị thực được xếp chồng lên cả ba cấp trong mỗi trục 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

Trong set thứ hai, mỗi bảng có phân tán giá trị thực tế so với ba cấp độ (hàng đầu, giữa, thấp) trong mỗi trục 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

Cảm ơn, gầy. Liên quan đến tập thứ hai (một với một phong bì màu xám xung quanh cốt truyện), loại biểu đồ này được gọi là gì trong R? Và bạn có biết tên của Python/matplotlib tương đương? Tôi đã xem [gallery của matplotlib] (http://matplotlib.sourceforge.net/gallery.html) và dường như không tìm thấy bất kỳ thứ gì tương tự. – Zambi

+1

@Zambi Tôi rất vui khi đăng mã R. Bạn có thể muốn thêm thẻ 'R' vào câu hỏi của mình để thêm vào số câu trả lời có thể có. Tôi không chắc lô thứ hai có tên cụ thể không. Nó là một tập hợp các ô tán xạ được tạo bởi hai biến (trục z và các mức). Đường thẳng là đường cong 'loess' được trang bị và đám mây đại diện cho lỗi chuẩn. Tôi sử dụng gói ['ggplot2'] (http://had.co.nz/ggplot2/) để tạo ra điều này. – gauden

+2

Một số tên phổ biến cho cách tiếp cận này để chia nhỏ dữ liệu thành các tập hợp con và vẽ một mạng lưới các ô con 2D là "các khía cạnh" (ggplot [Wickham]) hoặc "bội số nhỏ" (Tufte) hoặc "lô điều kiện", thường được rút ngắn thành "coplots" (lattice/Trellis [Cleveland, Chambers, Sarkar]) –

2

Cảm ơn bạn, gauden. R là một phần trong nghiên cứu của tôi, và tôi đã cài đặt nhưng không đi đủ xa với hướng dẫn. Trừ khi nó chống lại các quy tắc StackOverFlow, tôi rất cảm kích khi thấy mã R của bạn.

Tôi đã thử biểu diễn 2D, nhưng trong nhiều trường hợp giá trị cho Tops1/Tops2/Tops3 (và tương tự cho Thấp) sẽ bằng nhau, vì vậy các dòng kết thúc chồng lên nhau và che khuất nhau. Đây là lý do tại sao tôi đang thử tùy chọn 3D. Ý tưởng của bạn về 3 tấm biểu đồ 2D là một gợi ý tuyệt vời mà tôi chưa khám phá.

Tôi sẽ thử, nhưng tôi đã nghĩ một âm mưu 3D sẽ cho tôi hình ảnh rõ ràng hơn, đặc biệt là âm mưu khung/lưới sẽ hiển thị các giá trị hội tụ và tôi sẽ thấy chấm màu xanh nổi trong không gian 3D tại thời điểm khi các đường trên wireframe bắt đầu tạo ra một đỉnh hoặc đáy. Tôi không thể làm cho nó hoạt động được.

Tôi đã thử điều chỉnh matplotlib's Wireframe example nhưng cốt truyện tôi nhận được trông không giống như một khung dây ở tất cả.

Đây là những gì tôi nhận được từ mã dưới đây enter image description here chỉ với hai trong số những yếu tố dữ liệu (Tops1 và 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 cho thử nghiệm. Tôi hy vọng những người khác bước vào để giúp đỡ và tôi đã yêu thích câu hỏi để xem những gì nổi lên. – gauden

Các vấn đề liên quan