ggplot vs Mathematica

หลังๆมานี้ผมใช้งาน ggplot เยอะพอสมควรด้วยความที่มัน plot แล้วลงสีค่าตัวแปรที่ผมต้องการได้ง่าย อย่างเช่นในตัวอย่างนี้ จากชุดข้อมูล iris ผม plot จุดโดยแกน x คือ sepal length และ y คือ sepal width แล้วให้ลงสีตาม species เพื่อที่เราจะได้เห็นว่าแต่ล่ะ species แต่กต่างกันอย่างไร ใน ggplot ผมเพียงแค่บอกว่า แกน x y คือค่าอะไร และลงสีโดยอาศัยค่าจากตัวแปลใด ซึ่งมันดูง่ายมากครับ

กลับมาที่ตัว Mathematica ที่ผมใช้อยู่ประจำต้องบอกเลยครับการจะทำแบบที่ ggplot ทำได้นั้นมันก็ไม่ยากเลยแต่ต้องเขียน code เพิ่มนิดหน่อยในการที่ให้ได้ list ของจุดในแต่ล่ะ species แล้ว plot รวมกันหรือจะแยก plot คนล่ะสีแล้วใช้คำสั่ง Show เอามาซ้อนๆกันได้ ซึ่งผมเองดูแล้วมันก็ค่อนข้างยุ่งพอสมควร แต่ผมก็มาพบด้วยความบังเอิญว่า เราสามารถใช้ Dataset กับคำสั่งพวก plot กราฟ ต่างๆได้ และมันก็ลงสีให้อัตโนมัติด้วย เช่นเพื่อให้ได้กราฟแบบที่ ggplot ทำได้ผมก็แค่ group มันด้วย species ก่อนแล้วเลือก แกนที่จะนำมา plot เช่น

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

แสดง output จาก ggplot ใน Mathematica

ลองดูตัวอย่างที่ผมเขียนนี้ครับ  ไอเดียก็คือว่าให้มันเขียนภาพเป็นไฟล์ pdf ด้วยคำสั่ง ggsave แล้วเรียกกลับมาใน Mathematica ด้วย Import  โค้ดที่เขียนนี้ดัดแปลงมาจาก https://mathematica.stackexchange.com/questions/16726/how-to-get-a-plot-generated-by-r-returned-in-an-output-cell

(* using R that already installed on the computer *)
R363 = "C:\\Data-Work\\Programs\\R-3.6.3\\App\\R-Portable";
InstallR["RHomeLocation" -> R363, "RVersion" -> "3.6.3", 
 "NativeLibLocation" -> 
  "C:\\Data-Work\\Programs\\R-3.6.3\\App\\R-Portable\\library\\rJava\\\
jri\\x64"]

REvaluate["
 library(ggplot2)
 "]
(* export ggplot as pdf file *)
Wrapper = RFunction["function(filename,plotfun){
   ggsave(filename, plot=plotfun(), width=6, height=4, \
device=cairo_pdf)
   }"];

(* generate the plot as pdf and import back to show in Mathematica *)


Getggplot[plotFun_] := Module[{tempfile, rcode, runcode},
   tempfile = FileNameJoin[{$TemporaryDirectory, "temp.pdf"}];
   If[FileExistsQ[tempfile], Quiet@DeleteFile[tempfile]];
   rcode = "ADA <- ggplotcmd;";
   runcode = StringReplace[rcode, {"ggplotcmd" -> plotFun}];
   Wrapper[tempfile, RFunction["function()" <> "{" <> runcode <> "}"]];
   If[! FileExistsQ[tempfile], Return[$Failed]];
   Import[tempfile] // First
   ];

ggplot กับฟอนท์ภาษาไทย

มีคนถามมาว่าถ้าจะพิมพ์ภาษาไทยในกราฟที่สร้างจาก ggplot แล้ว save เป็น pdf ต้องทำอย่างไร เพราะที่ทำมามันไม่แสดงผลอะไรเลย

วิธีที่ง่ายที่สุด(ที่ผมใช้อยู่)ตอนนี้ก็คือใช้ package ที่ชื่อ extrafont ช่วยครับ ตามนี้

  1. ติดตั้ง package ที่ชื่อว่า extrafont หลังจากนั้นก็ load package ด้วยคำสั่ง library
  2. ทำการ import fonts ที่มีในคอมพิวเตอร์ด้วยเพื่อสร้างฐานข้อมูล fonts ของ package นี้ ด้วยคำสั่ง font_import() ทำครั้งแรกนี้ครั้งเดียวครับ อาจจะใช้เวลานานหน่อย แต่ถ้ามีการลงฟอนท์เพิ่มก็ต้องมารันคำสั่งนี้อีกนะครับ
  3. ลองพิมพ์คำสั่ง fonts() ดูครับว่ามัน import ฟอนท์อะไรเสร็จไปแล้วบ้าง
  4. จากนั้นก็ทำการ load fonts เพื่อเอามาใช้กับเอกสาร pdf ที่จะสร้างครับ ด้วยคำสั่ง loadfonts()  (คราวหน้าก็ไม่ต้องใช้คำสั่งนี้ครับ สามารถเรียก library(extrafont) ได้เลย มันจะทำให้อัตโนมัต) โดยค่าที่ตั้งไว้แล้ว(default) มันจะโหลดไปใช้กับตัวpdfครับ แต่ถ้าอยากจะให้มันแสดงผลและใช้ได้กับพวกไฟล์ภาพอย่าง png ก็ตั้งมีการเซ็ตค่าพารามิเตอร์ device=”win”ครับ สำหรับใช้งานบนวินโดว์ (ลองดูในตัวอย่างcodeที่ผมพิมพ์นะครับ)
  5. ทดลองสร้างกราฟด้วย ggplot แล้ว save ป็น pdf
library(extrafont)
library(ggplot2)

loadfonts(device="win")
loadfonts(device="pdf")
p <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
  ggtitle("ประสิทธิภาพของเชื้อเพลิง") +
  xlab("น้ำหนัก (x1000 ปอนด์)") + ylab("ไมล์ต่อแกลอน") +
  theme(text=element_text(size=16, family="TH Mali Grade 6"));
p
ggsave("THfont_ggplot.pdf", plot=p,  width=4, height=4, device = cairo_pdf)

%d bloggers like this: