ແຕ້ມ Venn Diagram ງ່າຍໆດ້ວຍ​ພາ​ສາ Python

source: https://spriglobal.org/moda-analysis/

ເຮົາ​ຈະ​ແຕ້ມ​ຮູບ​ຄື​ຮູບ​ຂ້າງ​ເທິງ​ໄດ້​ແນວ​ໃດ?

ທຳ​ອິດ​ເຮົາ​ກະ​ຄິດ​ວ່າ​ ມັນ​ບໍ່​ໄດ້​ແຕ້ມ​ຍາກ​ປານນັ້ນ Microsoft PowerPoint ກະ​ຄົງ​ຈະ​ແຕ້ມ​ໄດ້​ຢູ່ ແຕ່​ບາດ​ມາ​ລອງ​ແທ້ໆ ແມ່ນ​ມັນ​ບໍ່​ສາ​ມາດ​ແຕ້ມ​ໄດ້ 🙁 ເຮົາ​ກະ​ເລີຍ​ຄົ້ນ​ຄວ້າ​ຖາມ​ອາ​ກົງ​ອາ​ກູ ເບິ່ງວ່າ​ໃຊ້​ອັນ​ໃດ​ແຕ້ມ​ໄດ້​ແນ່.

ສະ​ຫຼຸບ ຫຼັງ​ຈາກ​ທີ່​ໄປ​ຖາມ​ອາ​ກົງ​ອາ​ກູ ກະ​ໄດ້​ຜົນ​ສະຫຼຸບ 2 ຕົວ​ເລືອກ: 1. ໃຊ້ R programming, 2. ໃຊ້ Python. ເຮົາ​ກະ​ເລີຍ​ເລືອກໃຊ້ Python ເພາະ​ວ່າ​ຕົນ​ເອງ​ຄຸກ​ຄີ​ກັບ​ມັນຫຼາຍກວ່າ R programming.

ເອົ້າ! ເປີດ​ເລື່ອງ​ມາ​ດົນ​ລະ ດຽວ​ເຮົາ​ມາ​ລົງ​ມື​ເຮັດ​ກັນ​ເລີຍ​ວ່າການ​ແຕ້ມ Venn diagram ໂດຍ​ໃຊ້ພາ​ສາ Python ມັນ​ບໍ່​ໄດ້​ຢາກ​ເລີຍງ່າຍໆ (ງົມ​ມື້​ໜຶ່ງ​ເຕັມໆ ງ່າຍໆ?)

ໃນ​ການ​ແຕ້ມ ວົງ​ມົນ​ທັບ​ຊ້ອນ​ (Venn diagram ດຽວ​ຕໍ່​ໄປເຮົາ​ຈະ​ໃຊ້​ຄຳ​ຫຍໍ້​ວ່າ Venn D) ເຮົາ​ຈະ​ຕ້ອງຮູ້​ກ່ອນ​ວ່າ​ຈະ​ໃຊ້ library ໃດແຕ້ມ ເຊິ່ງວ່າ ເຮົາ​ຈະ​ໃຊ້ library matplotlib-venn ເຊິ່ງວ່າ library ດັ່ງ​ກ່າວ​ແມ່ນ​ຈະ​ເຮັດ​ຮ່ວມ​ກັນ​ກັບ library ອື່ນ​ອີກ ດັ່ງ​ນັ້ນ​ເຮົາ​ຈະ​ຕ້ອງ import library ລຸ່ມນີ້​ເຂົ້າ​ນຳ:

  • numpy
  • scipy
  • matplotlib

ສຳ​ລັບ​ການ​ຕິດ​ຕັ້ງ library ດັ່ງ​ກ່າວ​ແມ່ນ​ເຮົາ​ສາ​ມາດ​ຕິດ​ຕັ້ງ​ໂດຍ​ການ​ໃຊ້ command python

pip install matplotlib-venn

ໃນ​ການ​ແຕ້ມ Venn D ເຮົາ​ສັງ​ເກດບໍ່​ວ່າ​ເປັນ​ຫຍັງ​ຄື​ມີ​ແຕ່ ການ​ທັບ​ຊ້ອນ​ກັນ​ພຽງ​ແຕ່ ສອງ​ວົງ​ມົນ ແລະ ສາມ​ວົງ​ມົນ​ເທົ່າ​ນັ້ນ ເຫດ​ຜົນ​ກະ​ມາ​ຈາກວ່າ ຖ້າ​ມີຫຼາຍກວ່າສີ່​ວົງ​ມົນ​ຂຶ້ນ​ໄປ​ທີ່​ທັບ​ຊ້ອນ​ກັນ ມັນ​ຈະ​ເຮັດ​ໃຫ້​ຜູ້​ທີ່​ເບິ່ງນັ້ນ​ສັບ​ສົນ ແລະ ລາຍ​ຕາ (ເອີ…ເຫດ​ຜົນ​ງ່າຍ​ດີ Fact ດີ). ດັ່ງ​ນັ້ນ, ເຮົາ​ຈຶ່ງ​ເຫັນ​ແຕ່ ສອງວົງ​ມົນ ແລະ ສາມ​ວົງ​ມົນ​ເນາະ. ສິ່ງ​ສຳ​ຄັນ​ຄື library ນີ້​ກະ​ມີ​ໃຫ້​ແຕ້ມ​ແຕ່​ສອງ ແລະ ສາມ​ວົງ​ມົນ​ເທົ່າ​ນັ້ນ.

ໃນ library ນີ້​ມັນ​ຈະ​ມີ function package ມາ​ໃຫ້ຫຼັກໆ 4 function* (ແຕ່​ມີອີກ 2 function ຕື່ມ​ອີກ: ບອກ​ຕາມຫຼັງ)

  • venn2
  • venn3
  • venn2_cicrles
  • venn3_circles
  • venn2_unweighted*
  • venn3_unweighted*

*ແຕ້ມ Venn D ໂດຍບໍ່​ໃສ່​ຂະ​ໜາດ

ກ່ອນ​ຈະ​ລົງ​ມື​ແຕ້ມ ດຽວ​ເຮົາ​ມາ​ສຶກ​ສາ syntax ກັນ​ກ່ອນ​ວ່າມ​ັນ​ມີ​ຫຍັງ​ແນ່

venn2, venn2_circles

ໃນ​ສ່ວນ​ຂອງ function ນີ້ ແມ່ນ​ຈະ​ມີ​ສາມ​ເຂດ​ໃນ​ການ​ແຕ້ມ​ຄື A, AຕັດB, B

venn2(subsets=(A,AຕັດB,B))
.
venn2(subsets=(1,1,1))

ເຮົາ​ສາ​ມາດ​ຕັ້ງ​ຊື່​ວົງ​ມົນ​ແຕ່​ລະ​ອັນ​ໂດຍ​ການ​ເພີ່ມ set_label

venn2(subsets=(A, B, AB), set_labels=('ຊື່​ວົງ​ມົນ A', 'ຊື່​ວົງ​ມົນ B')
.
venn2(subsets=(3,1,1), set_labels=('A', 'B'))

ນອກ​ຈາກ​ເຮົາ​ຈະ​ຂຽນ syntax ແບບ​ຂ້າງ​ເທິງ​ໄດ້​ແລ້ວ​ເຮົາ​ຍັງ​ສາ​ມາດ​ຂຽນ​ໃນ​ແບບ list ແລະ counter ໄດ້ນຳ​ອີກ​

venn2([set(['A', 'B', 'C', 'D']), set(['D', 'E', 'F'])]) //Counter
.
ເທົ່າ​ກັບ
.
venn2(subsets=(3,2,1))
.
ເທົ່າ​ກັບ
.
venn2(subsets={'10': 3, '01': 1, '11': 2}) //List
.
venn2(subsets={'10': A, '01': AB, '11': B}) //ອະ​ທິ​ບາຍ

venn3, venn3_circles

ໃນ​ສ່ວນ​ຂອງ function ນີ້ ແມ່ນ​ຈະ​ມີ​ສາມ​ເຂດ​ໃນ​ການ​ແຕ້ມ​ຄື A, AຕັດB, B, C, AຕັດC, CຕັດB, AຕັດBຕັດC

venn3(subsets = (1, 1, 1, 2, 1, 2, 2), set_labels = ('A', 'B', 'C'))
.
venn3(subsets = (A, B, AB, C, AC, BC, ABC), set_labels = ('A', 'B', 'C'))
---
venn3(subsets = {'001':2, '010':1, '011':2, '100':1, '101':1, '110':1, '111':2}, set_labels = ('A', 'B', 'C'))
.
venn3(subsets = {'001':C, '010':B, '011':BC, '100':A, '101':AC, '110':AB, '111':ABC}, set_labels = ('A', 'B', 'C'))

ອ່າ…ອະ​ລຳ​ພະ​ບົດ​ເລື່ອງ syntax ກັນ​ຈົນ​ອີ່ມ​ລະ ດຽວ​ລອງ​ມາ​ຂຽນ​ແທ້​ກັນ​ເລີຍ​ແຕ່​ຕົ້​ນ ເຊິ່ງ​ສົມ​ມຸດ​ວ່າ​ເຮົາ​ມີ​ຂໍ້​ມູນ​ການ​ທັບ​ຊ້ອນ​ກັນ ຂອງ​ອັດ​ຕາ​ສ່ວນ​ຂອງ​ນ້ຳ, ສຸ​ຂະ​ອະ​ນາ​ໄມ ແລະ ສຸ​ຂະ​ພາບ.

LabelWaSaHoWaSaWaHoSaHoWaSaHoNone
WaSaHo17.5%10.0%1.9%15.4%3.6%15.8%7.8%27.9%

ເລີ່ມ​ແຕ້ມ​ກັນ​ເລີຍ 😉

#1 Import library ທີ່​ຈະ​ແຕ້ມ

from matplotlib_venn import venn2, venn2_circles, venn3, venn3_circle
from matplotlib import pyplot as plt
import numpy as np
import scipy
import matplotlib

#2 ກຳ​ນົດ​ຂະ​ໜາດ​ຂອງ​ຮູບ (​ບໍ່​ຈຳ​ເປັນ​)

plt.figure(figsize=(10,10))

#3 ແຕ້ມວົງ​ມົນ

venn3(subsets = (3.6, 15.8, 10.0, 7.8, 1.9, 15.4, 17.5), set_labels = ('Water', 'Sanitation', 'Health'))
.
plt.show()

#ຄຳ​ສັ່ງ​ເສີມ​ໃນ​ການ​ປັບ​ແຕ່ງ

->ປ່ຽນ​ສີ​ຂ​ອງ​ແຕ່​ລະ​ວົງ​ມົນ

v.get_patch_by_id('001').set_color('#72BCD4')
v.get_patch_by_id('010').set_color('#00CC00')
v.get_patch_by_id('011').set_color("#72BCD4")
v.get_patch_by_id('100').set_color('#FF4D4D')
v.get_patch_by_id('101').set_color('#FFE3E9')
v.get_patch_by_id('110').set_color('#E0E7AE')

->ເພີ່ມ​ເສັ້ນ​ໃສ່​ແຕ່​ລະ​ວົງ​ມົນ

c = venn3_circles(subsets={'001':13.5, '010':3.3, '011':0.4, '100':13.3, '101':2.2, '110':0.3, '111':0.1}, linestyle='solid', linewidth=2.5, color="white")

//ສາ​ມາດ​ປ໋ຽນ​ຮູບ​ແບບ​ຂອງ​ເສັ້ນ​ໄດ້
linestyle='--'
linestyle=':'

->ເພີ່ມ​ເສັ້ນ​ໝາຍ ແລະ ໂຕ​ໜັງ​ສື​ໃສ່​ໃນ​ວົງ​ມົນ (annotation)

 plt.annotate('Unknown set', xy=v.get_label_by_id('100').get_position() - np.array([0, 0.05]), xytext=(-70,-70), ha='center', textcoords='offset points', bbox=dict(boxstyle='round,pad=0.5', fc='gray', alpha=0.1), arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.5',color='gray'))

-> ປັບ​ຄວາມ​ເຂັ້ມ/ຈາງ​ຂອງ​ສີ​ໃນ​ວົງ​ມົນ

v.get_patch_by_id('01').set_alpha(1) // alpha value (0 ຫາ 1)

-> ບັນ​ທຶກ​ຮູບ​ທີ່​ໄດ້​

matplotlib.pyplot.savefig("HoSaWa.png", dpi=330, format="png", transparent=True)

ສຳ​ລັບ​ໃຜ​ສົນ​ໃຈ​ສາ​ມາດ​ເຂົ້າ​ໄປ​ອ່ານ​ຂໍ້​ມູນ​ເພີ່ມ​ຕື່ມ​ກ່ຽວ​ກັບ library ນີ້​ໄດ້​ບ່ອນນ​ີ້​ເລີຍ https://pypi.org/project/matplotlib-venn/

 

Douangtavanh Kongphaly

Douangtavanh Kongphaly, Data Analyst, Centre for Development Policy Research, Ministry of Planning and Investment.

 

Leave a Reply

Your email address will not be published. Required fields are marked *