ແຕ້ມ Venn Diagram ງ່າຍໆດ້ວຍພາສາ Python
ເຮົາຈະແຕ້ມຮູບຄືຮູບຂ້າງເທິງໄດ້ແນວໃດ?
ທຳອິດເຮົາກະຄິດວ່າ ມັນບໍ່ໄດ້ແຕ້ມຍາກປານນັ້ນ 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 ກັນຈົນອີ່ມລະ ດຽວລອງມາຂຽນແທ້ກັນເລີຍແຕ່ຕົ້ນ ເຊິ່ງສົມມຸດວ່າເຮົາມີຂໍ້ມູນການທັບຊ້ອນກັນ ຂອງອັດຕາສ່ວນຂອງນ້ຳ, ສຸຂະອະນາໄມ ແລະ ສຸຂະພາບ.
Label | WaSaHo | WaSa | WaHo | SaHo | Wa | Sa | Ho | None |
WaSaHo | 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()
#ຄຳສັ່ງເສີມໃນການປັບແຕ່ງ
->ປ່ຽນສີຂອງແຕ່ລະວົງມົນ
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/