2011-12-13 36 views
5

Tôi đang cố gắng tự động vẽ dữ liệu chứa trong một ma trận với Mathematica 7. Dữ liệu được chứa trong nó như thế này, thu được thông qua một mô hình hóa học.Mathematica động để dữ liệu ma trận lô

[year H He  Li  C  ... C8H14+,Grain- ] 
[0  0 0.03 0.009 1E-3 ... 0    ] 
[100 .1 0.03 0.009 1E-3 ... 0    ] 
[200 .2 0.03 0.009 1E-3 ... 0    ] 
[300 .2 0.03 0.009 1E-3 ... 0    ] 
[... ... ... ...  ... ... ...   ] 
[1E6 .5 0.03 0.003 1E-8 ... 1E-25   ] 

Sự thật là, kích thước ma trận là 2001 * 1476 (2000 bước và dòng đầu tiên cho tên, và năm 1475 các hợp chất + 1 cột trong năm), rất nặng. Tôi đang cố phác họa bất kỳ hợp chất nào với âm mưu tập trung/năm. Này hoạt động

Manipulate[ 
    ListLogLogPlot[data[[All, {1, i}]], PlotLabel -> data[[1, i]] ], 
    {{i, 2, "Compound"}, 2, compounds, 1} 
] 

nơi dữ liệu là ma trận, và hợp chất một bộ biến ở số điện thoại của các hợp chất mô hình hóa (1475 đây). "hợp chất" là nhãn cho thanh trượt. Vấn đề là, thanh trượt di chuyển nhanh đến vài centimet, duyệt qua 1400 mục. tôi đã cố gắng để làm một menu thả xuống với

MenuView[ 
    Table[ 
    ListLogLogPlot[data[[All, {1, i}]],PlotLabel -> data[[1, i]]], {i, 2, compounds} 
    ] 
] 

Nó cũng làm việc, nhưng đây là một quá trình xử lý kẻ giết người (10+ phút trên một máy chủ Xeon 16-core thực hiện 16 kernel), như Mathematica cố gắng để vẽ đồ thị tất cả các ô trước khi hiển thị bất kỳ ô nào. Ngoài ra thả xuống không có tên, chỉ là một loạt các con số (1 cho hydro đến 1475 cho C8H14N +, Grain-), mặc dù cốt truyện có một tên.

Tôi đang tìm cách vẽ đồ thị theo yêu cầu, với hiển thị tên trong danh sách thả xuống (và nếu được yêu cầu theo mặc định). HOẶC một lĩnh vực mà tôi có thể nhập tên của hợp chất. Điều này có vẻ là có thể với Năng động [] lệnh, nhưng tôi không quản lý để làm cho nó hoạt động đúng.

Cảm ơn

+0

'20001 x 1476' thực sự là một kích thước ma trận khá thuần hóa. Bạn sẽ có thể chơi xung quanh với điều này trong bộ nhớ tốt mà không cần phải dựa vào một cơ sở dữ liệu. –

Trả lời

7

Đề xuất của Mike là một gợi ý tốt nhưng nếu bạn không muốn nỗ lực đưa nó vào cơ sở dữ liệu, hãy sử dụng tùy chọn ContinuousAction->False.

testdata = 
    Join[{Table[ToString[series[i-1]], {i, 1475}]}, 
    RandomReal[{1., 100.}, {2000, 1476}]]; 

Manipulate[ 
ListLogLogPlot[testdata[[All, {1, i}]], 
    PlotLabel -> testdata[[1, i]]], {{i, 2, "Compound"}, 2, 1475, 1}, 
ContinuousAction -> False] 

enter image description here

Để có được một menu popup, sử dụng cú pháp {i,listofvalues} cho đặc điểm kỹ thuật điều khiển.

Manipulate[ 
ListLogLogPlot[testdata[[All, {1, i}]], 
    PlotLabel -> testdata[[1, i]]], {i, Range[2, 1475]}, 
ContinuousAction -> False] 

enter image description here

này hoạt động khá nhanh trên hệ thống của tôi. (Hai tuổi MacBook Pro)

Một phiên bản fancier:

spec = Thread[Range[2, 1476] -> Table[ToString[series[i]], {i, 1475}]]; 

Manipulate[ 
ListLogLogPlot[testdata[[All, {1, i}]], 
    PlotLabel -> testdata[[1, i]]], {{i, 2, "Compound"}, spec}, 
ContinuousAction -> False] 

enter image description here

Và nếu tất cả các bạn muốn làm là bước qua những hình ảnh, nhấp chuột vào ít cộng bên cạnh một bộ điều khiển trượt để có được các điều khiển chi tiết hơn.

enter image description here

+0

Điều này hoạt động thực sự tuyệt vời. Cảm ơn. –

3

Đối với các tập dữ liệu kích thước này tôi khuyên bạn nên (như tối ưu) lưu trữ nó tất cả trong một cơ sở dữ liệu và sử dụng DatabaseLink để gọi những thứ theo yêu cầu. Sau đó, liên kết các bộ điều khiển của bạn, chẳng hạn như các menu bật lên, với mã SQLExecute hoặc các hàm SQL khác. Những mảnh vụn như thế này sẽ là một thứ có thể thực hiện công việc:

DynamicModule[{x,data, ...}, 

Column[{ 

PopupMenu[Dynamic[x], {1 -> "category 1", 2 -> "category 2", 3 -> "category 3", ...}], 

Dynamic[ 

data = SQLExecute[conn, "SELECT * FROM myDatabase.table WHERE my_id = `1`;", {x}]; 
ListLogLogPlot[data] 
] 

}] 
] 

Thực tế bạn có thể muốn thêm các cửa sổ bật lên bổ sung và thực hiện các phép nối và vân vân.

EDIT

Alternative mà không sử dụng cơ sở dữ liệu nhưng sử dụng lĩnh vực đầu vào theo yêu cầu:

DynamicModule[{x = "He", rules, y}, 

rules = Rule @@@ Transpose[{data[[1, All]], Range[Length[data[[1, All]]]]}]; 

Column[{ 
    InputField[Dynamic[x], String], 

    Dynamic[ 
    y = x /. rules; 
    ListLogLogPlot[data[[All, {1, y}]], PlotLabel -> data[[1, y]]] 
    ] 

    }] 
] 

Đối với quy tắc danh sách kích thước này, bạn có thể muốn sử dụng văn Tôi muốn tưởng tượng. Xem cách tính thời gian cho điều đó. Có vẻ như đây là một số loại thử nghiệm bạn đang chạy vì vậy lựa chọn đầu tiên của tôi vẫn đổ nó vào một DB.

THÊM EDIT

Nếu bạn đang dựa vào lĩnh vực đầu vào sau đó bạn sẽ cần phải chiếm gõ vụng về bằng cách chèn một điều kiện để Mma chỉ cố gắng để vẽ nếu y là một số nguyên.

If[IntegerQ[y], 
ListLogLogPlot, 
Spacer[0] 
] 
+1

Sử dụng DB có thể hơi quá mức cho việc này. Ma trận của anh ta chỉ khoảng ~ 3 triệu yếu tố mà Mathematica vui vẻ xử lý ngay cả trên chiếc máy tính xách tay 4 tuổi của tôi. Tuy nhiên, đây là một ý tưởng hay nếu bạn có một tập dữ liệu lớn hơn, đặc biệt nếu nó đã có trong cơ sở dữ liệu. –

5

Đối với nhập tên trong một InputField, bạn có thể làm một cái gì đó giống như

compounds = Rest[data[[1]]]; 
Manipulate[ 
If[MemberQ[compounds, compound], i = Position[compounds, compound][[1, 1]] + 1]; 
ListLogLogPlot[data[[All, {1, i}]], PlotLabel -> data[[1, i]]], 
{{i, 2}, None}, 
{{compound, data[[1, 2]], "Compound"}, InputField[#, String] &}] 

Ở đây, compounds là một danh sách tất cả tên của các hợp chất. Tuyên bố If trong Manipulate là để kiểm tra xem tên được nhập trong số InputField có phải là hợp chất hợp lệ hay không.

Những người khác đã cung cấp cho bạn các cách để tạo một danh sách bật lên lớn. Nếu bạn không muốn cuộn qua danh sách popup gồm 1475 hợp chất, bạn có thể cân nhắc việc chia nhỏ danh sách popup thành các danh sách con. Ví dụ, điều này sẽ chia toàn bộ danh sách các hợp chất thành các danh sách con của n=50 yếu tố mà có thể làm cho nó dễ dàng hơn để di chuyển

compounds = Rest[data[[1]]]; 
With[{n = 50}, 
Manipulate[ 
    i = 1 + Position[compounds, name][[1, 1]]; 
    ListLogLogPlot[data[[All, {1, i}]], PlotLabel -> data[[1, i]]], 
    {{i, 2}, None}, 
    {{indexlist, 1, "Indices"}, 
    Table[i -> ToString[(i - 1) n + 1] <> " through " <> 
    ToString[Min[i n, Length[compounds]]], 
    {i, Ceiling[Length[compounds]/n]}], PopupMenu}, 
    {{name, compounds[[1]], "Compound"}, 
    compounds[[n (indexlist - 1) + 1 ;; 
     Min[Length[compounds], n indexlist]]], PopupMenu} 
] 
] 

Ví dụ, đối

data = Table[Join[{i}, RandomReal[{0, 1}, 1000]], {i, 1000}]; 
data = Join[{Prepend[Table["list " <> ToString[i], {i, 1000}], "year"]}, data]; 

này trông giống như

popup lists

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