gwaslab 3.4.36__py3-none-any.whl → 3.4.37__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of gwaslab might be problematic. Click here for more details.

@@ -4,7 +4,7 @@ import scipy.stats as ss
4
4
  from scipy import stats
5
5
  from gwaslab.g_Log import Log
6
6
  import gc
7
- from gwaslab.qc_fix_sumstats import sortcolumn
7
+ #from gwaslab.qc_fix_sumstats import sortcolumn
8
8
  from gwaslab.g_version import _get_version
9
9
  from gwaslab.qc_check_datatype import check_datatype
10
10
 
@@ -46,7 +46,7 @@ def filldata(
46
46
  fill_iteratively(sumstats,to_fill,log,only_sig,df,extreme,verbose,sig_level)
47
47
 
48
48
  # ###################################################################################
49
- sumstats = sortcolumn(sumstats, verbose=verbose, log=log)
49
+ #sumstats = sortcolumn(sumstats, verbose=verbose, log=log)
50
50
  gc.collect()
51
51
  if verbose: log.write("Finished filling data using existing columns.")
52
52
  return sumstats
@@ -273,4 +273,43 @@ def fill_iteratively(sumstats,raw_to_fill,log,only_sig,df,extreme,verbose,sig_le
273
273
  if filled_count == 0:
274
274
  break
275
275
 
276
-
276
+ ###Base functions########################################################################################
277
+
278
+ def _convert_betase_to_z(beta, se):
279
+ return beta/se
280
+
281
+ def _convert_betase_to_p(beta, se):
282
+ z = _convert_betase_to_z(beta, se)
283
+ p = _convert_z_to_p(z)
284
+ return p
285
+
286
+ def _convert_betase_to_mlog10p(beta, se):
287
+ z = _convert_betase_to_z(beta, se)
288
+ mlog10p = _convert_z_to_mlog10p(z)
289
+ return mlog10p
290
+
291
+ def _convert_p_to_chisq(p):
292
+ return ss.chi2.isf(p, 1)
293
+
294
+ def _convert_z_to_chisq(z):
295
+ return (z)**2
296
+
297
+ def _convert_z_to_p(z):
298
+ return ss.chi2.sf(z**2,1)
299
+
300
+ def _convert_z_to_mlog10p(z):
301
+ log_pvalue = np.log(2) + ss.norm.logsf(np.abs(z)) #two-sided
302
+ mlog10p = log_pvalue/np.log(10)
303
+ return -mlog10p
304
+
305
+ def _conver_chisq_to_p(chisq):
306
+ return ss.chi2.sf(chisq,1)
307
+
308
+ def _convert_mlog10p_to_p(mlog10p):
309
+ return np.power(10, -mlog10p)
310
+
311
+ def _convert_or_to_beta(OR):
312
+ return np.log(OR)
313
+
314
+ def _convert_beta_to_or(beta):
315
+ return np.exp(beta)
@@ -287,9 +287,9 @@ def _cut(series, mode,cutfactor,cut,skip, ylabels, cut_log, verbose,lines_to_plo
287
287
  maxy = series.max()
288
288
  series = series.copy()
289
289
  if "b" not in mode:
290
- if verbose: log.write(" -Maximum -log10(P) values is "+str(maxy) +" .")
290
+ if verbose: log.write(" -Maximum -log10(P) value is "+str(maxy) +" .")
291
291
  elif "b" in mode:
292
- if verbose: log.write(" -Maximum DENSITY values is "+str(maxy) +" .")
292
+ if verbose: log.write(" -Maximum DENSITY value is "+str(maxy) +" .")
293
293
 
294
294
  maxticker=int(np.round(series.max(skipna=True)))
295
295
 
@@ -36,6 +36,7 @@ def compare_effect(path1,
36
36
  wc_correction=False,
37
37
  null_beta=0,
38
38
  is_q=False,
39
+ is_q_mc = False,
39
40
  include_all=True,
40
41
  q_level=0.05,
41
42
  sig_level=5e-8,
@@ -530,9 +531,10 @@ def compare_effect(path1,
530
531
  if (is_q is True):
531
532
  if verbose: log.write(" -Calculating Cochran's Q statistics and peform chisq test...")
532
533
  if mode=="beta" or mode=="BETA" or mode=="Beta":
533
- sig_list_merged = test_q(sig_list_merged,"EFFECT_1","SE_1","EFFECT_2_aligned","SE_2",q_level=q_level)
534
+ sig_list_merged = test_q(sig_list_merged,"EFFECT_1","SE_1","EFFECT_2_aligned","SE_2",q_level=q_level,is_q_mc=is_q_mc, log=log, verbose=verbose)
534
535
  else:
535
- sig_list_merged = test_q(sig_list_merged,"BETA_1","SE_1","BETA_2_aligned","SE_2",q_level=q_level)
536
+ sig_list_merged = test_q(sig_list_merged,"BETA_1","SE_1","BETA_2_aligned","SE_2",q_level=q_level,is_q_mc=is_q_mc, log=log, verbose=verbose)
537
+
536
538
  ######################### save ###############################################################
537
539
  ## save the merged data
538
540
  save_path = label[0]+"_"+label[1]+"_beta_sig_list_merged.tsv"
@@ -806,8 +808,15 @@ def compare_effect(path1,
806
808
  if legend_mode == "full" and is_q==True :
807
809
  title_proxy = Rectangle((0,0), 0, 0, color='w',label=legend_title)
808
810
  title_proxy2 = Rectangle((0,0), 0, 0, color='w',label=legend_title2)
809
- het_label_sig = r"$P_{het} < $" + "${}$".format(q_level)
810
- het_label_sig2 = r"$P_{het} > $" + "${}$".format(q_level)
811
+ if is_q_mc=="fdr":
812
+ het_label_sig = r"$FDR_{het} < $" + "${}$".format(q_level)
813
+ het_label_sig2 = r"$FDR_{het} > $" + "${}$".format(q_level)
814
+ elif is_q_mc=="bon":
815
+ het_label_sig = r"$P_{het,bon} < $" + "${}$".format(q_level)
816
+ het_label_sig2 = r"$P_{het,bon} > $" + "${}$".format(q_level)
817
+ else:
818
+ het_label_sig = r"$P_{het} < $" + "${}$".format(q_level)
819
+ het_label_sig2 = r"$P_{het} > $" + "${}$".format(q_level)
811
820
  het_sig = Rectangle((0,0), 0, 0, facecolor='#cccccc',edgecolor="black", linewidth=1, label=het_label_sig)
812
821
  het_nonsig = Rectangle((0,0), 0, 0, facecolor='#cccccc',edgecolor="white",linewidth=1, label=het_label_sig2)
813
822
 
@@ -876,7 +885,7 @@ def reorderLegend(ax=None, order=None, add=None):
876
885
  new_handles = [info[l] for l in order]
877
886
  return new_handles, order
878
887
 
879
- def test_q(df,beta1,se1,beta2,se2,q_level=0.05):
888
+ def test_q(df,beta1,se1,beta2,se2,q_level=0.05,is_q_mc=False, log=Log(), verbose=False):
880
889
  w1="Weight_1"
881
890
  w2="Weight_2"
882
891
  beta="BETA_FE"
@@ -891,6 +900,14 @@ def test_q(df,beta1,se1,beta2,se2,q_level=0.05):
891
900
  df[q] = df[w1]*(df[beta1]-df[beta])**2 + df[w2]*(df[beta2]-df[beta])**2
892
901
  df[pq] = ss.chi2.sf(df[q], 1)
893
902
  df["Edge_color"]="white"
903
+
904
+ if is_q_mc=="fdr":
905
+ if verbose: log.write(" -FDR correction applied...")
906
+ df[pq] = ss.false_discovery_control(df[pq])
907
+ elif is_q_mc=="bon":
908
+ if verbose: log.write(" -Bonferroni correction applied...")
909
+ df[pq] = df[pq] * len(df[pq])
910
+
894
911
  df.loc[df[pq]<q_level,"Edge_color"]="black"
895
912
  df.drop(columns=["Weight_1","Weight_2","BETA_FE"],inplace=True)
896
913
  # Huedo-Medina, T. B., Sánchez-Meca, J., Marín-Martínez, F., & Botella, J. (2006). Assessing heterogeneity in meta-analysis: Q statistic or I² index?. Psychological methods, 11(2), 193.
@@ -104,6 +104,15 @@ def mqqplot(insumstats,
104
104
  region_protein_coding = True,
105
105
  region_flank_factor = 0.05,
106
106
  region_anno_bbox_args = None,
107
+ cbar_title='LD $r^{2}$',
108
+ cbar_fontsize = None,
109
+ cbar_font_family = None,
110
+ track_n=4,
111
+ track_n_offset=0,
112
+ track_fontsize_ratio=0.95,
113
+ track_exon_ratio=1,
114
+ track_text_offset=1,
115
+ track_font_family = None,
107
116
  taf = None,
108
117
  # track_n, track_n_offset,font_ratio,exon_ratio,text_offset
109
118
  tabix=None,
@@ -243,8 +252,14 @@ def mqqplot(insumstats,
243
252
  region_ld_colors2 = ["#E4E4E4","#D8E2F2","#AFCBE3","#86B3D4","#5D98C4","#367EB7","#367EB7"]
244
253
  if region_title_args is None:
245
254
  region_title_args = {"size":10}
255
+ if cbar_fontsize is None:
256
+ cbar_fontsize = fontsize
257
+ if cbar_font_family is None:
258
+ cbar_font_family = font_family
259
+ if track_font_family is None:
260
+ track_font_family = font_family
246
261
  if taf is None:
247
- taf = [4,0,0.95,1,1]
262
+ taf = [track_n,track_n_offset,track_fontsize_ratio,track_exon_ratio,track_text_offset]
248
263
  if maf_bins is None:
249
264
  maf_bins=[(0, 0.01), (0.01, 0.05), (0.05, 0.25),(0.25,0.5)]
250
265
  if maf_bin_colors is None:
@@ -289,13 +304,13 @@ def mqqplot(insumstats,
289
304
  scatter_args["rasterized"]=True
290
305
  qq_scatter_args["rasterized"]=True
291
306
 
292
- if verbose: log.write("Start to plot manhattan/qq plot with the following basic settings {}:".format(_get_version()))
307
+ if verbose: log.write("Start to create MQQ plot with the following basic settings {}:".format(_get_version()))
293
308
  if verbose: log.write(" -Genomic coordinates version: {}...".format(build))
294
309
  if build is None or build=="99":
295
310
  if verbose: log.write(" -WARNING: Genomic coordinates version is unknown...")
296
311
  if verbose: log.write(" -Genome-wide significance level to plot is set to "+str(sig_level_plot)+" ...")
297
312
  if verbose: log.write(" -Raw input contains "+str(len(insumstats))+" variants...")
298
- if verbose: log.write(" -Plot layout mode is : "+mode)
313
+ if verbose: log.write(" -MQQ plot layout mode is : "+mode)
299
314
  if len(anno_set)>0 and ("m" in mode):
300
315
  if verbose: log.write(" -Variants to annotate : "+",".join(anno_set))
301
316
  if len(highlight)>0 and ("m" in mode):
@@ -340,13 +355,14 @@ def mqqplot(insumstats,
340
355
  # ax2 : qq plot
341
356
  # ax3 : gene track
342
357
  # ax4 : recombination rate
358
+ # cbar : color bar
343
359
  # ax5 : miami plot lower panel
344
360
 
345
361
  # "m" : Manhattan plot
346
362
  # "qq": QQ plot
347
363
  # "r" : regional plot
348
364
 
349
- fig, ax1, ax2, ax3 = _process_layout(mode=mode,
365
+ fig, ax1, ax2, ax3, ax4, cbar = _process_layout(mode=mode,
350
366
  figax=figax,
351
367
  fig_args=fig_args,
352
368
  mqqratio=mqqratio,
@@ -553,7 +569,7 @@ def mqqplot(insumstats,
553
569
  if vcf_path is not None:
554
570
  sumstats["chr_hue"]=sumstats["LD"]
555
571
 
556
- if verbose:log.write("Start to create manhattan plot with "+str(len(sumstats))+" variants:")
572
+ if verbose:log.write("Start to create MQQ plot with "+str(len(sumstats))+" variants:")
557
573
  ## default seetings
558
574
 
559
575
  palette = sns.color_palette(colors,n_colors=sumstats[chrom].nunique())
@@ -697,7 +713,7 @@ def mqqplot(insumstats,
697
713
  # if regional plot : pinpoint lead , add color bar ##################################################
698
714
  if (region is not None) and ("r" in mode):
699
715
 
700
- ax1, ax3, lead_snp_i, lead_snp_i2 =_plot_regional(
716
+ ax1, ax3, ax4, cbar, lead_snp_i, lead_snp_i2 =_plot_regional(
701
717
  sumstats=sumstats,
702
718
  fig=fig,
703
719
  ax1=ax1,
@@ -738,6 +754,7 @@ def mqqplot(insumstats,
738
754
  region_recombination = region_recombination,
739
755
  region_protein_coding=region_protein_coding,
740
756
  region_flank_factor =region_flank_factor,
757
+ track_font_family=track_font_family,
741
758
  taf=taf,
742
759
  tabix=tabix,
743
760
  chrom=chrom,
@@ -745,44 +762,11 @@ def mqqplot(insumstats,
745
762
  verbose=verbose,
746
763
  log=log
747
764
  )
765
+
748
766
  else:
749
767
  lead_snp_i= None
750
768
  lead_snp_i2=None
751
-
752
- if region is None:
753
- ax1 = _process_xtick(ax1, chrom_df, xtick_chr_dict, fontsize, font_family)
754
-
755
- # genomewide significant line
756
- ax1 = _process_line(ax1,
757
- sig_line,
758
- suggestive_sig_line,
759
- additional_line,
760
- lines_to_plot ,
761
- sc_linewidth,
762
- sig_line_color,
763
- suggestive_sig_line_color,
764
- additional_line_color,
765
- mode,
766
- bmean,
767
- bmedian )
768
769
 
769
- ax1 = _set_yticklabels(cut=cut,
770
- cutfactor=cutfactor,
771
- cut_log=cut_log,
772
- ax1=ax1,
773
- skip=skip,
774
- maxy=maxy,
775
- maxticker=maxticker,
776
- ystep=ystep,
777
- sc_linewidth=sc_linewidth,
778
- cut_line_color=cut_line_color,
779
- fontsize=fontsize,
780
- font_family=font_family,
781
- ytick3=ytick3,
782
- ylabels=ylabels,
783
- ylabels_converted=ylabels_converted
784
- )
785
-
786
770
  # Get top variants for annotation #######################################################
787
771
  if (anno and anno!=True) or (len(anno_set)>0):
788
772
  if len(anno_set)>0:
@@ -826,11 +810,72 @@ def mqqplot(insumstats,
826
810
  verbose=verbose).rename(columns={"GENE":"Annotation"})
827
811
 
828
812
  # Configure X, Y axes #######################################################
829
- ax1 = _process_ylabel(ylabel, ax1, mode, bwindowsizekb, fontsize, font_family)
830
- ax1, ax3 = _process_xlabel(region, xlabel, ax1, gtf_path, mode, fontsize, font_family, ax3=ax3 )
831
- ax1 = _process_spine(ax1, mode)
813
+ if region is None:
814
+ # if Manhattan plot
815
+ ax1 = _process_xtick(ax1=ax1,
816
+ chrom_df=chrom_df,
817
+ xtick_chr_dict=xtick_chr_dict,
818
+ fontsize = fontsize,
819
+ font_family=font_family)
832
820
 
833
- if verbose: log.write("Finished creating Manhattan plot successfully!")
821
+ ax1, ax3 = _process_xlabel(region=region,
822
+ xlabel=xlabel,
823
+ ax1=ax1,
824
+ gtf_path=gtf_path,
825
+ mode=mode,
826
+ fontsize=fontsize,
827
+ font_family=font_family,
828
+ ax3=ax3 )
829
+
830
+ ax1, ax4 = _process_ylabel(ylabel=ylabel,
831
+ ax1=ax1,
832
+ mode=mode,
833
+ bwindowsizekb=bwindowsizekb,
834
+ fontsize=fontsize,
835
+ font_family=font_family,
836
+ ax4=ax4)
837
+
838
+ ax1 = _set_yticklabels(cut=cut,
839
+ cutfactor=cutfactor,
840
+ cut_log=cut_log,
841
+ ax1=ax1,
842
+ skip=skip,
843
+ maxy=maxy,
844
+ maxticker=maxticker,
845
+ ystep=ystep,
846
+ sc_linewidth=sc_linewidth,
847
+ cut_line_color=cut_line_color,
848
+ fontsize=fontsize,
849
+ font_family=font_family,
850
+ ytick3=ytick3,
851
+ ylabels=ylabels,
852
+ ylabels_converted=ylabels_converted
853
+ )
854
+
855
+ ax1, ax4 = _process_ytick(ax1=ax1,
856
+ fontsize=fontsize,
857
+ font_family=font_family,
858
+ ax4=ax4)
859
+
860
+ if cbar is not None:
861
+ # regional plot cbar
862
+ cbar = _process_cbar(cbar, cbar_fontsize=fontsize, cbar_font_family=font_family, cbar_title=cbar_title)
863
+
864
+ ax1 = _process_spine(ax1, mode)
865
+ # genomewide significant line
866
+ ax1 = _process_line(ax1,
867
+ sig_line,
868
+ suggestive_sig_line,
869
+ additional_line,
870
+ lines_to_plot ,
871
+ sc_linewidth,
872
+ sig_line_color,
873
+ suggestive_sig_line_color,
874
+ additional_line_color,
875
+ mode,
876
+ bmean,
877
+ bmedian )
878
+
834
879
 
835
880
  if mtitle and anno and len(to_annotate)>0:
836
881
  pad=(ax1.transData.transform((skip, title_pad*maxy))[1]-ax1.transData.transform((skip, maxy)))[1]
@@ -872,7 +917,7 @@ def mqqplot(insumstats,
872
917
  log=log,
873
918
  _invert=_invert
874
919
  )
875
- # Manhatann plot Finished #####################################################################
920
+ # Manhatann-like plot Finished #####################################################################
876
921
 
877
922
  # QQ plot #########################################################################################################
878
923
  if "qq" in mode:
@@ -943,6 +988,8 @@ def mqqplot(insumstats,
943
988
  # Return matplotlib figure object #######################################################################################
944
989
  if _get_region_lead==True:
945
990
  return fig, log, lead_snp_i, lead_snp_i2
991
+
992
+ if verbose: log.write("Finished creating MQQ plot successfully!")
946
993
  return fig, log
947
994
 
948
995
  ##############################################################################################################################################################################
@@ -1173,11 +1220,34 @@ def _process_line(ax1, sig_line, suggestive_sig_line, additional_line, lines_to_
1173
1220
  medianline = ax1.axhline(y=bmedian, linewidth = sc_linewidth,linestyle="--",color=sig_line_color,zorder=1000)
1174
1221
  return ax1
1175
1222
 
1223
+ def _process_cbar(cbar, cbar_fontsize, cbar_font_family, cbar_title):
1224
+ if str(type(cbar))=="list":
1225
+ for cbar_single in cbar:
1226
+ cbar_yticklabels = cbar_single.ax.get_yticklabels()
1227
+ cbar_single.ax.set_yticklabels(cbar_yticklabels, fontsize=cbar_fontsize, family=cbar_font_family )
1228
+ cbar_single.ax.set_title(cbar_title, fontsize=cbar_fontsize, family=cbar_font_family, loc="center",y=-0.2 )
1229
+ else:
1230
+ cbar_yticklabels = cbar.ax.get_yticklabels()
1231
+ cbar.ax.set_yticklabels(cbar_yticklabels, fontsize=cbar_fontsize, family=cbar_font_family )
1232
+ cbar.ax.set_title(cbar_title, fontsize=cbar_fontsize, family=cbar_font_family, loc="center",y=-0.2 )
1233
+ return cbar
1234
+
1176
1235
  def _process_xtick(ax1, chrom_df, xtick_chr_dict, fontsize, font_family):
1177
1236
  ax1.set_xticks(chrom_df.astype("float64"))
1178
1237
  ax1.set_xticklabels(chrom_df.index.astype("Int64").map(xtick_chr_dict),fontsize=fontsize,family=font_family)
1179
1238
  return ax1
1180
1239
 
1240
+ def _process_ytick(ax1, fontsize, font_family, ax4):
1241
+ ax1_yticklabels = ax1.get_yticklabels()
1242
+ #ax1.set_yticklabels(ax1_yticklabels,fontsize=fontsize,family=font_family)
1243
+ ax1_yticks = ax1.get_yticks()
1244
+ ax1.set_yticks(ax1_yticks,ax1_yticklabels,fontsize=fontsize,family=font_family)
1245
+ if ax4 is not None:
1246
+ ax4_yticklabels = ax4.get_yticklabels()
1247
+ ax4_yticks = ax4.get_yticks()
1248
+ ax4.set_yticks(ax4_yticks,ax4_yticklabels, fontsize=fontsize,family=font_family)
1249
+ return ax1, ax4
1250
+
1181
1251
  def _process_xlabel(region, xlabel, ax1, gtf_path, mode, fontsize, font_family, ax3=None ):
1182
1252
  if region is not None:
1183
1253
  if xlabel is None:
@@ -1192,7 +1262,7 @@ def _process_xlabel(region, xlabel, ax1, gtf_path, mode, fontsize, font_family,
1192
1262
  ax1.set_xlabel(xlabel,fontsize=fontsize,family=font_family)
1193
1263
  return ax1, ax3
1194
1264
 
1195
- def _process_ylabel(ylabel, ax1, mode, bwindowsizekb, fontsize, font_family):
1265
+ def _process_ylabel(ylabel, ax1, mode, bwindowsizekb, fontsize, font_family, ax4=None):
1196
1266
  if "b" in mode:
1197
1267
  if ylabel is None:
1198
1268
  ylabel ="Density of GWAS \n SNPs within "+str(bwindowsizekb)+" kb"
@@ -1201,7 +1271,10 @@ def _process_ylabel(ylabel, ax1, mode, bwindowsizekb, fontsize, font_family):
1201
1271
  if ylabel is None:
1202
1272
  ylabel ="$-log_{10}(P)$"
1203
1273
  ax1.set_ylabel(ylabel,fontsize=fontsize,family=font_family)
1204
- return ax1
1274
+ if ax4 is not None:
1275
+ ax4_ylabel = ax4.get_ylabel()
1276
+ ax4.set_ylabel(ax4_ylabel, fontsize=fontsize, family=font_family )
1277
+ return ax1, ax4
1205
1278
 
1206
1279
  def _process_spine(ax1, mode):
1207
1280
  ax1.spines["top"].set_visible(False)
@@ -1218,6 +1291,7 @@ def _process_layout(mode, figax, fig_args, mqqratio, region_hspace):
1218
1291
  if mode=="qqm":
1219
1292
  fig, (ax2, ax1) = plt.subplots(1, 2,gridspec_kw={'width_ratios': [1, mqqratio]},**fig_args)
1220
1293
  ax3 = None
1294
+
1221
1295
  elif mode=="mqq":
1222
1296
  if figax is not None:
1223
1297
  fig = figax[0]
@@ -1226,6 +1300,7 @@ def _process_layout(mode, figax, fig_args, mqqratio, region_hspace):
1226
1300
  else:
1227
1301
  fig, (ax1, ax2) = plt.subplots(1, 2,gridspec_kw={'width_ratios': [mqqratio, 1]},**fig_args)
1228
1302
  ax3 = None
1303
+
1229
1304
  elif mode=="m":
1230
1305
  if figax is not None:
1231
1306
  fig = figax[0]
@@ -1234,10 +1309,12 @@ def _process_layout(mode, figax, fig_args, mqqratio, region_hspace):
1234
1309
  fig, ax1 = plt.subplots(1, 1,**fig_args)
1235
1310
  ax2 = None
1236
1311
  ax3 = None
1312
+
1237
1313
  elif mode=="qq":
1238
1314
  fig, ax2 = plt.subplots(1, 1,**fig_args)
1239
1315
  ax1=None
1240
1316
  ax3=None
1317
+
1241
1318
  elif mode=="r":
1242
1319
  if figax is not None:
1243
1320
  fig = figax[0]
@@ -1257,4 +1334,6 @@ def _process_layout(mode, figax, fig_args, mqqratio, region_hspace):
1257
1334
  ax3 = None
1258
1335
  else:
1259
1336
  raise ValueError("Please select one from the 5 modes: mqq/qqm/m/qq/r/b")
1260
- return fig, ax1, ax2, ax3
1337
+ ax4=None
1338
+ cbar=None
1339
+ return fig, ax1, ax2, ax3, ax4, cbar
@@ -64,6 +64,7 @@ def _plot_regional(
64
64
  region_recombination = True,
65
65
  region_protein_coding=True,
66
66
  region_flank_factor = 0.05,
67
+ track_font_family="Arial",
67
68
  taf=[4,0,0.95,1,1],
68
69
  # track_n, track_n_offset,font_ratio,exon_ratio,text_offset
69
70
  tabix=None,
@@ -104,21 +105,23 @@ def _plot_regional(
104
105
 
105
106
  if (vcf_path is not None) and region_ld_legend:
106
107
  if region_ref_second is None:
107
- ax1 = _add_ld_legend(sumstats=sumstats,
108
+ ax1, cbar = _add_ld_legend(sumstats=sumstats,
108
109
  ax1=ax1,
109
110
  region_ld_threshold=region_ld_threshold,
110
111
  region_ld_colors=region_ld_colors)
111
112
  else:
112
- ax1 = _add_ld_legend(sumstats=sumstats,
113
+
114
+ ax1, cbar1 = _add_ld_legend(sumstats=sumstats,
113
115
  ax1=ax1,
114
116
  region_ld_threshold=region_ld_threshold,
115
117
  region_ld_colors=region_ld_colors1,
116
118
  position=1)
117
- ax1 = _add_ld_legend(sumstats=sumstats,
119
+ ax1, cbar2 = _add_ld_legend(sumstats=sumstats,
118
120
  ax1=ax1,
119
121
  region_ld_threshold=region_ld_threshold,
120
122
  region_ld_colors=region_ld_colors2,
121
123
  position=2)
124
+ cbar = [cbar1, cbar2]
122
125
  if region_title is not None:
123
126
  ax1 = _add_region_title(region_title, ax1=ax1,region_title_args=region_title_args )
124
127
  ## recombinnation rate ##################################################
@@ -176,6 +179,7 @@ def _plot_regional(
176
179
  gene_track_start_i=gene_track_start_i,
177
180
  gtf_chr_dict=gtf_chr_dict,
178
181
  gtf_gene_name=gtf_gene_name,
182
+ track_font_family=track_font_family,
179
183
  taf=taf,
180
184
  build=build,
181
185
  verbose=verbose,
@@ -231,7 +235,7 @@ def _plot_regional(
231
235
  avoid_points=False,
232
236
  lim =1000)
233
237
 
234
- return ax1, ax3, lead_snp_i, lead_snp_i2
238
+ return ax1, ax3, ax4, cbar, lead_snp_i, lead_snp_i2
235
239
 
236
240
  # + ###########################################################################################################################################################################
237
241
  def _get_lead_id(sumstats=None, region_ref=None, log=None):
@@ -336,7 +340,7 @@ def _add_ld_legend(sumstats, ax1, region_ld_threshold, region_ld_colors,position
336
340
  facecolor='white',
337
341
  zorder=999998)
338
342
  ax1.add_patch(rect)
339
- return ax1
343
+ return ax1, cbar
340
344
 
341
345
  # -############################################################################################################################################################################
342
346
  def _plot_recombination_rate(sumstats,pos, region, ax1, rr_path, rr_chr_dict, rr_header_dict, build,rr_lim,rr_ylabel=True):
@@ -385,6 +389,7 @@ def _plot_gene_track(
385
389
  region_ld_colors2,
386
390
  gene_track_start_i,
387
391
  gtf_chr_dict,gtf_gene_name,
392
+ track_font_family,
388
393
  taf,
389
394
  build,
390
395
  verbose=True,
@@ -452,15 +457,15 @@ def _plot_gene_track(
452
457
  if row["end"] >= region[2]:
453
458
  #right side
454
459
  texts_to_adjust_right.append(ax3.text(x=gene_track_start_i+region[2],
455
- y=row["stack"]*2+taf[4],s=gene_anno,ha="right",va="center",color="black",style='italic', size=font_size_in_points))
460
+ y=row["stack"]*2+taf[4],s=gene_anno,ha="right",va="center",color="black",style='italic', size=font_size_in_points,family=track_font_family))
456
461
 
457
462
  elif row["start"] <= region[1] :
458
463
  #left side
459
464
  texts_to_adjust_left.append(ax3.text(x=gene_track_start_i+region[1],
460
- y=row["stack"]*2+taf[4],s=gene_anno,ha="left",va="center",color="black",style='italic', size=font_size_in_points))
465
+ y=row["stack"]*2+taf[4],s=gene_anno,ha="left",va="center",color="black",style='italic', size=font_size_in_points,family=track_font_family))
461
466
  else:
462
467
  texts_to_adjust_middle.append(ax3.text(x=(gene_track_start_i+row["start"]+gene_track_start_i+row["end"])/2,
463
- y=row["stack"]*2+taf[4],s=gene_anno,ha="center",va="center",color="black",style='italic',size=font_size_in_points))
468
+ y=row["stack"]*2+taf[4],s=gene_anno,ha="center",va="center",color="black",style='italic',size=font_size_in_points,family=track_font_family))
464
469
 
465
470
  # plot exons
466
471
  for index,row in exons.iterrows():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gwaslab
3
- Version: 3.4.36
3
+ Version: 3.4.37
4
4
  Summary: A collection of handy tools for GWAS SumStats
5
5
  Author-email: Yunye <yunye@gwaslab.com>
6
6
  Project-URL: Homepage, https://cloufield.github.io/gwaslab/
@@ -8,7 +8,7 @@ Project-URL: Github, https://github.com/Cloufield/gwaslab
8
8
  Classifier: Programming Language :: Python :: 3
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Classifier: Operating System :: OS Independent
11
- Requires-Python: <=3.10,>=3.8
11
+ Requires-Python: <=3.10,>=3.9
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
14
  Requires-Dist: pandas !=1.5,>=1.3
@@ -1,34 +1,34 @@
1
- gwaslab/__init__.py,sha256=vD_LWA3kzEkPtrFT5EnmqMiBWN6xTERIMDJbN00p2oE,2382
1
+ gwaslab/__init__.py,sha256=dFnrh4L620F5JirsSF98SmkuligA-fybIGdBF6r9Ims,2386
2
2
  gwaslab/bd_common_data.py,sha256=-YlytsRU3YnwI23EV0U_pFWZ0_0yL23_RwTfBajEuPw,11844
3
3
  gwaslab/bd_config.py,sha256=TP-r-DPhJD3XnRYZbw9bQHXaDIkiRgK8bG9HCt-UaLc,580
4
4
  gwaslab/bd_download.py,sha256=Nh09FP_d5kLsAyEF-WOYd7tty-ypvJv0PSTEO4JB2cc,15636
5
5
  gwaslab/bd_get_hapmap3.py,sha256=poqV3Ko56xhRFKdSK0ROwDQ71b27-9bMOQ0XO36To5c,2034
6
6
  gwaslab/g_Log.py,sha256=ICCzc2iP-toIRhXSnRufMqJrB6MtstJXk5qmC2yK6pY,821
7
7
  gwaslab/g_Phenotypes.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- gwaslab/g_Sumstats.py,sha256=W8XAP6C1nxs4uFQWi8hOx1qPG03hkV4wFVIwfNvKtNc,32004
8
+ gwaslab/g_Sumstats.py,sha256=9Qu5RFKgeZIkhHp-YwYZcECQOLV8dOGHvx2y9YVO3LA,33210
9
9
  gwaslab/g_SumstatsPair.py,sha256=eFFcL0foi7KJ2t7yf98WIyUMv-Kl6IrvSdv3FtqZmXs,5971
10
10
  gwaslab/g_SumstatsT.py,sha256=r3fAN-LsUIJhi7mhLH_4NBwHCOawVkbWULKY1vbmdZY,2113
11
11
  gwaslab/g_Sumstats_summary.py,sha256=Q69702tABxTVk6QIbqQ4k6eSujhXr_MVVQ5saOdEhlk,6367
12
- gwaslab/g_meta.py,sha256=KT5Es_xeCijxZ35fb6qyJ1LiBQ8WIuo5eEjGy048qVE,2193
12
+ gwaslab/g_meta.py,sha256=htWlgURWclm9R6UqFcX1a93WN27xny7lGUeyJZOtszQ,2583
13
13
  gwaslab/g_vchange_status.py,sha256=eX0jdIb6Spa07ZdpWNqUWqdVBWS0fuH2yrt4PDi3Res,1746
14
- gwaslab/g_version.py,sha256=hr_Dl0fwgypHQHtSjlnr-IyGSYg_cFrq7ftAZbYGMOA,1688
14
+ gwaslab/g_version.py,sha256=nM7GpPDOdGl2i6-JJyZDrSlJfCCWoq9dFIfHrTcQTQg,1688
15
15
  gwaslab/hm_casting.py,sha256=w8Qz0IlFwmn4_uUc7aOccWZCfY_e19ZZr-iYgCu-SnQ,10350
16
- gwaslab/hm_harmonize_sumstats.py,sha256=yPY_CpQzjd_YkwW_jXGePHkqeDcs7Kzl_eMpE5bnxKI,40859
16
+ gwaslab/hm_harmonize_sumstats.py,sha256=l8kHWVJkveRfzeKjvh6Mx5Z_QLy52GSL_9euYnFtH-U,41692
17
17
  gwaslab/hm_rsid_to_chrpos.py,sha256=-pKhY654zS4uULW7FP4yGHNy3e9Wc2ujc1VLBaoUO5A,6564
18
- gwaslab/io_preformat_input.py,sha256=3dkwgo-eyKpML5U8cmphvQEqWKuome8sKcjpF1JBq7w,19486
18
+ gwaslab/io_preformat_input.py,sha256=vusQAi9vR1Bn8K4Zf9KmDwuwqrhSaAZNZ4zHp6yfjxY,19625
19
19
  gwaslab/io_read_ldsc.py,sha256=mro3Vc3dQs6dQ2zsUaUYHOqJGIhJaNzxPeE3zsfO7dA,8659
20
20
  gwaslab/io_read_tabular.py,sha256=_gI0EA4CDecTPHTDp6hW2PesagYHHbBQvI_tW8U3Tc8,2366
21
21
  gwaslab/io_to_formats.py,sha256=tayh5qoxe9tn_g3mHTbfT3Jkz7kTo8BOPjpMtoMlfAY,21111
22
22
  gwaslab/io_to_pickle.py,sha256=XmxhV5-38ED8aEyPYzsskv7HrxCyge9tHJ2F21QA8Ms,1824
23
- gwaslab/qc_check_datatype.py,sha256=mD0_wfgQsDRx8LFRQ_xaJ9zxDm9A6ZaNDxVOFn-SllU,2737
24
- gwaslab/qc_fix_sumstats.py,sha256=VdMxXd9IXCRxKzhW1lZXJUaPC77F83glXbw_clwoK7o,80794
23
+ gwaslab/qc_check_datatype.py,sha256=ue_C7bjuL7NllOJNv8ReQESxpbXogleKGlw8ntWFi6Y,3440
24
+ gwaslab/qc_fix_sumstats.py,sha256=XME1RzZqdoKc8bO7NLuyMu_t7gudt1tpMsNdiT6BIcU,87581
25
25
  gwaslab/run_script.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  gwaslab/util_ex_calculate_ldmatrix.py,sha256=hjFOZqGfQixTjMSxgVbB-JQwP0QcQMKfbhs-dsLT5Qw,12112
27
27
  gwaslab/util_ex_calculate_prs.py,sha256=uOcMRWujEYMYGuO-qGe3okQJYizXGvqDcomXlzLvln8,9049
28
28
  gwaslab/util_ex_gwascatalog.py,sha256=Y3CiBu03yrJ4SDubl3mOq62fIkbr7bZ1lwbhWEVWKmA,7576
29
29
  gwaslab/util_ex_ldproxyfinder.py,sha256=C705kiw673DaijrccJ8ifO2IXR9RHP8B7Jfp0_-7UWo,9398
30
30
  gwaslab/util_ex_plink_filter.py,sha256=Ak09-tEIS_uq1OtiCmcDCXcEjzQHCEfp44AKkhgoOzY,1669
31
- gwaslab/util_ex_process_h5.py,sha256=Xcdr3sqZ1RpVUdjUKp0nCp50lIuIFL4cojQYhYI6D5w,2267
31
+ gwaslab/util_ex_process_h5.py,sha256=1QzcQurnwedYFiF4ZaEOv0Wl41rBEUjS7yVcMWNIslE,2741
32
32
  gwaslab/util_ex_process_ref.py,sha256=vB5tDnlpnStLJq1QgxwhJQ1wRlQ8hy-yI5smm2wUjaA,16445
33
33
  gwaslab/util_ex_run_2samplemr.py,sha256=AvhpR_ihR052LBabR1wfEaBqfwCs88VW8Q2ijdKMfUs,9040
34
34
  gwaslab/util_ex_run_clumping.py,sha256=fE-PHeYjl8I08ycwCbJrQjF3wixMDYKNe4EASupEMpo,6816
@@ -38,22 +38,22 @@ gwaslab/util_in_calculate_gc.py,sha256=HqyBBDorWoBlmD1i4K2Vr4vTTPqg5YLM8ktdvCpKe
38
38
  gwaslab/util_in_calculate_power.py,sha256=Kk46GHKDcub6l1XTT-ZT5hrPmR8EUa_tS_LIPbLRvbU,10112
39
39
  gwaslab/util_in_convert_h2.py,sha256=azqGs9whhhukVDFruAwTobor4-LnGHWIOrhK_avRnWs,6468
40
40
  gwaslab/util_in_correct_winnerscurse.py,sha256=o7CjUwLp4B_60yrntV76ESNaoPcl-HPOzSw9cYWzpW4,2050
41
- gwaslab/util_in_fill_data.py,sha256=5J8zt2-wuzL_ehC2JKg2IO-RcQ2eE8yS9X3R6tjsRf4,12873
41
+ gwaslab/util_in_fill_data.py,sha256=vVtxWN-BRDPsGCIEIGJ9cWCayiWBYuOdV3kZyakhpFA,13847
42
42
  gwaslab/util_in_filter_value.py,sha256=rF2Nv1H-dxJZIIvw0r1tCB2xAFXt75qbpNJOpnEVffw,14647
43
43
  gwaslab/util_in_get_density.py,sha256=n4GFhuqyJ4HBepHJeMXVsddGRweFBaBQNueMg3hs4D8,3905
44
44
  gwaslab/util_in_get_sig.py,sha256=hrZrLb50h2V-PtPXkwJ2F_jc1piMJ2wJqWTqSq9cnEg,19805
45
45
  gwaslab/viz_aux_annotate_plot.py,sha256=BKwvyXydKjgFo2w2ZCwxtxRLGT-g5e6eayhkSje3Lfc,32124
46
- gwaslab/viz_aux_quickfix.py,sha256=hrrLADC9h1J7SCL1KDUYf-8zGrhXRHMvrwARSYpNExw,17906
46
+ gwaslab/viz_aux_quickfix.py,sha256=AP7Yg1TQ0q810BKRCM5jLXAjPSFehs2vxY2ocIFr7Ag,17904
47
47
  gwaslab/viz_aux_reposition_text.py,sha256=N0jMQSAnFPFWwx9mUFTcVtntdA56I_3vB332jtpezU4,4233
48
48
  gwaslab/viz_aux_save_figure.py,sha256=KfpYuSNxYv0EvcoR5n2AWjnGnJzFrYfyoGfJd71NYMQ,2083
49
49
  gwaslab/viz_plot_compare_af.py,sha256=vVypmnF-l6JzXyi5HPYFr-GM-OmNQGvip8oTCBvvHsk,5532
50
- gwaslab/viz_plot_compare_effect.py,sha256=LVRPRpbwrlxEvJPDauKTgPy4zZss3RylnLBOoqdTzEM,49019
50
+ gwaslab/viz_plot_compare_effect.py,sha256=iUlp6tUS7OSlffgGyUIH4tPXQB_BK19OQZSo7xhToRA,49817
51
51
  gwaslab/viz_plot_forestplot.py,sha256=xgOnefh737CgdQxu5naVyRNBX1NQXPFKzf51fbh6afs,6771
52
52
  gwaslab/viz_plot_miamiplot.py,sha256=rCFEp7VNuVqeBBG3WRkmFAtFklbF79BvIQQYiSY70VY,31238
53
53
  gwaslab/viz_plot_miamiplot2.py,sha256=aJcA5eEY44VuGMZMBKM6aPE1D_D6w2O2Jmw5QwUoyik,15371
54
- gwaslab/viz_plot_mqqplot.py,sha256=PHZ_f1MPg5aqwTyBDcaT6xpNLzkWqUaNb9efqLx0tiE,55775
54
+ gwaslab/viz_plot_mqqplot.py,sha256=nMorIAlepN2IpeWtCfinIzsEfLdjIBCvRSE12b-Rk2U,59112
55
55
  gwaslab/viz_plot_qqplot.py,sha256=XVnNbX5oXk2yvXT4uSuGtWW1fbr_FzAlWNjRW_bWmyU,7012
56
- gwaslab/viz_plot_regionalplot.py,sha256=rIaX99Drq3kCTyahthbkpek3Tf0UpFXLfpIGX_iAh70,37122
56
+ gwaslab/viz_plot_regionalplot.py,sha256=oTY-5eAnPpKyiKBbgXMer2nJHwWT3HBQokxWMit_0Gs,37404
57
57
  gwaslab/viz_plot_rg_heatmap.py,sha256=nibSCUnY_ZskCpJx7ppOgyqOuXBaWy6r7c_1McrQmZ0,13877
58
58
  gwaslab/viz_plot_stackedregional.py,sha256=Ne7ncUN4iwmYKaDR8ZXeAFYPw29o_M2JzAnZRkyeMA0,9894
59
59
  gwaslab/viz_plot_trumpetplot.py,sha256=YAcLDgqPr9JK0vKo_ZDtfKgkhHpQVOxeg2UnbQ2HsA8,37002
@@ -65,8 +65,8 @@ gwaslab/data/hapmap3_SNPs/hapmap3_db150_hg19.snplist.gz,sha256=qD9RsC5S2h6l-OdpW
65
65
  gwaslab/data/hapmap3_SNPs/hapmap3_db151_hg38.snplist.gz,sha256=Y8ZT2FIAhbhlgCJdE9qQVAiwnV_fcsPt72usBa7RSBM,10225828
66
66
  gwaslab/data/high_ld/high_ld_hla_hg19.bed.gz,sha256=R7IkssKu0L4WwkU9SrS84xCMdrkkKL0gnTNO_OKbG0Y,219
67
67
  gwaslab/data/high_ld/high_ld_hla_hg38.bed.gz,sha256=76CIU0pibDJ72Y6UY-TbIKE9gEPwTELAaIbCXyjm80Q,470
68
- gwaslab-3.4.36.dist-info/LICENSE,sha256=GhLOU_1UDEKeOacYhsRN_m9u-eIuVTazSndZPeNcTZA,1066
69
- gwaslab-3.4.36.dist-info/METADATA,sha256=j5hCOz5Mas0ZHjMla_nMOJJxysnkkqiv3FSclqR0Z34,6806
70
- gwaslab-3.4.36.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
71
- gwaslab-3.4.36.dist-info/top_level.txt,sha256=PyY6hWtrALpv2MAN3kjkIAzJNmmBTH5a2risz9KwH08,8
72
- gwaslab-3.4.36.dist-info/RECORD,,
68
+ gwaslab-3.4.37.dist-info/LICENSE,sha256=GhLOU_1UDEKeOacYhsRN_m9u-eIuVTazSndZPeNcTZA,1066
69
+ gwaslab-3.4.37.dist-info/METADATA,sha256=f_nK22RXPBbzF69Zhhx4eIQVIYhsHxZMmZnh5Jkb-wM,6806
70
+ gwaslab-3.4.37.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
71
+ gwaslab-3.4.37.dist-info/top_level.txt,sha256=PyY6hWtrALpv2MAN3kjkIAzJNmmBTH5a2risz9KwH08,8
72
+ gwaslab-3.4.37.dist-info/RECORD,,