2011-08-16 36 views
7

Tôi đang tạo một ứng dụng cho các loại bản vẽ lô/biểu đồ khác nhau trong Mathematica. Cuối cùng nó sẽ có một GUI, nhưng bước đầu tiên là lấy mã đúng, và đủ đơn giản để GUI quản lý. Tôi gặp khó khăn trong việc thiết lập truyền thuyết để không có khung xung quanh.Đường viền khung trên FontChart Legend có bị xóa không?

Dưới đây là một ví dụ rất nhỏ (với một số tùy chọn trên BarChart đã tùy chỉnh bằng SetOptions

mydata = {4.5644, 5.546, 6.8674, 2.7688, 1.742, 5.3952, 4.3392, 4.5016, \ 
3.7748, 1.838, 2.24, 0.693, 2.818, 4.9, 3.939, 3.459, 3.755, 4.475, \ 
3.857, 3.215, 2.206, 2.206, 2.117, 3.403, 3.277, 3.761, 4.276, 2.559, \ 
3.486, 4.778, 2.281, 2.865, 3.629, 4.916, 4.572, 5.244, 5.395, 2.865, \ 
-0.524, 5.01, 4.401, 4.513, 4.54} 

BarChart[mydata, 
ChartStyle -> {Join[ 
    Table[RGBColor[0.5, 0.5, 0.95], {Length[mydata] - 3}], {Magenta, 
    Magenta, Magenta}]}, PlotRange -> {-2, 8}, 
ChartLegends -> {Join[ 
    Table[None, {Length[mydata] - 3}], {Placed[ 
    Style["Forecasts", FontFamily -> "Arial", FontSize -> 18], 
    Bottom]}]}, BarSpacing -> 0.4, 
LegendAppearance -> Directive[Background -> Red, 
    Frame -> None, ImageSize -> 15]] 

Và đây là những gì tôi nhận được:. enter image description here

Hãy thử như tôi có thể, tôi không thể nhận Bạn có thể thấy rằng LegendAppearance không làm gì cả - tôi đã thử một vài cách tiếp cận khác với nó, quá.

Tôi kín đáo để mã hóa ít recta bằng tay, bởi vì điều đó sẽ rất khó khăn để có được ngay trong GUI cuối cùng. ChartLabels sẽ không hoạt động, bởi vì điều đó đã được sử dụng cho các nhãn ngày trong phiên bản thực của biểu đồ.

Có ai có bất kỳ đề xuất nào không?

Trả lời

8

Bạn có thể tạm thời, toàn cầu giết khung bằng cách thiết lập:

SetOptions[Legending`GridLegend, Legending`LegendContainer -> Identity] 

Để khôi phục lại các hành vi mặc định, hãy đặt:

SetOptions[Legending`GridLegend, Legending`LegendContainer -> Automatic] 
+0

+1: xin lỗi, tôi đang ở nhà bị bệnh và chỉ có xung quanh để kiểm tra xem nó có hiệu quả không. Nó hoạt động trên v8, và nó là thứ mà tôi có thể đặt trong gói làm mặc định. Cảm ơn bạn! – Verbeia

+0

Rất, rất thú vị: 'các chú giải' * '(nơi mà dấu ngoặc là một backquote) đưa ra một bó toàn bộ các bit không có giấy tờ và mảnh .: AssembleLegendContainer \t ContourLegend \t Truyền thuyết \t LegendImage \t LegendPane \t Legends BubbleScaleLegend \t CurveLegend \t LegendContainer \t LegendItemLayout \t LegendPosition \t LegendSize ColorGradientLegend \t GridLegend \t LegendHeading \t LegendLayout \t LegendReap \t LegendSow – Verbeia

+1

@Verbeia nhờ để khẳng định rằng nó hoạt động, và tôi hy vọng nó là hữu ích. Xin lỗi * tôi nếu tôi có vẻ thiếu kiên nhẫn. Tôi đã không. Thay vào đó, một giải pháp làm việc thường nhận được ít nhất một phiếu sau tám giờ, vì vậy tôi nghĩ có lẽ tùy chọn không có giấy tờ này đã bị xóa trong phiên bản 8. (BTW, tôi nghĩ bạn có thể nhúng backtick bằng cách sử dụng backticks đôi cho khối mã. thử: ''? Legending' * '') –

10

Tôi không thể tìm thấy bất kỳ tùy chọn nào để tắt khung hình. Tài liệu cho LegendAppearance là khá nhỏ và kiểu dáng của truyền thuyết nói chung không nhận được nhiều thảo luận (xem [2] và các liên kết bên trong).

Giải pháp dễ nhất mà tôi có thể nghĩ là sửa đổi đồ họa theo cách thủ công. Biểu đồ có truyền thuyết sản xuất các đối tượng đồ họa Labeled. Đối với một chú giải đơn, đối tượng Labeled được tạo ra trông giống như Labeled[Graphics[...], Framed[...], pos], vì vậy tất cả những gì bạn cần làm là xóa phần Framed. Điều này có thể được thực hiện chỉ cần xóa tất cả các đầu Framed bằng cách sử dụng một ReplaceAll (ví dụ: BarChart[...] /. Framed -> Identity), nhưng có thể một cái gì đó được nhắm mục tiêu nhiều hơn sẽ an toàn hơn.

mydata = {4.5644, 5.546, 6.8674, 2.7688, 1.742, 5.3952, 4.3392, 
    4.5016, 3.7748, 1.838, 2.24, 0.693, 2.818, 4.9, 3.939, 3.459, 
    3.755, 4.475, 3.857, 3.215, 2.206, 2.206, 2.117, 3.403, 3.277, 
    3.761, 4.276, 2.559, 3.486, 4.778, 2.281, 2.865, 3.629, 4.916, 
    4.572, 5.244, 5.395, 2.865, -0.524, 5.01, 4.401, 4.513, 4.54}; 

bc = BarChart[{Legended[Style[mydata[[;; -4]], Red], "Data"], 
    Legended[Style[mydata[[-3 ;;]], Blue], "Forecasts"]}, 
    PlotRange -> {-2, 8}, BarSpacing -> 0.4, LegendAppearance -> "Row"] 

with frame

bc /. Labeled[g_, Framed[leg_], pos_] :> Labeled[g, leg, pos] 

with frame removed

Trên đây cũng có thể được sản xuất sử dụng Replace[bc, Framed[leg_] :> leg, {1}] hoặc MapAt[Apply[Identity, #] &, bc, 2] hoặc tương tự công trình xây dựng. Sẽ không mất nhiều thời gian để sửa đổi mã nếu bạn có nhiều nhãn hoặc các loại đối tượng đồ họa khác nhau.

+0

+1 tôi sắp đề nghị cùng một giải pháp, nhưng giải pháp của bạn hoàn chỉnh hơn. Cái tên 'LegendAppearance' gợi ý nhiều hơn so với những gì nó có vẻ làm trong thực tế. –

+0

+1 - cảm ơn Simon, ví dụ thứ hai (sử dụng '/. Labeled [g_, Framed [leg_], pos_]:> Được gắn nhãn [g, leg, pos]') thực hiện chính xác những gì cần, ngay cả khi cốt truyện có một 'Khung'. Sẽ rất thú vị khi tìm ra trường hợp chung để xem liệu nó có thể được thực hiện trong GUI hay không. – Verbeia

+0

@Simon 'InputForm [bc]', có thể được theo sau bởi '(InputForm [bc /. {Đóng khung [legend_]:> legend}]) [[1]]', giúp làm rõ lý do giải pháp của bạn hoạt động. '[[1]]' loại bỏ trình bao bọc 'InputForm []'. – DavidC

3

Không như linh hoạt như Simon phương pháp 's cho above, tuy nhiên có thể đáng để đăng.(Tôi thấy điều này ra trong khi đọc this câu hỏi)

Sử dụng Part, nơi bc được theo quy định tại Simon answer:

bc[[2]] = bc[[2, 1]]; bc 

cho

enter image description here

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