mathematica 繪圖
mathematica;教學;pdf mathematica 6教學 mathematica基本教學若要多個圖形同時繪製在一個圖形物件上,這時你可能需要圖例才可讓你的圖形讓人一目了然。mathematica中圖例的套件為PlotLegends,用法如下:
由於變更的彈性很大,所以只需要了解大致用法即可,以下是兩個範例:
有外框,有陰影
無外框,無陰影
以上為Mathematica 7.0的語法,要注意的是在Mathematica 6.0裡面,PlotLegends與ListPlot似乎會有衝突,你可能需要以ShowLegend來而外處理。如果嫌上面正規的作法太麻煩,那參考下面這個文章的作法:
讀者回應 ( 41 意見 )
訂閱發佈留言 (Atom)
你好!我是最近開始學習使用Mathematica的初學者
想請問一下Mathematica如果要讀取一個.txt檔時候
若此檔案裡面不單單只有數值data還有一些文字
但是我使用ReadList["file",Number]這指令
卻不能讀取出現錯誤(因為此type為Number)但是txt檔裡面有文字
有沒有辦法把文字去掉不去讀到他的方法
我的.txt檔的架構
第一行為文字
接下來的幾行接事數值
感謝!
假設test.txt檔放在~/
股市 指數 漲跌 比例 當地
紐西蘭 3044.63 -0.04 -0.00% 18:31
澳洲股市 4586.30 1.40 0.03% 17:37
日經225 9642.12 -11.80 -0.12% 08/06
東證一部 861.17 4.08 0.48% 08/06
東證二部 2120.36 -5.21 -0.25% 08/06
JASDAQ 49.14 -0.31 -0.63% 08/06
韓國股市 1783.83 -0.03 -0.00% 15:02
台灣加權 7963.30 26.45 0.33% 13:46
test = Import["~/test.txt", "Table"]
不要第一列,test[[2;;-1]]// TableForm
不要第一行,test[[All,2;;-1]]// TableForm
不要第一列第一行,test[[2 ;; -1, 2 ;; -1]] // TableForm
Table的選項要看你的資料結構,可能用"Data","RawData",或"Grid"....
大感謝!!!你的意見+程式內建的VisualBook
讓我暫時完成階段性的任務
之後要做整合把讀取一連串D_AL01.txt~D_AL0X的data檔寫成迴圈
並且作繪圖,目前還在用手動的讀檔會圖連續貼了N個 Import
謝謝你的留言~
我念工學院的所以大部分的人都是用MatLAB很少有人用Mathematica作data processing
(*設定目錄*)
SetDirectory["你的目錄"]
(*將目錄下所有的txt檔的資料全數轉入test中*)
test = Import[#, "Table"][[2;;-1]]&/@FileNames["*.txt"]
test就是你所有的資料了~
要用在call出來~
不到最後關頭,絕不使用 Do While For~
這是Mathematica的最高指導原則!
祝好運
Q1:一直搞不懂"#","&","@"這幾個符號代表甚麼意思
Q2:我想我可能還是必須寫一個迴圈來自動換裡面的變數
接下來有點長我先說聲抱歉啦~
基本上我的檔案夾裡的.dat檔它都會產生
TE_00.dat~TE_0X.dat和TM_00.dat~TM_0X.dat
現在假設X=3好了 也就是說現在資料夾裡面有
TE_00.dat~TE_03.dat和TM_00.dat~TM_03.dat這8個檔
每個檔基本上的格式會有901*3(901列 3行)
第一列是文字所以我會跳過....只需要數字部分
剩下的數字我又只需要第3行....目前到這邊我都可以handel
(下面是程式碼))
SetDirectory["d:\\Rsoft_test\W_AL"]
test = Import[#, "Table"][[2 ;; -1]][[All, 3]] & /@ FileNames["*.dat"]
所以我可以很順利的取出所有的TE_00.dat~TE_03.dat和TM_00.dat~TM_03.dat這8個檔的第3行的值(已去掉第一列)
但是這8的檔的第3行的值我必須互相作一些運算(+_*/)
第3行值的TE_00.dat和TM_00.dat~ TE_01.dat和TM_01.dat~一直到(TE_03.dat和TM_03.dat)
這裡我目前用的方法非常愚蠢
test[[1]]+test[[5]]
(TE_00.dat第3行值加上TM_00.dat第3行值)
依此類推做到test[[4]]+test[[8]]
(TE_04.dat第3行值加上TM_04.dat第3行值)
等於是在做苦工~如果今天萬一有100個檔我想我就完了=_=
在想有沒有辦把它寫成自動更換[]內的數字
哈!!我利用Function想出來了~晚點在PO上程式碼
好睏先去睡覺
還是要謝謝你給了我好多意見!
等PO完程式碼再繼續討論!
*************************************************
在想有沒有辦把它寫成自動更換[]內的數字
*************************************************
假設X=99,那我們有1....100的陣列
Range[100]
這個指令會產生1...100的資料陣列
Table[test[[k]]+test[[k+X+1]],{k,1,X+1,1}]
這個指令會讓k由1每次增加1直到X+1
test[[#]]+test[[#+X+1]]&/@Range[X+1]
這個指令會將/@後面產生的陣列一一對應到#
這兩個函數都可以達到你的需求!
你有問題的地方應該是Mathematica裡面純函數很串列結構的部份
?Table跟?List 會對你有幫助
如果你覺得上面太複雜的話,以下有一個比較白爛的方法
(*產生你資料對應的dat檔*)
mydata[k_] := {"TE_" <> If[k <= 9, "0" <> ToString[k], ToString[k]] <>
".dat", "TM_" <> If[k <= 9, "0" <> ToString[k], ToString[k]] <> ".dat"}
(*試試看結果*)
mydata[5]
mydata[20]
(*把加法套用到{"TE_08.dat", "TM_08.dat"}這兩個檔案上*)
Plus @@ {Import[#, "Table"][[2 ;; -1]][[All, 3]] & /@ mydata[8]}
上面的指令首先會產生{"TE_08.dat", "TM_08.dat"}兩個檔,接著mathematica會將它import並取出第三行。最後將加法套到兩個陣列
你可以把它寫成一個函數
temp[k_]:=Plus @@ {Import[#, "Table"][[2 ;; -1]][[All, 3]] & /@ mydata[k]}
整個叫出來就用Table即可
以下的方法就真的不建議
sol = {};
For[k = 1, k <= 100,
temp1 = Import[
"TE_" <> If[k <= 9, "0" <> ToString[k], ToString[k]] <> ".dat",
"Table"][[2 ;; -1]][[All, 3]];
temp2 = Import[
"TM_" <> If[k <= 9, "0" <> ToString[k], ToString[k]] <> ".dat",
"Table"][[2 ;; -1]][[All, 3]];
sol = Append[sol, temp1 + temp]
]
sol
老師你好!我又來發問了!
感覺我的程式問題就像月事一樣每個月都來一次^_^:;
問題如下
**************************************
SetDirectory["d:\\ABC"]--->取用d碟裡的ABC檔
data1= Import[#, "Table"][[3 ;; -1]] & /@ FileNames["*.dat"]--->取用ABC檔裡的所有附檔名為.dat檔並從第3列取到最後1列
不過我從未遇過的問題是 現在這ABC檔裡的每個小檔案他的附檔名為數字(ex: KKK.000~KKK.3000)
現在我只try出來
data1= Import[#, "Table"][[3 ;; -1]] & /@ FileNames[{"*.000","*.001"}]
這樣也只能讀這兩個附檔名的檔
我現在有附檔名.000~.3000 的檔實在不知道怎麼給他讀完
檔案都是KKK.***
FileNames["KKK*.*"]會把所又KKK開頭的檔都叫出來
白爛一點可以用下面的方法~~純粹吃飽沒事做的方法
(*單獨把檔名清單造出來,這樣就不用FileNames*)
If[#<1,StringReplace[ToString@NumberForm[#,{4,3}],"0."->"KKK."],
"KKK."<>ToString[IntegerPart[#*1000]]]&/@Range[0,3,0.001]
(*匯入檔案*)
data1=Import[#,"Table"][[3;;-1]]&/@If[#<1,StringReplace[ToString@NumberForm[#,{4,3}],"0."->"KKK."],
"KKK."<>ToString[IntegerPart[#*1000]]]&/@Range[0,3,0.001]
我會了!
改成FileNames[KKK.*]
就可以讀到了!
不過再來問題比較困難!晚點再PO
想要PLOT的問題已經解決但是
現在有很大問題 我該怎麼調Mathematica記憶體
SetDirectory["d:\\100815"];
data2 = Import[#, "Table"][[3 ;; -1]][[All, 1]] & /@ FileNames["GMR_d_grating_0.08_ey.*"];
ListContourPlot[data2]
我的*是從000~3000
最後他不能PLOT
No more memory available.
Mathematica kernel has shut down.
Try quitting other applications and then retry.
我每一個檔案 裡面有1000筆的的數據
1000*3000個點,有點多!
你看看要不要換一台好一點的電腦跑~
跟ram大小有關,因為資料要先存到記憶體裡面
還是還有哪些指令可以畫等高線圖
目前我只有想到用這一招用畫data資料的等高線圖
還是我利用2個取1個的方法讓他縮到1500*500
吐血了~現在只能畫出
ListContourPlot[RandomReal[1, {600, 200}], InterpolationOrder -> 0]
再多的資料 我看電腦效能RAM會衝到3.75G
然後電腦就不動了= =
我目前手邊電腦都只有4G
我之前有想過把它匯出成TXT檔
然後再讀取做listcontourplot 不過好像也是不行....
你的資料格式是怎樣,可以的話寄幾個連續的檔給我試試
傳嚕!他的那個資料檔雖然附檔名是數字但是可以用文字檔開~
老師感謝你~目前我plot的事情告一段落
不過有個小疑問
當我今天採用FileNames[KKK.*]時
他讀檔會從KKK.000,KKK.001~讀到KKK.900
我要用怎樣的方法才可以使他從KKK.900,KKK.899~讀到KKK.000
因為我的contourplot的圖上下畫反了因為讀檔的順序不同
Reverse[FileNames[KKK.*]]
老師我想問一下唷
目前matheamatica的contourplot有colorbar的功能嗎?
不然我為了要看全部的顏色值必須把它標出來
這應該是你要的~
http://chungyuandye.twbbs.org/2010/06/mathematica-contourplot.html
thx a lot
老師的範例裡面colorbar的上下限為+-1
不過有個小疑問~我該怎麼把colorbar的上下限
調成自動讀取資料裡面數值的最大最小值>"<
Max[資料陣列] Min[資料陣列[
這個我有試過可是他
{ColorData["LakeColors"][1-#1]&,20,"Max[資料陣列] ","Min[資料陣列]",LegendPosition->{1.1,-.4}}
但是他的colorbar上下下會變成Max[資料陣列] Min[資料陣列]
文字而非數值
你要把"Max[資料陣列]"改成ToSring@Max[資料陣列]
字串在Mathematica沒辦法做代數運算~
了改!!想問一下當今天我有一個列向量1*1000這樣的矩陣
我只需要找裡面的最大值 這時候我知道可以用Max[1*1000矩陣資料] 就可以求出來了
但是如果我想知道這最大值是在第幾個 我該怎麼辦?
目前有試過StringPosition不過好像發現沒有用~
test = RandomReal[{0, 1000}, 100]
Position[test, Max@test]
很白爛的方法
SortBy[{#, test[[#]]} & /@ Range[100], Last][[-1]]
感謝 我等等試試看
不過我後來用了最智障的方法用EXCEL看
搞了一個下午的double Axes我發現matheamatica好像畫不出來
我上了一些國外論壇找到了有人自己寫的CODE
不過我用了有些許問題 想在這邊請教老師
TwoAxisListPlot[f_List, g_List, frange_, grange_, color1_, color2_,
opts___?OptionQ] := Module[
{old, new, scale, fm, fM, gm, gM, newg},
{fm, fM} = frange;
{gm, gM} = grange;
scale[var_] := ((var - gm) (fM - fm))/(gM - gm) + fm;
old = AbsoluteOptions[
ListPlot[g, Frame -> True, PlotRange -> grange,
DisplayFunction -> Identity], FrameTicks] [[1, 2, 2]];
new = (Prepend[Rest[#1], scale[First[#1]]] & ) /@ old;
newg = Transpose[{Transpose[g] [[1]],
Map[scale, Transpose[g] [[2]], {1, 2}]}];
ListLinePlot[{f, newg},
Frame -> True,
FrameTicks -> {Automatic, Automatic, None, new},
PlotStyle -> {{color1}, {color2}},
FrameStyle -> {{}, {color1}, {}, {color2}},
PlotRange -> frange*(1 + .05 (fM - fm)),
opts
]
]
TwoAxisListPlot[Table[{x, Sin[x]}, {x, -\[Pi], \[Pi], .01}],
Table[{x, 0.1 Cos[x]}, {x, -\[Pi], \[Pi], .01}], {-1., 1}, {-0.2,
0.2}, Red, Blue]
我用他的宣告 是可以畫出圖
但是當我把我需要的矩陣data擺進去 會發現
TwoAxisListPlot[data1,data2, {-1, 1}, {-0.2,
0.2}, Red, Blue]都只出現第一個data1的圖 然後data2的圖出現步了
我的data1格是為1*10001矩陣
data2是2*10001
我之前有長試過用Show
但是我data1和data2數值大小布一樣 所以用Show呈現會互相影響!
問題應該是你data1跟data2的dimension不一樣吧!
你的data1是序列資料,所以ListPlot會預設用1,2,3,...,10001
dtat2的座標資料,所以x軸會錯誤~
我想應該是這樣吧~?????
試試看
data3={#,data1[[#]]}&/@Range[10001]
在畫data3 data2
我自己寫了一個~~如果之前的程式不行,那是是我的!
data1 = Table[{x, Sin[x]}, {x, -\[Pi], \[Pi], .01}];
data2 = Table[{x, 0.1 Cos[x]}, {x, -\[Pi], \[Pi], .01}];
data3 = {data2[[#, 1]], 5 data2[[#, 2]]} & /@ Range[Length@data2];
xx = Transpose@{Range[-1, 1, 0.25], Range[-0.2, 0.2, 0.05]};
ListPlot[{data1, data3}, Frame -> True,
FrameTicks -> {{Range[-1, 1, 0.25], xx}, {Automatic, None}}]
data1 = Table[{x, Sin[x]}, {x, -\[Pi], \[Pi], .01}];
data2 = Table[{x, 0.1 Cos[x]}, {x, -\[Pi], \[Pi], .01}];
data3 = {data2[[#, 1]], 5 data2[[#, 2]]} & /@ Range[Length@data2];
xx = Transpose@{Range[-1, 1, 0.25], Range[-0.2, 0.2, 0.05]};
ListPlot[{data1, data3}, Frame -> True,
FrameTicks -> {{Range[-1, 1, 0.25], xx}, {Automatic, None}},
FrameLabel -> {{Style[Rotate[Sin, -90 Degree], Large, Bold, Red],
Style[Rotate[Cos, -90 Degree], Large, Bold, Pink]}, {Style[x,
Large, Bold], None}},
ImageSize -> 600]
如何畫出一階微分方程的方向場,並找出通過特定一點(x0,y0)的解?
我只有找到向量場而已,找不到方向場
求解微分方程式
?DSolve
求解微分方程式
y'[x] + y[x] == a Sin[x], y[0] == 0
DSolve[{y'[x] + y[x] == a Sin[x], y[0] == 0}, y[x], x]
畫出y[x]
Plot[y[x] /. %[[1]], {x, -Pi, Pi}]
畫出方向場
PlotVectorField[{1, y'[x] /. %%[[1]]}, {x, -Pi, Pi}, {y, -Pi, Pi}]
如果是微分方程組,上面的1就是x'[t]的函數
http://disp.ee.ntu.edu.tw/djj/DE1.ppt
裡面第20張投影片的那個圖用Mathematica畫
當然微分方程式不一樣,只是用他舉例
它的指令也可以用PlotVectorField?
PlotVectorField[{1, 0.2 x y}, {x, -4, 4}, {y, -4, 4}]
PlotVectorField[{1, Sin[y]}, {x, -4, 4}, {y, -4, 4}]
f2[x_]=D[y[x],x]/.NDSolve[{y'[x]==Sin[y[x]],y[0]==-3/2},y,{x,-4,4}]
f1[x_]=y[x]/.NDSolve[{y'[x]==Sin[y[x]],y[0]==-3/2},y,{x,-4,4}]
Show[PlotVectorField[{1,Sin[y]},{x,-4,4},{y,-4,4}],
Plot[{f1[x],f2[x]},{x,-4,4},
PlotStyle->{{Thickness[0.02],Red},{Thickness[0.02],Blue}}]]
這樣子比較好~
我是不是打錯了?
因為我將PlotVectorField輸入進去,Mathematica不理我
但是我將PlotVectorField改成VectorPlot就出來了
沒錯阿~~你用的是七點零的!在七點零已經內建了!所以不用再叫出PlotField這個Package!
發佈留言
Please leave your name and tell me what you thought about this site. Comments, suggestions and views are welcomed.
如果這篇文章對你有幫助,那請留個訊息給我~