在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]]]
讀者回應 ( 7 意見 )
訂閱發佈留言 (Atom)
你好,我用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!
用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}]
發佈留言
Please leave your name and tell me what you thought about this site. Comments, suggestions and views are welcomed.
如果這篇文章對你有幫助,那請留個訊息給我~