gwaslab 3.6.7__tar.gz → 3.6.8__tar.gz

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.

Files changed (128) hide show
  1. {gwaslab-3.6.7/src/gwaslab.egg-info → gwaslab-3.6.8}/PKG-INFO +1 -1
  2. {gwaslab-3.6.7 → gwaslab-3.6.8}/pyproject.toml +1 -1
  3. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_version.py +2 -2
  4. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_phewwas.py +13 -3
  5. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_mqqplot.py +52 -8
  6. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_qqplot.py +8 -26
  7. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_trumpetplot.py +4 -0
  8. {gwaslab-3.6.7 → gwaslab-3.6.8/src/gwaslab.egg-info}/PKG-INFO +1 -1
  9. {gwaslab-3.6.7 → gwaslab-3.6.8}/LICENSE +0 -0
  10. {gwaslab-3.6.7 → gwaslab-3.6.8}/LICENSE_before_v3.4.39 +0 -0
  11. {gwaslab-3.6.7 → gwaslab-3.6.8}/README.md +0 -0
  12. {gwaslab-3.6.7 → gwaslab-3.6.8}/setup.cfg +0 -0
  13. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/__init__.py +0 -0
  14. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/bd/bd_common_data.py +0 -0
  15. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/bd/bd_config.py +0 -0
  16. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/bd/bd_download.py +0 -0
  17. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/bd/bd_get_hapmap3.py +0 -0
  18. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/bd/bd_path_manager.py +0 -0
  19. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/cache_manager.py +0 -0
  20. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/data/chrx_par/chrx_par_hg19.bed.gz +0 -0
  21. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/data/chrx_par/chrx_par_hg38.bed.gz +0 -0
  22. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/data/formatbook.json +0 -0
  23. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/data/hapmap3_SNPs/hapmap3_db150_hg19.snplist.gz +0 -0
  24. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/data/hapmap3_SNPs/hapmap3_db151_hg38.snplist.gz +0 -0
  25. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/data/high_ld/high_ld_hla_hg19.bed.gz +0 -0
  26. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/data/high_ld/high_ld_hla_hg38.bed.gz +0 -0
  27. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/data/reference.json +0 -0
  28. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/extension/ldsc/ldsc_irwls.py +0 -0
  29. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/extension/ldsc/ldsc_jackknife.py +0 -0
  30. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/extension/ldsc/ldsc_ldscore.py +0 -0
  31. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/extension/ldsc/ldsc_parse.py +0 -0
  32. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/extension/ldsc/ldsc_regressions.py +0 -0
  33. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/extension/ldsc/ldsc_sumstats.py +0 -0
  34. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/extension/prscs/prscs_gigrnd.py +0 -0
  35. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/extension/prscs/prscs_mcmc_gtb.py +0 -0
  36. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/extension/prscs/prscs_parse_genet.py +0 -0
  37. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_Log.py +0 -0
  38. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_Phenotypes.py +0 -0
  39. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_Sumstats.py +0 -0
  40. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_SumstatsMulti.py +0 -0
  41. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_SumstatsPair.py +0 -0
  42. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_SumstatsSet.py +0 -0
  43. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_SumstatsT.py +0 -0
  44. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_Sumstats_polars.py +0 -0
  45. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_Sumstats_summary.py +0 -0
  46. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_headers.py +0 -0
  47. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_meta.py +0 -0
  48. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_meta_update.py +0 -0
  49. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_vchange_status.py +0 -0
  50. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/g_vchange_status_polars.py +0 -0
  51. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/hm/hm_casting.py +0 -0
  52. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/hm/hm_casting_polars.py +0 -0
  53. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/hm/hm_harmonize_sumstats.py +0 -0
  54. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/hm/hm_rsid_to_chrpos.py +0 -0
  55. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/hm_harmonize_sumstats.py +0 -0
  56. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/io/io_load_ld.py +0 -0
  57. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/io/io_preformat_input.py +0 -0
  58. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/io/io_preformat_input_polars.py +0 -0
  59. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/io/io_process_args.py +0 -0
  60. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/io/io_read_ldsc.py +0 -0
  61. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/io/io_read_pipcs.py +0 -0
  62. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/io/io_read_tabular.py +0 -0
  63. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/io/io_to_formats.py +0 -0
  64. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/io/io_to_pickle.py +0 -0
  65. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/qc/qc_build.py +0 -0
  66. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/qc/qc_check_datatype.py +0 -0
  67. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/qc/qc_check_datatype_polars.py +0 -0
  68. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/qc/qc_fix_sumstats.py +0 -0
  69. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/qc/qc_fix_sumstats_polars.py +0 -0
  70. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/run_script.py +0 -0
  71. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_abf_finemapping.py +0 -0
  72. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_calculate_ldmatrix.py +0 -0
  73. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_calculate_prs.py +0 -0
  74. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_gwascatalog.py +0 -0
  75. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_infer_ancestry.py +0 -0
  76. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_ldproxyfinder.py +0 -0
  77. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_ldsc.py +0 -0
  78. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_match_ldmatrix.py +0 -0
  79. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_plink_filter.py +0 -0
  80. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_process_h5.py +0 -0
  81. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_process_ref.py +0 -0
  82. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_2samplemr.py +0 -0
  83. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_ccgwas.py +0 -0
  84. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_clumping.py +0 -0
  85. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_coloc.py +0 -0
  86. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_hyprcoloc.py +0 -0
  87. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_magma.py +0 -0
  88. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_mesusie.py +0 -0
  89. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_mtag.py +0 -0
  90. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_prscs.py +0 -0
  91. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_scdrs.py +0 -0
  92. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_ex_run_susie.py +0 -0
  93. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_calculate_gc.py +0 -0
  94. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_calculate_power.py +0 -0
  95. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_convert_h2.py +0 -0
  96. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_correct_winnerscurse.py +0 -0
  97. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_estimate_ess.py +0 -0
  98. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_fill_data.py +0 -0
  99. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_filter_value.py +0 -0
  100. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_get_density.py +0 -0
  101. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_get_sig.py +0 -0
  102. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_merge.py +0 -0
  103. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_meta.py +0 -0
  104. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_meta_polars.py +0 -0
  105. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/util/util_in_snphwe.py +0 -0
  106. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_aux_annotate_plot.py +0 -0
  107. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_aux_chromatin.py +0 -0
  108. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_aux_property.py +0 -0
  109. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_aux_quickfix.py +0 -0
  110. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_aux_reposition_text.py +0 -0
  111. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_aux_save_figure.py +0 -0
  112. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_compare_af.py +0 -0
  113. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_compare_effect.py +0 -0
  114. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_credible_sets.py +0 -0
  115. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_effect.py +0 -0
  116. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_forestplot.py +0 -0
  117. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_miamiplot.py +0 -0
  118. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_miamiplot2.py +0 -0
  119. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_phe_heatmap.py +0 -0
  120. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_regional2.py +0 -0
  121. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_regionalplot.py +0 -0
  122. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_rg_heatmap.py +0 -0
  123. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_scatter_with_reg.py +0 -0
  124. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab/viz/viz_plot_stackedregional.py +0 -0
  125. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab.egg-info/SOURCES.txt +0 -0
  126. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab.egg-info/dependency_links.txt +0 -0
  127. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab.egg-info/requires.txt +0 -0
  128. {gwaslab-3.6.7 → gwaslab-3.6.8}/src/gwaslab.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gwaslab
3
- Version: 3.6.7
3
+ Version: 3.6.8
4
4
  Summary: A collection of handy tools for GWAS SumStats
5
5
  Author-email: Yunye <gwaslab@gmail.com>
6
6
  Project-URL: Homepage, https://cloufield.github.io/gwaslab/
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
7
7
 
8
8
  [project]
9
9
  name = "gwaslab"
10
- version = "3.6.7"
10
+ version = "3.6.8"
11
11
  authors = [
12
12
  { name="Yunye", email="gwaslab@gmail.com" },
13
13
  ]
@@ -17,8 +17,8 @@ def _get_version():
17
17
  def gwaslab_info():
18
18
  # version meta information
19
19
  dic={
20
- "version":"3.6.7",
21
- "release_date":"20250827"
20
+ "version":"3.6.0",
21
+ "release_date":"20250902"
22
22
  }
23
23
  return dic
24
24
 
@@ -7,6 +7,11 @@ def _extract_associations(sumstats, rsid="rsID", log = Log(), verbose=True):
7
7
 
8
8
  assoc, traits, studies, variants = get_associations_from_gwascatalog(sumstats, rsid=rsid, log=log, verbose=verbose)
9
9
 
10
+ if len(assoc)==0:
11
+ # if no associations
12
+ log.write("No associations!")
13
+ return None, None
14
+
10
15
  assoc = _fix_beta(assoc)
11
16
 
12
17
  traits_agg = traits.groupby("associationId")[["trait","shortForm"]].agg(lambda x: ",".join(x)).reset_index()
@@ -14,7 +19,7 @@ def _extract_associations(sumstats, rsid="rsID", log = Log(), verbose=True):
14
19
  assoc_traits_agg= pd.merge(assoc, traits_agg, on ="associationId",how="left")
15
20
 
16
21
  assoc_traits_agg= pd.merge(assoc_traits_agg, studies, on ="associationId", how="left")
17
-
22
+
18
23
  assoc_traits_agg= pd.merge(assoc_traits_agg, variants, on ="associationId",how="left")
19
24
 
20
25
  assoc_traits_agg = assoc_traits_agg.rename(columns={"trait":"GWASCATALOG_TRAIT",
@@ -101,7 +106,12 @@ def get_associations_from_gwascatalog(sumstats, rsid="rsID", log=Log(), verbose=
101
106
  return association, traits, studies, variants
102
107
 
103
108
  def _fix_beta(association):
104
-
109
+ if "betaNum" not in association:
110
+ association["betaNum"] = pd.NA
111
+ if "orPerCopyNum" not in association:
112
+ association["orPerCopyNum"] = pd.NA
113
+ if "range" not in association:
114
+ association["range"] = pd.NA
105
115
  is_or_available = (association["betaNum"].isna()) & (~association["orPerCopyNum"].isna())
106
116
  is_range_available = (association["betaNum"].isna()) & (association["orPerCopyNum"].isna()) & (~association["range"].isna())
107
117
 
@@ -114,4 +124,4 @@ def parse_range(x):
114
124
  high = np.log(range_list[1])
115
125
  low = np.log(range_list[0])
116
126
  beta = (high + low)/2
117
- return beta
127
+ return beta
@@ -100,6 +100,8 @@ def mqqplot(insumstats,
100
100
  qq_scatter_args=None,
101
101
  qqscatterargs=None,
102
102
  qq_line_color = "grey",
103
+ qq_xlabels = None,
104
+ qq_xlim = None,
103
105
  # region
104
106
  region = None,
105
107
  region_title=None,
@@ -204,6 +206,8 @@ def mqqplot(insumstats,
204
206
  highlight_color="#CB132D",
205
207
  highlight_windowkb = 500,
206
208
  highlight_anno_args = None,
209
+ highlight_lim = None,
210
+ highlight_lim_mode = "absolute",
207
211
  pinpoint= None,
208
212
  pinpoint_color ="red",
209
213
  stratified=False,
@@ -531,6 +535,8 @@ def mqqplot(insumstats,
531
535
  highlight=highlight,
532
536
  highlight_chrpos=highlight_chrpos,
533
537
  highlight_windowkb=highlight_windowkb,
538
+ highlight_lim = highlight_lim,
539
+ highlight_lim_mode = highlight_lim_mode,
534
540
  snpid=snpid,
535
541
  chrom=chrom,
536
542
  pos=pos)
@@ -1096,6 +1102,8 @@ def mqqplot(insumstats,
1096
1102
  linewidth=sc_linewidth,
1097
1103
  ytick3 = ytick3,
1098
1104
  ylabels = ylabels,
1105
+ xlabels = qq_xlabels,
1106
+ xlim = qq_xlim,
1099
1107
  ylabels_converted = ylabels_converted,
1100
1108
  verbose=verbose,
1101
1109
  qq_scatter_args=qq_scatter_args,
@@ -1335,19 +1343,38 @@ def _process_p_value(sumstats, mode,p, mlog10p, scaled, log, verbose ):
1335
1343
 
1336
1344
  return sumstats
1337
1345
 
1338
- def _process_highlight(sumstats, highlight, highlight_chrpos, highlight_windowkb, snpid, chrom, pos):
1346
+ def _process_highlight(sumstats, highlight, highlight_chrpos, highlight_windowkb, highlight_lim, highlight_lim_mode, snpid, chrom, pos):
1339
1347
  if pd.api.types.is_list_like(highlight[0]):
1340
1348
  if highlight_chrpos == False:
1341
1349
  # highlight for multiple sets
1342
1350
  for i, highlight_set in enumerate(highlight):
1343
1351
  to_highlight = sumstats.loc[sumstats[snpid].isin(highlight_set),:]
1344
1352
  #assign colors: 0 is hightlight color
1345
- for index,row in to_highlight.iterrows():
1353
+ #assign colors: i is highlight color
1354
+ for j, (index, row) in enumerate(to_highlight.iterrows()):
1346
1355
  target_chr = int(row[chrom])
1347
1356
  target_pos = int(row[pos])
1348
1357
  right_chr=sumstats[chrom]==target_chr
1349
- up_pos=sumstats[pos]>target_pos-highlight_windowkb*1000
1350
- low_pos=sumstats[pos]<target_pos+highlight_windowkb*1000
1358
+ # Check if highlight_lim is provided for this group and SNP
1359
+ if (highlight_lim is not None and
1360
+ i < len(highlight_lim) and
1361
+ j < len(highlight_lim[i]) and
1362
+ highlight_lim[i][j] is not None):
1363
+ # Use custom limits for this SNP
1364
+ if highlight_lim_mode == "absolute":
1365
+ # Absolute positions: (start_pos, end_pos)
1366
+ start_pos, end_pos = highlight_lim[i][j]
1367
+ up_pos = sumstats[pos] >= start_pos
1368
+ low_pos = sumstats[pos] <= end_pos
1369
+ else:
1370
+ # Offset mode: (lower_kb, upper_kb) relative to SNP position
1371
+ lower_kb, upper_kb = highlight_lim[i][j]
1372
+ up_pos = sumstats[pos] > target_pos + lower_kb * 1000
1373
+ low_pos = sumstats[pos] < target_pos + upper_kb * 1000
1374
+ else:
1375
+ # Use default highlight_windowkb
1376
+ up_pos = sumstats[pos] > target_pos - highlight_windowkb * 1000
1377
+ low_pos = sumstats[pos] < target_pos + highlight_windowkb * 1000
1351
1378
  sumstats.loc[right_chr&up_pos&low_pos,"HUE"]=i
1352
1379
  else:
1353
1380
  for i, highlight_chrpos_tuple in enumerate(highlight):
@@ -1371,13 +1398,30 @@ def _process_highlight(sumstats, highlight, highlight_chrpos, highlight_windowkb
1371
1398
  else:
1372
1399
  # highlight for one set
1373
1400
  to_highlight = sumstats.loc[sumstats[snpid].isin(highlight),:]
1374
- #assign colors: 0 is hightlight color
1375
- for index,row in to_highlight.iterrows():
1401
+ #assign colors: 0 is highlight color
1402
+ for j, (index, row) in enumerate(to_highlight.iterrows()):
1376
1403
  target_chr = int(row[chrom])
1377
1404
  target_pos = int(row[pos])
1378
1405
  right_chr=sumstats[chrom]==target_chr
1379
- up_pos=sumstats[pos]>target_pos-highlight_windowkb*1000
1380
- low_pos=sumstats[pos]<target_pos+highlight_windowkb*1000
1406
+ # Check if highlight_lim is provided for this SNP
1407
+ if (highlight_lim is not None and
1408
+ j < len(highlight_lim) and
1409
+ highlight_lim[j] is not None):
1410
+ # Use custom limits for this SNP
1411
+ if highlight_lim_mode == "absolute":
1412
+ # Absolute positions: (start_pos, end_pos)
1413
+ start_pos, end_pos = highlight_lim[j]
1414
+ up_pos = sumstats[pos] >= start_pos
1415
+ low_pos = sumstats[pos] <= end_pos
1416
+ else:
1417
+ # Offset mode: (lower_kb, upper_kb) relative to SNP position
1418
+ lower_kb, upper_kb = highlight_lim[j]
1419
+ up_pos = sumstats[pos] > target_pos + lower_kb * 1000
1420
+ low_pos = sumstats[pos] < target_pos + upper_kb * 1000
1421
+ else:
1422
+ # Use default highlight_windowkb
1423
+ up_pos = sumstats[pos] > target_pos - highlight_windowkb * 1000
1424
+ low_pos = sumstats[pos] < target_pos + highlight_windowkb * 1000
1381
1425
  sumstats.loc[right_chr&up_pos&low_pos,"HUE"]=0
1382
1426
  return sumstats
1383
1427
 
@@ -39,6 +39,8 @@ def _plot_qq(
39
39
  linewidth,
40
40
  ytick3,
41
41
  ylabels,
42
+ xlabels,
43
+ xlim,
42
44
  ylabels_converted,
43
45
  qq_scatter_args,
44
46
  expected_min_mlog10p,
@@ -155,32 +157,12 @@ def _plot_qq(
155
157
  log=log,
156
158
  verbose=verbose
157
159
  )
158
-
159
- #if cut == 0:
160
- # ax2.set_ylim(skip, ceil(maxy*1.2) )
161
- #
162
- #if cut:
163
- # qcutline = ax2.axhline(y=cut, linewidth = linewidth, linestyle="--",color=cut_line_color,zorder=1)
164
- # step=2
165
- # if ((maxticker-cut)/cutfactor + cut) > cut:
166
- # if ystep == 0:
167
- # if (cut - skip ) // step > 10:
168
- # step = (cut - skip ) // 10
169
- # else:
170
- # step = ystep
171
- #
172
- # ax2.set_yticks([x for x in range(skip,cut-step,step)]+[cut]+[(maxticker-cut)/cutfactor + cut])
173
- # ax2.set_yticklabels([x for x in range(skip,cut-step,step)]+[cut]+[maxticker],fontsize=fontsize,family=font_family)
174
- # else:
175
- # if ystep == 0:
176
- # if (cut - skip ) // step > 10:
177
- # step = (cut - skip ) // 10
178
- # else:
179
- # step = ystep
180
- #
181
- # ax2.set_yticks([x for x in range(skip,cut-step,step)]+[cut])
182
- # ax2.set_yticklabels([x for x in range(skip,cut-step,step)]+[cut],fontsize=fontsize,family=font_family)
183
- # ax2.set_ylim(bottom = skip)
160
+ if xlim is not None:
161
+ ax2.set_xlim(xlim)
162
+
163
+ if xlabels is not None:
164
+ ax2.set_xticks(xlabels)
165
+ ax2.set_xticklabels(xlabels,fontsize=fontsize,family=font_family)
184
166
 
185
167
  ax2.tick_params(axis='both', which='both', labelsize=fontsize,labelfontfamily=font_family)
186
168
  #
@@ -57,6 +57,8 @@ def plottrumpet(mysumstats,
57
57
  highlight_color="#CB132D",
58
58
  highlight_windowkb = 500,
59
59
  highlight_anno_args = None,
60
+ highlight_lim = None,
61
+ highlight_lim_mode = "absolute",
60
62
  pinpoint= None,
61
63
  pinpoint_color ="red",
62
64
  scatter_args=None,
@@ -235,6 +237,8 @@ def plottrumpet(mysumstats,
235
237
  highlight=highlight,
236
238
  highlight_chrpos=highlight_chrpos,
237
239
  highlight_windowkb=highlight_windowkb,
240
+ highlight_lim=highlight_lim,
241
+ highlight_lim_mode=highlight_lim_mode,
238
242
  snpid=snpid,
239
243
  chrom=chrom,
240
244
  pos=pos)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gwaslab
3
- Version: 3.6.7
3
+ Version: 3.6.8
4
4
  Summary: A collection of handy tools for GWAS SumStats
5
5
  Author-email: Yunye <gwaslab@gmail.com>
6
6
  Project-URL: Homepage, https://cloufield.github.io/gwaslab/
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes