เขียนกราฟด้วยตัวอักษรใน Mathematica

มีคนถามมาว่าจะให้ Mathematica วาดกราฟแต่แทนที่จะให้เป็นเส้น แต่ให้เป็นตัวอักษรแทนจะทำอย่างไร

เราสามารถใช้ Option PlotMarkers ของ ListPlot มาช่วยได้ครับ  ดูตัวอย่างข้างล่างนี้นะครับ

หวังว่าคงพอช่วยได้บ้างนะครับ

sinvalentine

 

การแสดงข้อความใน Pivot table ของ Excel

เจ้าหน้าที่ IT คนหนึ่งถามผมว่าจะแสดงข้อความใน pivot table ของ Excel ต้องทำอย่างไร

โดยเค้าเอาตัวอย่างมาให้ดูตามรูปด้านล่างนี้

ข้อมูลจริงจะมี label ประมาณหลักแสนและ header มีประมาณหลักพัน

และผลที่ต้องการอยากให้มันคล้ายๆกับด้านล่างนี้

แน่นอนครับว่าถามผมแบบนี้ผมก็บอกว่าไม่รู้ครับว่าทำยังไงใน Excel

แต่ถ้าทำใน Mathematica ล่ะง่ายนิดเดียวครับ 🙂

อันนี้เป็น Mathematica codes ที่ผมเขียนครับ

(* แสดงข้อมูลทั้งหมดของ id ที่ต้องการ *)

datid[id_, data_] := Module[{pos, headls}, headls = data[[1]];
pos = Union[Position[headls, “label”], Position[headls, “label”]] //
Flatten;
Select[data, #[[pos[[1]]]] == id &]];

 

(* แสดง list ของ header ของข้อมูล *)

headerls[dat_] := Module[{ls},
ls = Union@dat[[2 ;; Length@dat, 2]];
ls
];

 

(* เแสดงข้อมูลเป็นแถวๆของ id ที่ต้องการ  *)

makerow[id_, dat_] := Module[{hdls, iddat, tmp, output, i, j},
hdls = headerls[dat];
iddat = datid[id, dat];
tmp = Table[0, {Length@hdls}];
For[i = 1, i <= Length@iddat, i++,
For[j = 1, j <= Length@hdls, j++,
If[iddat[[i, 2]] == hdls[[j]],
tmp = ReplacePart[tmp, j -> iddat[[i, 3]]]]]];
{id}~Join~tmp
];

(* function หลักสำหรับอ่านไฟล์ข้อมูล และแสดงผล*)

mtr[filename_] := Module[{dat, outls, hdrls, idls},
dat = Import[filename, {“Data”, 1}];
hdrls = headerls[dat];
idls = idlist[dat];

outls = makerow[#, dat] & /@ idls;
{{“label”}~Join~hdrls}~Join~outls
];

 

(* เขียนผลลัพท์เป็น Excel *)

Export[“outfile.xlsx”,mtr[“data.xlsx”],”XLSX”]

 

 

DateListPlot

มีคนถามมาว่ามีข้อมูลตามมด้านล่างนี้จะเอาไป plot ได้ยังไง

20110508000128    1
20110508000315    5
…………. .
20110508235824    x

ซึ่งใน column แรกข้อมูลคือวันที่และเวลาที่อยู่ติดกัน และ column ที่สองก็คือข้อมูลจากการวัดอะไรสักอย่าง

ผมก็บอกคนที่ถามไปว่าไม่ยาก:)  ใน Mathematica ก็น่าจะทำได้

ก่อนอื่นเลยก็ต้องทำการจัดรูปแบบของข้อมูลให้ตรงตามที่ Mathematica ต้องการก่อน โดยที่ผมคิดว่าจะเอาไปใช้กับ

function ชื่อ DateListPlot ครับ ดูรายละเอียดได้ที่ http://reference.wolfram.com/mathematica/ref/DateListPlot.html

อันนี้เป็น function ที่ผมเขียนขึ้นมาใช้ในการเปลี่ยนรูปแบบของข้อมูลครับ

convertdata[yourdatapoint_] := Module[
{output, ls, dat1, dat2, year, month, date, hour, minute, second},
dat1 = yourdatapoint[[1]];
dat2 = yourdatapoint[[2]];
ls = Characters@ToString@dat1;
year = ToExpression@StringJoin@ls[[1 ;; 4]];
month = ToExpression@StringJoin@ls[[5 ;; 6]];
date = ToExpression@StringJoin@ls[[7 ;; 8]];
hour = ToExpression@StringJoin@ls[[9 ;; 10]];
minute = ToExpression@StringJoin@ls[[11 ;; 12]];
second = ToExpression@StringJoin@ls[[13 ;; 14]];
output = {{year, month, date, hour, minute, second}, dat2};
output
];

หรือจะเขียนแบบนี้โดยใช้ StringTake ก็ได้เหมือนกันครับ

convertdata[yourdatapoint_] :=
Module[{output, ls, dat1, dat2, year, month, date, hour, minute,
second},
dat1 = yourdatapoint[[1]];
dat2 = yourdatapoint[[2]];
ls = ToString@dat1;
{year, month, date, hour, minute, second} =
ToExpression /@
StringTake[
ls, {{1, 4}, {5, 6}, {7, 8}, {9, 10}, {11, 12}, {13, 14}}];
output = {{year, month, date, hour, minute, second}, dat2};
output
];

เอาไปใช้กับข้อมูลก็สามารถทำได้แบบนี้ครับ

data = {{20110508000128, 1}, {20110508000315, 5}, {20110508000411,
10}, {20110508001130, 20}};

DateListPlot[convertdata2 /@dat a, Joined -> True]