2011-12-31 26 views
10

tôi có thể có được một màu ListLinePlot bằng cách làm một cái gì đó giống nhưđiểm cá nhân trong ListPlot, ErrorListPlot trong Mathematica

ListLinePlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False] 

Mathematica graphics

Tuy nhiên, như được chỉ ra bởi các tập tin trợ giúp (" ColorFunction đòi hỏi ít nhất một bộ dữ liệu là Joined "), nếu tôi làm tương đương

ListPlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False] 

Mathematica graphics

tất cả các điểm của tôi đều có màu xanh lam. Có cách nào tốt đẹp để có được ColorFunction để làm việc cho ListPlot với Joined -> False?

Đó là, là có một cách đẹp hơn để có được một cái gì đó giống như

ListPlot[ 
List /@ Transpose[{Range[(680 - 420)/20 + 1], Range[420, 680, 20]}], 
PlotMarkers -> ({Graphics[{#, Disk[]}], 0.05} & /@ ColorData["VisibleSpectrum"] /@ Range[420, 680, 20]) 
] 

?

Mathematica graphics

(Ngoài ra, không ai có một lời giải thích của tại sao Mathematica đòi hỏi Joined -> True để tận dụng ColorFunction?)

Chỉnh sửa: Tôi cũng đang tìm kiếm một cách để làm một màu tương tự với ErrorListPlot trong gói ErrorBarPlots.

Trả lời

7

Vấn đề là, Gia nhập-> Đúng vẽ một đường [] có thể được cung cấp cho VertexColors cho mỗi điểm chứa. Tôi giả sử làm tương tự cho các điểm khi thiết lập Join-> False dẫn đến các tình huống mà nó không hoạt động. Tuy nhiên, Line [] và Point [] làm việc khá giống nhau trong trường hợp của bạn.Vì vậy, về

gì là
ListLinePlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", 
    ColorFunctionScaling -> False] /. Line[arg___] :> Point[arg] 

Mathematica graphics

Và, bằng cách này, nếu bạn chỉ sử dụng một ListLinePlot, nơi Line [] chỉ thị chỉ phát sinh là người từ dữ liệu của bạn, điều này sẽ làm việc ngay cả khi bạn có nhiều bộ dữ liệu và {x, y} phối

data = Transpose[Table[{{x, Sin[x]}, {x, Cos[x]}}, {x, 0, 2 Pi, 0.2}]]; 
ListLinePlot[data, ColorFunction -> Hue] /. Line[arg___] :> Point[arg] 

Mathematica graphics

+0

Có giải pháp tốt đẹp tương tự cho 'ErrorListPlot' trong gói' ErrorBarPlots' không? –

+0

Và bạn có thể thêm một cái gì đó như 'PlotStyle -> AbsolutePointSize [5]' trong mã - tức là mã vẽ các dòng - để điều khiển kích thước điểm cuối cùng. –

+0

@ Jason, một 'ErrorListPlot' không thể được tô màu bằng một mẹo ngắn như trên vì ít nhất hai lý do: Các đối tượng cần có cùng màu được chia thành nhiều chỉ thị Đồ họa. Bạn sẽ phải tìm các dòng và điểm tương ứng. Lý do thứ hai là, * một * điểm có * một * vị trí được sử dụng cho màu sắc. Một 'ErrorBar' có một số vị trí khác nhau. Vì vậy, nó không rõ ràng mà một trong những bạn thích sử dụng cho màu sắc. Kiểm tra 'InputForm' của' ErrorListPlot' của bạn. – halirutan

3

Bạn có thể sử dụng DiscretePlot:

data = Range[420, 680, 20]; 
DiscretePlot[data[[i]], {i, Length[data]}, 
    ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False, 
    Filling -> None] 

Mathematica graphics

Nếu bạn đang âm mưu một danh sách các x, y điểm, nó được một chút phức tạp hơn:

data = Transpose[{Range[420, 680, 20], Range[400, 530, 10]}]; 
mapping = Apply[Rule, data, 2]; 
DiscretePlot[i/.mapping, {i, data[[;;,1]]}, 
    ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False, 
    Filling -> None] 

Mathematica graphics

Nó có vẻ khá kỳ quặc rằng DiscretePlot sẽ cho phép bạn tô màu các điểm khác nhau trong khi ListPlot thì không. Tôi chắc chắn nó phải có một cái gì đó để làm với các chi tiết thực hiện, nhưng tôi không thể nghĩ ra một lý do tại sao đó sẽ là trường hợp.

1

tôi đã xem qua vấn đề này trong công việc của tôi quá. Tôi chỉ định màu cho mỗi điểm theo cách sau:

data = ... 
ListPlot[data] /. Point[args___] :> Point[args, VertexColors -> {c1, c2, ...}] 

nơi màu sắc cho điểm dữ liệu đầu tiên, v.v. Danh sách màu sắc có thể được tạo lập trình, ví dụ như

ColorData["Rainbow"] /@ ([email protected]@data/[email protected]) 

Here is the result.

Những điểm tốt của phương pháp này như sau.

  • Thật đơn giản: chúng tôi có danh sách các cặp, sau đó chúng tôi tạo danh sách màu tương ứng.
  • Mã ban đầu của chúng tôi ListPlot không cần sửa đổi (ví dụ: thay đổi thành ListLinePlot).
Các vấn đề liên quan