Package: cvmcore
cvmcoreIntroductionThe core function of data analysis for plot or data process used by SZQ lab from China Agricultural UniversityExample usagefromBioimportPhyloimportmatplotlibasmplimportmatplotlib.pyplotaspltfromioimportStringIOimportmatplotlib.collectionsasmpcollectionsfromcopyimportcopyimportpandasaspdimportnumpyasnpimportseabornassnfromcvmcore.cvmcoreimportcvmplotfromscipy.cluster.hierarchyimportlinkage,dendrogram,complete,to_treefromscipy.spatial.distanceimportsquareformmlst=[[np.nan,19.,12.,9.,5.,9.,2.],[np.nan,19.,12.,9.,5.,9.,2.],[10.,17.,12.,9.,np.nan,9.,2.],[10.,19.,12.,np.nan,5.,9.,2.],[np.nan,19.,13.,9.,5.,9.,2.]]genes=np.char.replace(np.array(np.arange(1,8),dtype='str'),'','gene_',count=1)samples=np.char.replace(np.array(np.arange(1,6),dtype='str'),'','sample_',count=1)df_mlst=pd.DataFrame(mlst,index=samples,columns=genes)diff_matrix=cvmplot.get_diff_df(df_mlst)diff_matrixsample_1sample_2sample_3sample_4sample_5sample_100101sample_200101sample_311012sample_400101sample_511210link_matrix=linkage(squareform(diff_matrix),method='complete')link_matrixarray([[0., 1., 0., 2.],
       [3., 5., 0., 3.],
       [2., 6., 1., 4.],
       [4., 7., 2., 5.]])1. Plot a rectangular dendrogramfig,ax=plt.subplots(1,1)lableorder,ax=cvmplot.rectree(link_matrix,scale_max=7,labels=samples,ax=ax)fig.tight_layout()fig.savefig('screenshots/dendrogram.png')2. Plot rectangular dendrogram with heatmap#create dataframemat=np.random.randint(70,100,(5,10))loci=np.char.replace(np.array(np.arange(1,11),dtype='str'),'','loci_',count=1)sample=np.char.replace(np.array(np.arange(1,6),dtype='str'),'','sample',count=1)df_heatmap=pd.DataFrame(mat,index=sample,columns=loci)#create linkage matrixdiff_matrix=[[0,0,1,0,1],[0,0,1,0,1],[1,1,0,1,2],[0,0,1,0,1],[1,1,2,1,0]]linkage_matrix=linkage(squareform(diff_matrix),'complete')fig,(ax1,ax2)=plt.subplots(1,2,figsize=(8,3),gridspec_kw={'width_ratios':[1,2]})fig.tight_layout(w_pad=-2)row_order,ax1=cvmplot.rectree(linkage_matrix,labels=sample,no_labels=True,scale_max=3,ax=ax1)cvmplot.heatmap(df_heatmap,order=row_order,ax=ax2,cbar=True,yticklabel=False)ax1.set_xticklabels(ax1.get_xticklabels(),fontsize=15)ax2.set_xticklabels(ax2.get_xticklabels(),rotation=90,fontsize=15)ax2.set_yticklabels(ax2.get_yticklabels(),fontsize=15)ax2.xaxis.tick_top()# fig.tight_layout()fig.savefig('screenshots/dendrogram_with_heatmap.png',bbox_inches='tight')[ 5 15 25 35 45]
['sample5', 'sample3', 'sample4', 'sample1', 'sample2']fig,(ax1,ax2,ax3)=plt.subplots(1,3,figsize=(12,3),gridspec_kw={'width_ratios':[1,2,2]})fig.tight_layout(w_pad=-2)row_order,ax1=cvmplot.rectree(linkage_matrix,labels=sample,no_labels=True,scale_max=3,ax=ax1)# remove the yticklabels in ax2ax2=cvmplot.heatmap(df_heatmap,order=row_order,ax=ax2,cbar=True,yticklabel=False)# add ax3 heatmapax3=cvmplot.heatmap(df_heatmap,order=row_order,ax=ax3,cmap='Blues',cbar=True,yticklabel=True)#set ticklabels property of x or y from ax1, ax2, ax3ax1.set_xticklabels(ax1.get_xticklabels(),fontsize=15)ax2.set_xticklabels(ax2.get_xticklabels(),rotation=90,fontsize=15)ax2.xaxis.tick_top()ax3.set_xticklabels(ax3.get_xticklabels(),rotation=90,fontsize=15)ax3.set_yticklabels(ax3.get_yticklabels(),fontsize=15)ax3.xaxis.tick_top()# fig.tight_layout()fig.savefig('screenshots/multiple_heatmap.png',bbox_inches='tight')2.1 set minimum value of heatmapfig,(ax1,ax2)=plt.subplots(1,2,figsize=(8,3),gridspec_kw={'width_ratios':[1,2]})fig.tight_layout(w_pad=-2)order,ax1=cvmplot.rectree(linkage_matrix,labels=sample,no_labels=True,scale_max=3,ax=ax1)cvmplot.heatmap(df_heatmap,order=order,ax=ax2,cbar=True,vmin=90)ax1.set_xticklabels(ax1.get_xticklabels(),fontsize=15)ax2.set_xticklabels(ax2.get_xticklabels(),rotation=90,fontsize=15)ax2.set_yticklabels(ax2.get_yticklabels(),fontsize=15)ax2.xaxis.tick_top()fig.savefig('screenshots/dendrogram_heatmap_minimumvalue.pdf',bbox_inches='tight')[ 5 15 25 35 45]
['sample5', 'sample3', 'sample4', 'sample1', 'sample2']2.2 using cmap to change colorfig,(ax1,ax2)=plt.subplots(1,2,figsize=(8,3),gridspec_kw={'width_ratios':[1,2]})fig.tight_layout(w_pad=-2)order,ax1=cvmplot.rectree(linkage_matrix,labels=sample,no_labels=True,scale_max=3,ax=ax1)cvmplot.heatmap(df_heatmap,order=order,ax=ax2,cmap='tab20',cbar=True)ax1.set_xticklabels(ax1.get_xticklabels(),fontsize=15)ax2.set_xticklabels(ax2.get_xticklabels(),rotation=90,fontsize=15)ax2.set_yticklabels(ax2.get_yticklabels(),fontsize=15)ax2.xaxis.tick_top()fig.savefig('screenshots/dendrogram_heatmap_cmap.pdf',bbox_inches='tight')[ 5 15 25 35 45]
['sample5', 'sample3', 'sample4', 'sample1', 'sample2']3. Plot a circular dendrogram# generate two clusters: a with 100 points, b with 50:np.random.seed(4711)# for repeatability of this tutoriala=np.random.multivariate_normal([10,0],[[3,1],[1,4]],size=[100,])b=np.random.multivariate_normal([0,20],[[3,1],[1,4]],size=[50,])X=np.concatenate((a,b),)Z=linkage(X,'ward')Z2=dendrogram(Z,no_plot=True)# set open anglefig,ax=plt.subplots(1,1,figsize=(10,10))cvmplot.circulartree(Z2,addlabels=True,fontsize=10,ax=ax)fig.tight_layout()fig.savefig('screenshots/circular_dendrogram.png',bbox_inches='tight')3.1 color labelcolors=[{'#0070c7':'2021'},{'#3a9245':'2022'},{'#f8d438':'2023'}]result=np.random.choice(colors,size=150)label_colors_map=dict(zip(Z2['ivl'],result))point_colors_map=dict(zip(Z2['ivl'],result))fig,ax=plt.subplots(1,1,figsize=(10,10))cvmplot.circulartree(Z2,addlabels=True,branch_color=False,label_colors=label_colors_map,fontsize=15)fig.tight_layout()fig.savefig('screenshots/circular_dendrogram_color_label.png')3.2 set open anglefig,ax=plt.subplots(1,1,figsize=(10,10))cvmplot.circulartree(Z2,addlabels=True,branch_color=False,label_colors=label_colors_map,fontsize=15,open_angle=30)fig.tight_layout()fig.savefig('screenshots/circular_dendrogram_openangle.png')3.3 set start anglefig,ax=plt.subplots(1,1,figsize=(10,10))cvmplot.circulartree(Z2,addlabels=True,branch_color=False,label_colors=label_colors_map,fontsize=15,open_angle=90,start_angle=30)fig.tight_layout()fig.savefig('screenshots/circular_dendrogram_startangle.png')3.4 add pointfig,ax=plt.subplots(1,1,figsize=(12,10))cvmplot.circulartree(Z2,addlabels=True,branch_color=False,label_colors=label_colors_map,fontsize=15,addpoints=True,point_colors=point_colors_map,point_legend_title='Species',pointsize=25)fig.tight_layout()fig.savefig('screenshots/circular_dendrogram_tippoints.png')4. Plot phylogenetic treetree="(((A:0.2, B:0.3):0.3,(C:0.5, D:0.3):0.2):0.3, E:0.7):1.0;"tree=Phylo.read(StringIO(tree),'newick')fig,ax=plt.subplots(1,1,figsize=(10,10))ax,lable_order=cvmplot.phylotree(tree=tree,color='k',lw=1,ax=ax,show_label=True,align_label=True,labelsize=15)fig.tight_layout()fig.savefig('screenshots/phylogenetic tree.png')4.1 Plot tree with heatmap#create dataframemat=np.random.randint(70,100,(5,10))col=np.char.replace(np.array(np.arange(1,11),dtype='str'),'','column_',count=1)strains=['A','B','C','D','E']df_heatmap=pd.DataFrame(mat,index=strains,columns=col)df_heatmapcolumn_1column_2column_3column_4column_5column_6column_7column_8column_9column_10A89739175959093749997B73907589857282859682C84828674727591839798D72777298797387919894E88758873777274739986fig,(ax1,ax2)=plt.subplots(1,2,figsize=(8,3),gridspec_kw={'width_ratios':[1,2]})fig.tight_layout(w_pad=-2)ax1,order=cvmplot.phylotree(tree=tree,color='k',lw=1,ax=ax1,show_label=True,align_label=True,labelsize=15)cvmplot.heatmap(df_heatmap,order=order,ax=ax2,cbar=True,vmin=90)ax1.set_xticklabels(ax1.get_xticklabels(),fontsize=15)ax2.set_xticklabels(ax2.get_xticklabels(),rotation=90,fontsize=15)ax2.set_yticklabels(ax2.get_yticklabels(),fontsize=15)ax2.xaxis.tick_top()fig.savefig('screenshots/phylotree_with_heatmap.pdf')4.2 remove labels at the tip of the treefig,(ax1,ax2)=plt.subplots(1,2,figsize=(8,3),gridspec_kw={'width_ratios':[1,2]})fig.tight_layout(w_pad=-2)ax1,order=cvmplot.phylotree(tree=tree,color='k',lw=1,ax=ax1,show_label=False)cvmplot.heatmap(df_heatmap,order=order,ax=ax2,cbar=True,vmin=90)ax1.set_xticklabels(ax1.get_xticklabels(),fontsize=15)ax2.set_xticklabels(ax2.get_xticklabels(),rotation=90,fontsize=15)ax2.set_yticklabels(ax2.get_yticklabels(),fontsize=15)ax2.xaxis.tick_top()fig.savefig('screenshots/phylotree_with_heatmap-remove_tiplable.pdf',bbox_inches='tight')4.3 Plot multiple heatmap with phylotreefig,(ax1, ax2, ax3)= plt.subplots(1,3, figsize=(12, 3), gridspec_kw={'width_ratios':[1, 2, 2]})
fig.tight_layout(w_pad=-2)
ax1, order = cvmplot.phylotree(tree=tree, color='k', lw=1, ax=ax1, show_label=True, align_label=True, labelsize=15)
ax2 = cvmplot.heatmap(df_heatmap, order=order, ax=ax2, cbar=True, vmin=90, yticklabel=False)
# add ax3 heatmap
ax3 = cvmplot.heatmap(df_heatmap, order=order, ax=ax3, cmap='Blues', cbar=True, yticklabel=True)

#set ticklabels property of x or y from ax1, ax2, ax3
ax1.set_xticklabels(ax1.get_xticklabels(), fontsize=15)

ax2.set_xticklabels(ax2.get_xticklabels(), rotation=90, fontsize=15)
ax2.xaxis.tick_top()

ax3.set_xticklabels(ax3.get_xticklabels(), rotation=90, fontsize=15)
ax3.set_yticklabels(ax3.get_yticklabels(), fontsize=15)
ax3.xaxis.tick_top()


# fig.tight_layout()
fig.savefig('screenshots/phylotree_multiple_heatmap.png', bbox_inches='tight')5. Gene environment plotFirst, you shoud prepare a dataframe from the gff file, The columns should include the feature start, end, strand, label(gene name or whatever you want show next to the arrow) and the arrow color.TRACKSTARTENDSTRANDLABELCOLORA100900-1label1#ec9631A110013001label2#ec9631A135015001label3#ec9631A152017001label4#ec9631A19002200-1label5#ec9631A250027001label6#ec9631A27002800-1label7#ec9631A28503000-1label8redA310035001label9#ec9631A36003800-1label10#ec9631A39004200-1label11#ec9631A43004700-1label12#ec9631A480048501label13#ec9631B100900-1label14#ec9631B110013001label15#ec9631B135015001label16#ec9631B152017001label17#ec9631B19002200-1label18#ec9631B250027001label19#ec9631B27002800-1label20#ec9631B28503000-1label21#ec9631B310035001label22#ec9631B36003800-1label23#ec9631B39004200-1label24#ec9631B43004700-1label25#ec9631B480048501label26#ec9631C100900-1label27#ec9631C110013001label28#ec9631C135015001label29#ec9631C152017001label30#ec9631C19002200-1label31greenC250027001label32#ec9631C27002800-1label33#ec9631C28503000-1label34#ec9631C310035001label35#ec9631C36003800-1label36#ec9631C39004200-1label37#ec9631C43004700-1label38#ec9631C480048501label39#ec9631D100900-1label40#ec9631D110013001label41#ec9631D135015001label42#ec9631D152017001label43#ec9631D19002200-1label44#ec9631D250027001label45#ec9631D27002800-1label46#ec9631D28503000-1label47#ec9631D310035001label48#ec9631D36003800-1label49#ec9631D39004200-1label50#ec9631D43004700-1label51#ec9631D480048501label52#ec9631E100900-1label53#ec9631E110013001label54#ec9631E135015001label55#ec9631E152017001label56#ec9631E19002200-1label57#ec9631E250027001label58#ec9631E27002800-1label59#ec9631E28503000-1label60#ec9631E310035001label61#ec9631E36003800-1label62#ec9631E39004200-1label63#ec9631E43004700-1label64#ec9631E480048501label65#ec96315. Plot genes# Create arrow dictionary
arrow_dict = {k: g.to_dict(orient='records') for k, g in df.set_index('TRACK').groupby(level=0)}

# Define the display order of your tracks
order = ['D', 'A',  'C', 'B', 'E']5.1 Plot gene arrows and label on top trackfig, ax = plt.subplots(1,1, figsize=(10,10))
ax = cvmplot.plotgenes(dc=arrow_dict, order=order, ax=ax, max_track_size=5000, addlabels=True, label_track='top')
fig.savefig('screenshots/gene_arrow_top.png', bbox_inches='tight')5.2 Plot gene arrows and label on bottom trackfig, ax = plt.subplots(1,1, figsize=(10,10))
ax = cvmplot.plotgenes(dc=arrow_dict, order=order, ax=ax, max_track_size=5000, addlabels=True, label_track='bottom')
fig.savefig('screenshots/gene_arrow_bottom.png', bbox_inches='tight')5.3 Plot gene arrows and label on all tracksfig, ax = plt.subplots(1,1, figsize=(10,10))
ax = cvmplot.plotgenes(dc=arrow_dict, order=order, ax=ax, max_track_size=5000, addlabels=True, label_track='all')
fig.savefig('screenshots/gene_arrow_all.png', bbox_inches='tight')5.4 Plot gene arrows with phylotree and heatmapPut together!# Put together
fig,(ax1, ax2, ax3, ax4)= plt.subplots(1,4, figsize=(16, 3), gridspec_kw={'width_ratios':[1, 2, 2, 2]})
fig.tight_layout(w_pad=-2)
ax1, order = cvmplot.phylotree(tree=tree, color='k', lw=1, ax=ax1, show_label=True, align_label=True, labelsize=15)
ax2 = cvmplot.heatmap(df_heatmap, order=order, ax=ax2, cbar=True, vmin=90, yticklabel=False)
# add ax3 heatmap
ax3 = cvmplot.heatmap(df_heatmap, order=order, ax=ax3, cmap='Blues', cbar=True, yticklabel=False)

ax4 = cvmplot.plotgenes(dc=arrow_dict, order=order, ax=ax4, max_track_size=5000, addlabels=True, label_track='top', ylim=(-3, 3))



#set ticklabels property of x or y from ax1, ax2, ax3
ax1.set_xticklabels(ax1.get_xticklabels(), fontsize=15)

ax2.set_xticklabels(ax2.get_xticklabels(), rotation=90, fontsize=15)
ax2.xaxis.tick_top()

ax3.set_xticklabels(ax3.get_xticklabels(), rotation=90, fontsize=15)
ax3.set_yticklabels(ax3.get_yticklabels(), fontsize=15)
ax3.xaxis.tick_top()


# fig.tight_layout()
fig.savefig('screenshots/phylotree_heatmap_withgenes.png', bbox_inches='tight')