2010-08-11 90 views
23

如何在不使用PlotLegends包的情況下爲函數繪製圖例?在Mathematica中繪製圖例

+0

PlotLegends有什麼特別的問題?我的意思是,你可以在沒有它的情況下做傳奇(參見我的答案),但它最多隻有一個。 – Timo 2010-08-12 07:19:24

+6

@Timo我很遺憾地說,但傳說有點醜。一個巨大的盒子,內容間隔很大。默認情況下沒有人使用的投影。衆多的文物,如下圖所示(但還有更多)。 – 2011-04-23 07:45:23

+0

@Sjoerd:不要對不起,我同意他們是醜陋的。但這可能不是OP爲什麼要發佈這個問題的原因,因此我要問他有什麼特別的問題。 – Timo 2011-04-24 13:51:17

回答

7

我也會對這個問題的答案很感興趣。

告訴你PlotLegends出了什麼問題:它非常不穩定,在許多情況下根本不起作用。

以下是PlotLegends完全擰緊的示例。輸出來自Mathematica 7.0:

假設我們測量了一些與許多函數相對應的數據點,並且我們想要顯示它們與理想函數的比較程度,或者它們與計算擬合的匹配程度。沒問題!我們將顯示[]平滑圖與數據點的ListPlot一起,對吧?

它可能是這個樣子:

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

alt text

現在,我們希望把一個傳奇的情節,讓讀者都知道,他們正在尋找在地球上的東西。說起來容易做起來難,先生!讓我們的PlotLegend添加到情節[]:

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

這看起來太棒了!馬上發佈!

對於這樣一個基本的和無處不在的需要的功能,它確實有很多工作來找到一個替代PlotLegend的工作。到目前爲止,我發現的最好的選擇是精心構造一個plotstyles列表,然後用手構建這個圖例,最後用ShowLegend []將它與劇情一起顯示出來。 (例如參見here)這是可能的,但很多工作。

因此,如果有人知道使PlotLegend工作的解決方法,一個更好的替代包,或者只是一個簡單的方法來獲得可以輕鬆自動化的傳說,我將非常感激!這肯定會讓生活變得更輕鬆。

15

我也對讓PlotLegend正常工作的困難感到失望。我寫了自己的簡短功能來製作我自己的定製人物傳奇:

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]} 
]; 

它很靈活,但不太容易使用。 「名稱」是要在圖例中呈現的字符串列表; 「標記」是與表示要繪製的繪圖標記或圖形的Graphics對象的「名稱」具有相同長度的列表; 「原點」是一個兩元素列表,其中圖例左上角的絕對水平和垂直位置; 「markerSize」是將標記縮放到的點的數量; 「fontSize」是字體大小; 「font」是要使用的字體的名稱。這裏有一個例子:

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優雅的解決方案,謝謝你放鬆我的生活 – pygabriel 2012-06-02 18:51:23

1

如果您遇到了當您嘗試使用「顯示」兩個圖像結合由詹姆斯描述的怪異行爲,那麼你應該嘗試一下使用「覆蓋'功能而不是'顯示'。

或者,我發現只要兩個圖形都有圖例,那麼'顯示'將正確渲染合成圖像。

如果它看起來有點傻有兩種傳說,那麼你可以通過使用類似的選項中刪除從第二圖形的一個:

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

創建一個空的和無形的傳說,但仍然允許兩個圖形是'Show'正確組成。