ในตอนนี้เราจะมาดูวิธีการสร้างกราฟแบบต่างๆ ที่น่าสนใจกันครับ
ซึ่งเราจะมาดูวิธีแบบ Basic กันก่อนเลย นั่นก็คือ กรณีที่เรามี Data ที่สรุปเอาไว้เรียบร้อยแล้ว และเราแค่อยากทำ Visualization ออกมา โดยที่ปกติแล้วการทำ Visualization ใน Python ที่นิยมกันจะมี Library ที่ชื่อว่า Matplotlib และ Seaborn ครับ
โดยในบทความนี้ที่เราจะมาดูวิธีการใช้ Matplotlib ก่อน ซึ่งใน Excel มันจะถูก Import มาไว้ใน object ชื่อ plt ไว้แต่แรกแล้วตั้งแต่ step initialization โดยที่เราเรียกใช้ plt ได้เลย ไม่ต้องสั่ง import
ขอเตือนไว้ก่อนว่าการทำกราฟใน Python โดยเฉพาะ Matplotlib นั้นค่อนข้างจุกจิก ข้อดีคือมัน Customize ได้เยอะมาก ข้อเสียคือ เราต้องเป็นคนระบุ Parameter ต่างๆ เพื่อ Customize สิ่งต่างๆ เอง ตั้งแต่ชื่อกราฟ สี data label แกนของกราฟ และอื่นๆ อีกมากมาย ซึ่งมันไม่ได้มีเมนูให้กดง่ายๆ แบบ Excel นะ
โดยที่ Matplotlib จะเป็น Library สร้างกราฟที่ถูกใช้ต่อยอดไปใน Library สร้างกราฟอีกตัวที่เป็นที่นิยมนั่นก็คือ Seaborn ซึ่งเราจะพูดถึงในตอนถัดไปครับ
สารบัญ
เริ่มสร้างกราฟพื้นฐาน
ขั้นตอนพื้นฐานก็คือ เราต้องใส้ข้อมูลแกน x และ แกน y เข้าไปในกราฟ จึงจะแสดงออกมาได้ โดยที่ข้อมูลในแต่ละแกนอาจเป็น List ก็ได้ (ณ ตอนนี้มันยังมีปัญหากับภาษาไทย ดังนั้นให้ทำข้อมูลเป็น Eng ไปก่อนนะครับ)
x=["Group A","Group B","Group C"]
y=[30,20,40]
plt.plot(x, y)
ผลลัพธ์เบื้องต้นจะได้เป็น Python Object ที่ถ้าเอา Mouse ไป Hover เหนือมันถึงจะเห็นกราฟ

วิธีแสดงรูปกราฟออกมาใหญ่ๆ
แต่ถ้าอยากให้ออกมาเป็นรูปจริงๆ เราต้องเปลี่ยน output เป็น Excel Value ก่อน (กด Ctrl+Alt+Shift+M ได้)
มันจะได้ออกมาเป็นรูปเล็กๆ ก่อน

ถ้าเราอยากได้รูปใหญ่ๆ ให้คลิ๊กขวาที่รูปเล็ก แล้วเลือก Picture in Cell –> Cell Reference ก็จะได้รูปใหญ่จริงๆ ที่ Link กับรูปเล็กที่อยู่ใน Cell อีกที

เปลี่ยนประเภทกราฟ
ถ้าเราสั่ง plt.plot ธรรมดา ค่า Default ของ Matplotlib จะสร้างกราฟเส้นออกมา แต่ถ้าเราอยากให้ออกมาเป็นกราฟอื่น ก็ต้องสั่ง plt.ตามด้วยชื่อกราฟอื่น ซึ่งเราสามารถดูรายละเอียดของกราฟทุกประเภทได้ที่นี่





ตัวอย่างเช่น ถ้าเราจะทำกราฟแท่ง เราก็สั่งแบบนี้ได้เลย
x=["Group A","Group B","Group C"]
y=[30,20,40]
plt.bar(x, y)

ทำหลายกราฟผสมกัน
ถ้าจะสร้างหลายกราฟผสมกัน ก็แค่สั่ง plot ไปหลายๆ ทีจบเลย เช่น สั่ง bar ทีนึง เส้นทีนึง (plot ตัวไหนก่อนก็ได้)
x=["Group A","Group B","Group C"]
y=[30,20,40]
yLine=[30,50,90]
plt.bar(x, y)
plt.plot(x, yLine)

ปรับแต่งกราฟ
เปลี่ยนชื่อของแกนกราฟ
สามารถระบุได้ด้วย plt.xlabel กับ plt.ylabel เช่น
x=["Group A","Group B","Group C"]
y=[30,20,40]
yLine=[30,50,90]
plt.bar(x, y)
plt.plot(x, yLine)
plt.xlabel("Group Name")
plt.ylabel("Qty & Accum Qty")

กำหนดสีของกราฟ
ใช้ Parameter เรื่อง Color เพิ่มเติม ซึ่งระบุสีได้หลายรูปแบบเช่น ชื่อสี หรือ code สีก็ได้ เช่น แบบนี้คือสีแดงเหมือนกันหมดเลย โดยหลักการคร่าวๆ คือ RGB เลขแรกเทนสีแดง
- color=”r”
- color=”red”
- color=”#FF0000″
- color=(1,0,0)
x=["Group A","Group B","Group C"]
y=[30,20,40]
yLine=[30,50,90]
plt.bar(x, y,color="Green")
plt.plot(x, yLine,color="#FF0000")
plt.xlabel("Group Name")
plt.ylabel("Qty & Accum Qty")

แต่ถ้าจะทำสี Greyscale ให้ใส่เลขตัวเดียวเป็นทศนิยม ตั้งแต่ 0-1 ในฐานะ text เพื่อแทนค่าจากดำไปขาว เช่น ถ้าใส่ color=”0.8″ ก็จะออกขาวมากหน่อย
ใส่ Data Label ให้กราฟ
เราสามารถใส่ข้อความได้ด้วยคำสั่ง text ไม่ก็ annotate ได้ โดยพื้นฐานแล้ว text ก็จะใช้ง่ายๆ กว่าพวกสมควร เพราะแค่ระบุข้อความและพิกัดลงไปก็เพียงพอ เช่น
- plt.text(0,40,”ggez”) แปลว่า ให้ใส่คำว่า ggez ไปที่แกน x ที่ index 0 (แท่งที่1) และ y สูง 40 โดยค่า default จะชิดซ้าย
- plt.text(1,25,”weeeee”,ha=”center”, color=”blue”) แปลว่า ให้ใส่คำว่า haha ไปที่แกน x ที่ index 1 (แท่งที่2) และ y สูง 25 และให้จัดกึ่งกลาง และอักษรสีน้ำเงิน
- plt.text(2,50,”zzzzzzz”,ha=”right”, color=”red”,
bbox =
dict(facecolor =
'yellow',
edgecolor=’purple’,alpha =.5)
) แปลว่า ให้ใส่คำว่า zzzzzzz ไปที่แกน x ที่ index 2 (แท่งที่ 3) และ y สูง 50 และให้จัดชิดขวา อักษรแดง และตีกรอบ (bbox) พื้นหลังสีเหลือง ขอบสีม่วง และโปร่งใส 20% (alpha 0.8)
plt.text(0,40,"ggez")
plt.text(1,25,"weeeee",ha="center", color="blue")
plt.text(2,50,"zzzzzzz",ha="right", color="red", bbox = dict(facecolor = 'yellow', edgecolor='purple', alpha =.8))

ใส่ Legend ให้กราฟ
วิธีใส่ Legend คือ ใช้ plt.legend() มาช่วย เช่น
plt.legend(["Group Qty","Accum Qty"])

ค่า default ของ legend จะอยู่ตำแหน่งซ้ายบน ซึ่งเราเปลี่ยนได้ด้วยการใส่ paramater loc (location) ลงไป เช่น
plt.legend(["Group Qty","Accum Qty"],loc="lower right")
การสร้าง Subplot
เราสามารถใช้ Matplotlib สร้างกราฟหลายกราฟในรูปเดียวได้ด้วยการใช้ Subplot ก่อนจะสร้างกราฟที่ต้องการครับ นั่นคือเราจะใช้คำสั่งนี้เพื่อบอกว่าเรากำลังจะสร้างกราฟอันไหนนั่นเอง
plt.subplot(จำนวนแถว, จำนวนคอลัมน์, ลำดับของ Plot)
เช่น ผมจะทำกราฟ 3 อันใน 1 คอลัมน์ เป็นกราฟแท่ง กับ กราฟเส้น สามารถทำแบบนี้ได้
x=["Group A","Group B","Group C"]
y=[30,20,40]
z=[30,50,90]
plt.subplot(3, 1, 1)
plt.bar(x, y,color="Green")
plt.subplot(3, 1, 2)
plt.plot(x, z,color="0.8")
plt.subplot(3, 1, 3)
plt.scatter(y,z)

ยังมีอีกทีวิธีที่เราจะใช้งาน subplots คือ ระบุแค่จำนวนแถวกับคอลัมน์ โดยที่ยังไม่ต้องระบุลำดับกราฟ เช่น ถ้าผมอยากให้ subplots มี 3 แถว 1 คอลัมน์เหมือนเดิม ผมสามารถทำให้ subplots ให้ค่ากลับมาเป็น Tuple ที่มีข้อมูล figure 1 อัน (1รูปใหญ่) กับ axes หลายอัน (3กราฟย่อย)
ซึ่งเรามักจะเขียนรับค่าแบบนี้
(fig, ax) = plt.subplots(3, 1)
แล้วเราค่อยระบุว่า ax แต่ละอันจะ plot กราฟอะไร โดยที่ถ้า subplots มีมิติเดียว ก็ใส่เลข index ของ plot ได้เลย เช่น
x=["Group A","Group B","Group C"]
y=[30,20,40]
z=[30,50,90]
fig, ax = plt.subplots(3, 1)
ax[0].bar(x, y,color="Green")
ax[1].plot(x, z,color="0.8")
ax[2].scatter(y,z)

แต่ถ้า subplots มีหลายมิติ เช่น มี 3 แถว 2 คอลัมน์ ตัว ax ก็ต้องระบุ index หลายมิติ ในรูปแบบของ (row_index, col_index) ด้วย
ซึ่งเราสามารถกำหนดชื่อ subplot ย่อยๆ ได้ด้วย set_title ซึ่งเราต้องระบุหลังจากสร้าง Subplot ย่อยๆ แต่ละอันไปแล้ว
x=["Group A","Group B","Group C"]
y=[30,20,40]
z=[30,50,90]
fig, ax = plt.subplots(3, 2)
ax[0,0].bar(x, y,color="Green")
ax[0,0].set_title("Green Bar")
ax[1,0].bar(x, z,color="0.8")
ax[1,0].set_title("Grey Bar")
ax[2,0].scatter(y,z)
ax[2,0].set_title("Blue Scatter")
ax[0,1].plot(x, y,color="Green")
ax[0,1].set_title("Green Line")
ax[1,1].plot(x, z,color="0.8")
ax[1,1].set_title("Grey Line")
ax[2,1].scatter(z,y,color="orange")
ax[2,1].set_title("Orange Scatter")

จะเห็นว่าผลลัพธ์มันดูเบียดๆ กันมากไปหน่อย เดี๋ยวเรามาจัดการเรื่องนี้ที่ ตัว object Figure ที่เรารับกลับมาในตัวแปร fig เพื่อกำหนดภาพรวมของกราฟทั้งหมดได้ เช่น
- ใส่ title ของกราฟด้วย suptitle (super title)
- กำหนดเรื่องระยะห่างระหว่างแต่ subplot ด้วย subplots_adjust ก็ได้ เช่น
fig.suptitle("Six Cool Charts")
fig.subplots_adjust(hspace=0.9, wspace=0.2)

ปัญหาเมื่อสร้างกราฟจากข้อมูลใน Excel
สมมติว่าผมมีข้อมูลใน Excel อยู่แล้ว แล้วอยากจะเอาไปสร้างกราฟแท่งง่ายๆ ใน Matplotlib หากเราลองเขียนแบบนี้มันจะไม่ work

สาเหตุเป็นเพราะว่าตัวแปร x กับ y ที่เราใส่เข้าไปให้ matplotlib ณ ตอนนี้ จริงๆ มันคือ pandas dataframe (แม้จะมีคอลัมน์เดียวก็ตาม)
วิธีแก้ก็คือ เราต้องทำให้มันเป็น pandas series ซะก่อน ง่ายที่สุดคือการระบุว่าเอาคอลัมน์ index 0 ของ dataframe ในรูปแบบ DataFrame[0] เช่น
x=xl("ProductTable[Product]")[0]
y=xl("ProductTable[Qty]")[0]
plt.bar(x, y,color="Green")
แบบนี้ถึงจะ work นะครับ

ตอนต่อไป
ในตอนต่อไปจะเป็นการทำกราฟด้วย Seaborn แล้วค่อยเรียนรู้เรื่อง AI / Machine Learning ต่ออีกทีครับ รอติดตามได้เลย
Leave a Reply