Skip to main content

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

·402 words·2 mins

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

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

Ven diagram on 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_circles
  • 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))
venn two dimensions

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

venn2(subsets=(A, B, AB), set_labels=('ຊື່ວົງມົນ A', 'ຊື່ວົງມົນ B'`

venn2(subsets=(3,1,1), set_labels=('A', 'B'))
venn two dimensions

ນອກຈາກເຮົາຈະຂຽນ 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'))
venn three dimensions

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

WaSaHo WaSs WaHo SaHo Wa Sa Ho None
17.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()
HoSaWa venn diagram
#ຄຳສັ່ງເສີມໃນການປັບແຕ່ງ ປ່ຽນສີຂອງແຕ່ລະວົງມົນ
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") //ສາມາດປ໋ຽນຮູບແບບຂອງເສັ້ນໄດ້ inestyle='--' 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
Author
Douangtavanh Kongphaly