Stats

Popular Posts

Followers

Mathematica Legend for Plot without plotlegend package

戴忠淵 於 Wednesday, August 19, 2009 7:23 AM 發表



在Mathematica中要新增圖例,實在是一件煩人的事。我在Mathematica討論區中看到有好心人給了一個簡單的解決方案。
我做了一些小小小小的修改~~程式碼如下:

產生圖例:

LineStylesFromTooltips[plot_Graphics]:=Cases[plot,
Tooltip[{s__,l_Line},tt_]:>Grid[{{Graphics[Flatten[{s,Thickness[0.15],
Line[{{0,0},{1,0}}]}],ImageSize->{24,8},AspectRatio->8/24,
ImagePadding->0],tt}}],Infinity]

將原本的行結合圖例以Labeled繪出:

LineLegendFromTooltips[plot_Graphics]:=Labeled[plot,
Style[Column[LineStylesFromTooltips[plot],Left],"TR",
ShowStringCharacters->False],{{Right,Top}}]


Left:控制圖例對齊屬性

Right:右方
{{Right,Top}}:右上方
Left:左方{{Left,Top}}:左上方
{{Right,Bottom}}:右下方

第二個控制圖例要在圖形的哪一個方向,圖例預設為圖形的右上方。

範例:

LineLegendFromTooltips[Plot[{Tooltip[Exp[-0.2x],"Exp[-0.2x]"],
Tooltip[Exp[-0.1x],"Exp[-0.1x]"],Tooltip[1/(1+0.1x),"1/(1+0.1x)"]},
{x,0,3},PlotStyle->Thickness[0.01]]]

data=RandomReal[{0,1},{3,10}];
mydata=Tooltip[mydata[[#]],ToString[#]]&/@Range[3];
LineLegendFromTooltips[ListLinePlot[mydata,PlotStyle->Thickness[0.01]]]


以下省略一些程式,也是有相同的效果

LineStylesFromTooltips[plot_Graphics]:=
Grid[{Graphics[{Thickness[0.15],#[[1;;2]]},ImageSize->{24,8},
AspectRatio->8/24,ImagePadding->0],#[[-1]]}&/@
Cases[plot,Tooltip[{color_,___},t_]:>{color,Line[{{0,0},{1,0}}],t},
Infinity]]

myplot=Plot[{Tooltip[Exp[-0.2x],"Exp[-0.2x]"],
Tooltip[Exp[-0.1x],"Exp[-0.1x]"],
Tooltip[1/(1+0.1x),"1/(1+0.1x)"]},{x,0,3},
PlotStyle->Thickness[0.01]];
Labeled[myplot,LineStylesFromTooltips[myplot],{{Right,Top}}]

如果是Mathematica 6的版本的話,由於Mathematica 7有修改Plot函數,所以要改一下LineStylesFromTooltips這個函數如下:

LineStylesFromTooltips[plot_Graphics]:=Module[{p1=plot,aa,bb,cc,sss,ttt},
ttt=Hue@@@Cases[p1,Hue[aa:_,bb:_,cc:_]:>{aa,bb,cc},Infinity];
sss=Cases[p1,Tooltip[Line[aa:_],bb_]:>bb,Infinity];
Grid[{{Graphics[{ttt[[#]],Thickness[0.15],Line[{{0,0},{1,0}}]},
ImageSize->{24,8},AspectRatio->8/24,
ImagePadding->0],sss[[#]]}}]&/@Range[Length[sss]]]
Tags: , ,

讀者回應 ( 7 意見 )

你好,我用mathematica 6將LineStylesFromTooltips那行程式碼複製下來,但沒辦法執行,錯誤訊息是"Incomplete expression; more input is needed.",LineLegendFromTooltips那行則可以執行,最後測試你的範例程式碼,圖例部份顯示仍有問題,是我哪一步做錯嗎?謝謝~

有些字元被html程式碼切掉了~~

我已經修改過,試試看吧~

不行的話就下在我的檔案

噢...我發現這好像要用到mathematica 7的功能,6是作不出來的,看來該升級了哈哈。感謝您^^

問題的原因出在Mathematica7修改了Plot修改了的函數,如果是Mathematica 6的版本的話,改一下LineStylesFromTooltips這個函數

LineStylesFromTooltips[plot_Graphics]:=Module[{p1=plot},
ttt=Hue@@@Cases[p1,Hue[aa:_,bb:_,cc:_]:>{aa,bb,cc},Infinity];
sss=Cases[p1,Tooltip[Line[aa:_],bb_]:>bb,Infinity];
Grid[{{Graphics[{ttt[[#]],Thickness[0.15],Line[{{0,0},{1,0}}]},
ImageSize->{24,8},AspectRatio->8/24,
ImagePadding->0],sss[[#]]}}]&/@Range[Length[sss]]
]

應該就可以了。不過這個沒辦法在Mathematica 7使用。

噢,我上次看完就忘記回了......感謝你對mathematica 6的補充~it works!

Anonymous @ May 07, 2010

用mathematica畫x^2+x*y+y^2=1要用什麼指令,參數式不好找,有沒有更快的指令?

Ans1 這個畫法有幾種,首先給定一個x,來求解y。最後再將這寫點畫出來
ListPlot[Flatten[{#, y}/.Solve[#^2 + #*y + y^2 ==1, y]&/@Range[-2, 2, 0.05], 1]]

Ans2
如果是5.0之前的話,可用現成的函數ImplicitPlot。不過6.0之後就合併到ContourPlot了!
ContourPlot[x^2 + x*y + y^2 == 1, {x, -2, 2}, {y, -2, 2}]

Post a Comment

Please leave your name and tell me what you thought about this site. Comments, suggestions and views are welcomed.

如果這篇文章對你有幫助,那請留個訊息給我~