2010-08-11 48 views
23

Làm thế nào để bạn vẽ các chú thích cho các chức năng mà không sử dụng gói PlotLegends?truyền thuyết âm mưu trong Mathematica

+0

Điều gì đặc biệt sai với PlotLegends? Ý tôi là, bạn có thể làm truyền thuyết mà không có nó (xem câu trả lời của tôi) nhưng nó là kludgy tốt nhất. – Timo

+6

@Timo Tôi rất tiếc phải nói, nhưng truyền thuyết thì khá xấu xí. Một hộp lớn, với nội dung được đặt cách nhau rộng rãi. Một bóng đổ theo mặc định mà không ai sử dụng. Nhiều đồ tạo tác, như minh họa dưới đây (nhưng có nhiều hơn). –

+0

@Sjoerd: Đừng xin lỗi, tôi đồng ý rằng họ xấu. Nhưng đó có lẽ không phải là lý do tại sao OP đăng câu hỏi này, do đó tôi yêu cầu những gì cụ thể mà anh ta gặp phải. – Timo

Trả lời

7

Tôi cũng sẽ rất quan tâm đến câu trả lời cho câu hỏi này.

Để cho bạn biết những gì là sai với PlotLegends: Nó là khủng khiếp không ổn định và trong nhiều trường hợp không làm việc cả.

Dưới đây là ví dụ trong đó PlotLegends vít lên hoàn toàn. Đầu ra là từ Mathematica 7.0:

Giả sử rằng chúng tôi đã đo một số điểm dữ liệu tương ứng với một số chức năng, và chúng tôi muốn cho thấy chúng so sánh với hàm lý tưởng như thế nào hoặc có thể phù hợp như thế nào. Không vấn đề gì! Chúng tôi sẽ chỉ hiển thị [] cốt truyện trơn tru cùng với một ListPlot của các điểm dữ liệu, phải không?

Nó có thể giống như thế này:

Show[ 
Plot[{Sin[x], Sinh[x]}, {x, -Pi, Pi}], 
ListPlot[Join[{#, Sin[#]} & /@ Range[-Pi, Pi, .5], 
       {#, Sinh[#]} & /@ Range[-Pi, Pi, .5]]] 
] 

alt text

Bây giờ chúng tôi muốn đặt một huyền thoại về cốt truyện, vì vậy độc giả sẽ biết những gì trên trái đất chúng tôi đang xem xét. Nói dễ hơn làm, mister! Hãy thêm các PlotLegend đến Lô []:

Show[ 
    Plot[{Sin[x], Sinh[x]}, {x, -Pi, Pi}, PlotLegend -> {Sin[x], Sinh[x]}], 
    ListPlot[Join[{#, Sin[#]} & /@ Range[-Pi, Pi, .5], 
       {#, Sinh[#]} & /@ Range[-Pi, Pi, .5]]] 
] 

alt text

này sẽ rất tốt! Xuất bản ngay lập tức!

Đối với một chức năng cơ bản và phổ biến cần thiết, chắc chắn đã có rất nhiều công việc để tìm một giải pháp thay thế cho PlotLegend hoạt động. Cách thay thế tốt nhất mà tôi đã tìm thấy cho đến nay là xây dựng một cách tỉ mỉ một danh sách các cốt truyện, sau đó xây dựng truyền thuyết bằng tay, và cuối cùng để hiển thị nó cùng với cốt truyện sử dụng ShowLegend []. (Xem ví dụ here) Có thể, nhưng rất nhiều công việc. Vì vậy, nếu có ai biết cách giải quyết công việc PlotLegend, một gói thay thế hoạt động tốt hơn, hoặc chỉ là một cách gọn gàng để có được truyền thuyết có thể được tự động dễ dàng, tôi sẽ rất biết ơn! Nó chắc chắn sẽ làm cho cuộc sống dễ dàng hơn một chút.

15

Tôi cũng đã thất vọng vì khó khăn trong việc PlotLegend hoạt động chính xác. Tôi đã viết chức năng ngắn gọn của riêng mình để thực hiện các truyền thuyết hình tùy chỉnh của riêng mình:

makePlotLegend[names_, markers_, origin_, markerSize_, fontSize_, font_] := 
    Join @@ Table[{ 
    Text[ 
     Style[names[[i]], FontSize -> fontSize, font], 
     Offset[ 
     {1.5*markerSize, -(i - 0.5) * Max[markerSize,fontSize] * 1.25}, 
     Scaled[origin] 
     ], 
     {-1, 0} 
    ], 
    Inset[ 
     Show[markers[[i]], ImageSize -> markerSize], 
     Offset[ 
     {0.5*markerSize, -(i - 0.5) * Max[markerSize,fontSize] * 1.25}, 
     Scaled[origin] 
     ], 
     {0, 0}, 
     Background -> Directive[Opacity[0], White] 
    ] 
    }, 
    {i, 1, Length[names]} 
]; 

Thật linh hoạt nhưng không dễ sử dụng. "tên" là danh sách các chuỗi để hiển thị trong chú giải; "các điểm đánh dấu" là một danh sách có cùng độ dài như "tên" của các đối tượng đồ họa đại diện cho các điểm đánh dấu hoặc đồ họa để hiển thị; "origin" là danh sách gồm hai phần tử với vị trí ngang và dọc tuyệt đối của góc trên bên trái của chú giải; "markerSize" là số điểm để chia tỷ lệ các điểm đánh dấu thành; "fontSize" là kích thước phông chữ; "font" là tên của phông chữ để sử dụng. Dưới đây là một ví dụ:

Plot[{x, x^2}, {x, 0, 2}, PlotStyle -> {Blue, Red}, 
    Epilog -> makePlotLegend[ 
    {x, x^2}, 
    (Graphics[{#, Line[{{-1, 0}, {1, 0}}]}]) & /@ {Blue, Red}, 
    {0.9, 0.3}, 
    12, 
    12, 
    "Arial" 
    ] 
] 

generated image

+0

+1 Giải pháp thanh lịch, cảm ơn bạn đã giúp tôi giảm bớt cuộc sống – pygabriel

1

Nếu bạn đang trải qua những hành vi kỳ lạ mô tả bởi James Khi bạn đang cố gắng sử dụng 'Show' để kết hợp hai hình ảnh, sau đó bạn nên chơi xung quanh với việc sử dụng ' Chức năng của lớp phủ thay vì 'Hiển thị'.

Ngoài ra, tôi đã thấy rằng miễn là cả hai đồ họa đều có một huyền thoại thì 'Hiển thị' sẽ hiển thị chính xác hình ảnh tổng hợp.

Nếu nó trông hơi ngớ ngẩn có hai huyền thoại sau đó bạn có thể xóa một từ đồ họa thứ hai bằng cách sử dụng các tùy chọn như:

PlotLegend -> {}, 
LegendPosition -> {0.1, 0.1}, 
LegendSize -> 0.001, 
LegendShadow -> None, 
LegendBorder -> None 

này tạo ra một huyền thoại trống rỗng và vô hình nhưng vẫn cho phép hai card đồ họa được được soạn chính xác bằng 'Hiển thị'.

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