2011-08-08 21 views
9

Thường xuyên tôi phải trực quan hóa nhiều tập dữ liệu đồng thời, thường là trong ListPlot hoặc Log-companions của nó. Vì số lượng bộ dữ liệu thường lớn hơn số lượng các kiểu đường có thể phân biệt dễ dàng và việc tạo ra các truyền thuyết cốt truyện lớn vẫn còn hơi không rõ ràng, tôi vẫn đang tìm kiếm một cách tốt để chú thích các dòng/tập hợp khác nhau trong các ô của tôi. Tooltip là tốt đẹp khi làm việc trên màn hình, nhưng họ không giúp đỡ nếu tôi cần phải pritn cốt truyện.Cách chú giải nhiều bộ dữ liệu trong ListPlots

Gần đây, tôi đã chơi xung quanh với các tùy chọn Mesh để liệt kê tập hợp dữ liệu của tôi và tìm thấy một số công cụ lạ

GraphicsGrid[Partition[Table[ListPlot[ 
[email protected] 
Table[{Sin[x], Cos[x], Tan[x], Cot[x]}, {x, 0.01, 10, 0.1}], 
PlotMarkers -> {"1", "2", "3", "4"}, Mesh -> i, Joined -> True, 
PlotLabel -> "Mesh\[Rule]" <> ToString[i], ImageSize -> 180], {i, 
1, 30}], 4]] 

Kết quả trông như thế này trên máy tính của tôi (Windows 7 x64, Mathematica 8.0.1):

 Mesh = i, with i running from 1 to 30

Funnily, for Mesh-> 2, 8 và 10 kết quả trông giống như tôi mong đợi, phần còn lại thì không. Hoặc là tôi không hiểu tùy chọn Mesh, hoặc nó không hiểu tôi.

Dưới đây là những câu hỏi của tôi:

  1. là Mesh tại ListPLot nghe trộm hoặc để tôi sử dụng nó một cách sai lầm?
  2. làm cách nào tôi có thể x-shift các điểm lưới của các bộ liên tiếp để tránh ghi đè?
  3. bạn có đề xuất nào khác về cách chú thích/liệt kê nhiều tập dữ liệu trong một ô không?
+3

Vấn đề hưởng lẫn nhau giữa 'Mesh' và' PlotMarkers' đã đưa ra trong [SO câu hỏi này] (http://stackoverflow.com/questions/4789047/custom-intervals-of-markers- trong toán học-plotmarkers/4790805 # 4790805). Tôi đã báo cáo nó cho WRI vào thời điểm đó và hỗ trợ kỹ thuật đã chuyển nó lên nhóm phát triển để xem xét. Hy vọng rằng nó sẽ được sửa trong bản phát hành tiếp theo. – Simon

+1

Tôi tò mò tại sao một số tùy chọn Mesh hoạt động trong khi nhiều tùy chọn khác không hoạt động. –

+2

Đối với câu hỏi thứ ba của bạn, bạn có thể muốn xem biểu đồ tôi đã sử dụng tại đây: http://stackoverflow.com/questions/5745298/how-do-i-access-the-stackoverflow-api-from-mathematica/5745783 # 5745783. Điều này bao gồm chú thích thủ công (có thể được thực hiện để hoạt động bán tự động). Tôi cảm thấy kết quả cuối cùng là dễ chịu hơn nhiều so với nhiều phương pháp khác. –

Trả lời

12

Bạn có thể thử điều gì đó dọc theo các dòng này. Đặt mỗi dòng thành một nút, khi được nhấp, sẽ tự xác định.

plot=Plot[{Sin[x],Cos[x]},{x,0,2*Pi}]; 
sinline=plot[[1,1,3,2]]; 
cosline=plot[[1,1,4,2]]; 
message=""; 
altplot=Append[plot,PlotLabel->Dynamic[message]]; 
altplot[[1,1,3,2]]=Button[sinline,message="Clicked on the Sin line"]; 
altplot[[1,1,4,2]]=Button[cosline,message="Clicked on the Cos line"]; 
altplot 

Nếu bạn thêm EventHandler, bạn có thể nhận vị trí mà bạn đã nhấp và thêm Inset với nhãn vị trí có liên quan vào ô. Quấn cốt truyện vào một Dynamic để nó tự cập nhật sau mỗi lần nhấn nút. Nó hoạt động tốt.

Để đối phó với các ý kiến, đây là một phiên bản đầy đủ:

plot = Plot[{Sin[x], Cos[x]}, {x, 0, 2*Pi}]; 
sinline = plot[[1, 1, 3, 2]]; 
cosline = plot[[1, 1, 4, 2]]; 
AddLabel[label_] := (AppendTo[plot[[1]], 
    Inset[Framed[label, Background -> White], pt]]; 
    (* Remove buttons for final plot *) 
    plainplot = plot; 
    plainplot[[1, 1, 3, 2]] = plainplot[[1, 1, 3, 2, 1]]; 
    plainplot[[1, 1, 4, 2]] = plainplot[[1, 1, 4, 2, 1]]); 
plot[[1, 1, 3, 2]] = Button[sinline, AddLabel["Sin"]]; 
plot[[1, 1, 4, 2]] = Button[cosline, AddLabel["Cos"]]; 
Dynamic[EventHandler[plot, 
    "MouseDown" :> (pt = MousePosition["Graphics"])]] 

Để thêm một nhấp chuột nhãn trên đường dây. Biểu đồ chú thích cuối cùng, được đặt thành 'plainplot', có thể in và có thể sao chép và không chứa các phần tử động.

[Sau đó trong ngày] Một phiên bản khác, lần này là chung chung và dựa trên biểu đồ ban đầu. (Với các phần của giải pháp Mark McClure được sử dụng.) Đối với các lô khác nhau 'ff' và 'spec' có thể được chỉnh sửa như mong muốn.

ff = {Sin, Cos, Tan, Cot}; 
spec = Range[0.1, 10, 0.1]; 
(* Plot functions separately to obtain line counts *) 
plots = Array[ListLinePlot[ff[[#]] /@ spec] &, [email protected]]; 
plots = DeleteCases[plots, Line[_?(Length[#] < 3 &)], Infinity]; 
numlines = Array[[email protected][plots[[#]], Line[_], Infinity] &, 
    [email protected]]; 
(* Plot functions together for annotation plot *) 
plot = ListLinePlot[#@spec & /@ ff]; 
plot = DeleteCases[plot, Line[_?(Length[#] < 3 &)], Infinity]; 
lbl = [email protected][ConstantArray[[email protected][[#]], 
     numlines[[#]]] &, [email protected]]; 
(* Line positions to substitute with buttons *) 
linepos = Position[plot, Line, Infinity]; 
Clear[line]; 
(* Copy all the lines to line[n] *) 
Array[(line[#] = plot[[Sequence @@ [email protected][[#]]]]) &, 
    [email protected]]; 
(* Button function *) 
AddLabel[label_] := (AppendTo[plot[[1]], 
    Inset[Framed[label, Background -> White], pt]]; 
    (* Remove buttons for final plain plot *) 
    plainplot = plot; 
    bpos = Position[plainplot, Button, Infinity]; 
    Array[(plainplot[[Sequence @@ [email protected][[#]]]] = 
     plainplot[[Sequence @@ Append[[email protected][[#]], 1]]]) &, 
    [email protected]]); 
(* Substitute all the lines with line buttons *) 
Array[(plot[[Sequence @@ [email protected][[#]]]] = Button[line[#], 
     AddLabel[lbl[[#]]]]) &, [email protected]]; 
Dynamic[EventHandler[plot, 
    "MouseDown" :> (pt = MousePosition["Graphics"])]] 

Dưới đây là giao diện. Sau khi chú thích, đối tượng đồ họa đơn giản có thể được tìm thấy được đặt thành biến 'plainplot'.

Annotated Chart

+2

Ý tưởng rất thú vị để trình bày! Nó là một lựa chọn tốt đẹp cho chú giải công cụ (đặc biệt là nếu dòng sẽ được đánh dấu một cách nào đó, ví dụ sẽ được làm đậm - và chúng ta không cần phải bấm vào nó, chỉ cần đặt chuột lên nó!). Cảm ơn bạn. +1 –

+0

Ý tưởng rất hay, tuy nhiên, nó tương tự như Chú giải công cụ, có xu hướng vô dụng nếu bạn cần âm mưu in. Đối với bài thuyết trình mặc dù, thast là một cách tốt đẹp. –

+3

@ Markus - Tôi đã thêm một ví dụ đầy đủ hơn cho thấy các nhãn dính sau khi chúng được đặt, do đó, cốt truyện chú thích có thể được in. –

8

Một cách tiếp cận là tạo các ô riêng biệt và sau đó hiển thị chúng lại với nhau. Điều này mang lại mã giống với mã của bạn hơn so với bài đăng khác, vì PlotMarkers dường như chơi theo cách chúng ta mong đợi khi giao dịch với một tập dữ liệu. Chúng ta có thể có cùng màu bằng cách sử dụng ColorData với PlotStyle. Dưới đây là kết quả:

ff = {Sin, Cos, Tan, Cot}; 
plots = Table[ListLinePlot[ff[[i]] /@ Range[0.1, 10, 0.1], 
    PlotStyle -> {ColorData[1, i]}, 
    PlotMarkers -> i, Mesh -> 22], {i, 1, Length[ff]}]; 
(* Delete the spurious asymptote looking thingies. *) 
plots = DeleteCases[plots, Line[ll_?(Length[#] < 4 &)], Infinity]; 
Show[plots, PlotRange -> {-4, 4}] 

enter image description here

+0

+1, đây là phương pháp tôi sử dụng, vì đôi khi bạn cần phải theo dõi một số kích thước bổ sung bằng cách sử dụng các biểu tượng và màu sắc, và không có gì hoạt động khá tốt. – rcollyer

+0

Tôi biết rằng việc tách ví dụ ở trên thành từng ô riêng biệt là giải pháp thay thế - có thể đó là cách để đi. –

4

Bạn sẽ được âm mưu đường cong tính toán hoặc số liệu thực tế?

Nếu đó là đường cong có thể tính toán, thì việc sử dụng plot legend (key) là phổ biến. Bạn có thể sử dụng các dấu gạch ngang và độ dày khác nhau để phân biệt giữa các dòng trên máy in màu xám. Có rất nhiều ví dụ trong tài liệu PlotLegends.

Nếu đó là dữ liệu thực, thì dữ liệu đủ thưa thớt để bạn có thể sử dụng PlotMarkers cho các điểm dữ liệu thực tế (nghĩa là không chỉ định Mesh). Bạn có thể sử dụng tự động PlotMarkers hoặc bạn có thể sử dụng tùy chỉnh PlotMarkers bao gồm các điểm đánh dấu BoxWhisker để biểu thị các sự không chắc chắn khác nhau.

+1

Điều này thực sự sẽ là cách tiêu chuẩn để làm điều này. Tuy nhiên, gói PlotLegend bị thiếu sót nghiêm trọng (xem http://stackoverflow.com/questions/3463437/plotting-legends-in-mathematica/3533152#3533152) và bên cạnh đó, tôi cảm thấy nó có vấn đề về thẩm mỹ. –

+0

@Sjoerd: Tôi đã không để ý câu hỏi đó. Cách mà 'PlotLegend' rescales' Plot' là không tốt ... – Simon

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