2011-10-29 39 views
5

Tôi có tập dữ liệu có nhãn mà tôi muốn vẽ bằng các điểm được tô màu theo nhãn của chúng. Có một cách đơn giản làm thế nào để có được số dòng hiện tại bên trong cốt truyện, để tôi có thể xác định loại nào hiện điểm thuộc về?Lô màu trong Mathematica theo nhãn

Tôi hiểu rằng x,y,z là tọa độ của dữ liệu được vẽ, nhưng nó không giúp cho nhãn bên ngoài.

Điều này khá xấu và chỉ hoạt động trên bộ dữ liệu được sắp xếp với phân phối thường xuyên.

data = Import["http://ftp.ics.uci.edu/pub/machine-learning-databases/iris/iris.data"]; 
    data = Drop[data, -1]; (*there one extra line at the end*) 
    inData = data[[All, 1 ;; 4]]; 
    labels = data[[All, 5]]; 
    ListPlot3D[inData, 
     ColorFunction -> 
     Function[{x, y, z}, 
      If[y < 0.33, RGBColor[1, 1, 0.], 
       If[y < 0.66, RGBColor[1, 0, 0.], RGBColor[1, 0, 1]] 
      ] 
     ] 
    ] 

Kết quả mong đợi:

expected result of visualization

+1

Đâu là những nhãn trong bộ dữ liệu của bạn? Xin vui lòng mô tả cấu trúc –

+0

nhãn là chuỗi, nó có thể được thay thế bằng số hoặc màu RGB, nó không thực sự quan trọng – Tombart

+0

Câu hỏi vẫn chưa hoàn toàn rõ ràng, một tập dữ liệu mẫu sẽ là tốt. Bạn có cần vẽ các điểm riêng biệt hoặc bề mặt không? Định dạng dữ liệu là gì? Đề xuất: Bạn có thể phân tách các điểm theo danh mục và tự vẽ từng danh mục không? 'GatherBy' có thể hữu ích. – Szabolcs

Trả lời

5

Giả sử rằng points là danh sách các tọa độ và labels một danh sách các các nhãn tương ứng, ví dụ:

points = Flatten[Table[{i, j, Sin[i j]}, 
    {i, 0, Pi, Pi/20}, {j, 0, Pi, Pi/10}], 1]; 
labels = RandomChoice[{"label a", "label b", "label c"}, Length[points]]; 

Mỗi nhãn tương ứng với màu mà tôi viết dưới dạng danh sách quy tắc, ví dụ:

rules = {"label a" -> RGBColor[1, 1, 0], 
    "label b" -> RGBColor[1, 0, 0], "label c" -> RGBColor[1, 0, 1]}; 

Sau đó, các điểm có thể được vẽ trong các màu sắc tương ứng với nhãn của họ như sau

ListPointPlot3D[Pick[points, labels, #] & /@ Union[labels], 
    PlotStyle -> Union[labels] /. rules] 

plot

Sửa

Để màu điểm cá nhân trong một ListPlot3D bạn có thể sử dụng VertexColors, ví dụ:

ListPlot3D[points, VertexColors -> labels /. rules, Mesh -> False] 

colouring points in a ListPlot3D

+0

Điều này là tuyệt vời cho các điểm duy nhất, những gì tôi tưởng tượng là một cái gì đó cho demostration dữ liệu đa chiều, giống như hình ảnh bên phải http://i44.tinypic.com/33bivzb.png Khi sử dụng 'Chọn' các lớp bao gồm nhau. Dù sao cảm ơn cho một câu trả lời nhanh chóng! – Tombart

+0

@Tombart Tôi đã mở rộng câu trả lời của mình. – Heike

+0

Rất đẹp, cảm ơn rất nhiều!Chỉ có một vấn đề nhỏ, rằng danh sách được cung cấp có kích thước {150,1} và tôi sẽ cần kích thước {150,4}. Tôi khá mới với Mathematica, vì vậy cú pháp vẫn là một bí ẩn đối với tôi. Tôi viết lại nó thành 'ListPlot3D [points, VertexColors -> {Map [({#, #, #, #}) &, nhãn] /. rules}, Lưới -> Sai] 'và nó hoạt động như một nét duyên dáng :) – Tombart

3

Ví dụ:

(* Build the labeled structure and take a random permutation*) 
f[x_, y_] = Sqrt[100 - x x - y y]; 
l = [email protected][{Table[{{"Lower", {x, y, f[x, y] - 5}}, 
           {"Upper", {x, y, 5 - f[x, y]}}}, 
          {x, -5, 5, .1}, {y, -5, 5, .1}]}, 3]; 
(*Plot*) 

Graphics3D[ 
Riffle[l[[All, 1]] /. {"Lower" -> Red, "Upper" -> Green}, 
    Point /@ l[[All, 2]]], Axes -> True] 

enter image description here

+0

Điều này là rất tốt cho dữ liệu 3 chiều, tôi sẽ cần thêm một số. Tôi nên viết nó trong câu hỏi, dù sao cũng nhờ câu trả lời, tôi không biết Riffle hoạt động trước đây. – Tombart

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