py2ls 0.2.4.4__py3-none-any.whl → 0.2.4.5__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.
py2ls/bio.py
CHANGED
@@ -324,7 +324,7 @@ def find_condition(data:pd.DataFrame, columns=["characteristics_ch1","title"]):
|
|
324
324
|
# 详细看看每个信息的有哪些类, 其中有数字的, 要去除
|
325
325
|
for col in columns:
|
326
326
|
print(f"{"="*10} {col} {"="*10}")
|
327
|
-
display(ips.flatten([ips.ssplit(i, by="numer")[0] for i in data[col]]))
|
327
|
+
display(ips.flatten([ips.ssplit(i, by="numer")[0] for i in data[col]],verbose=False))
|
328
328
|
|
329
329
|
def add_condition(
|
330
330
|
data: pd.DataFrame,
|
@@ -581,7 +581,7 @@ def batch_effect(
|
|
581
581
|
return df_corrected
|
582
582
|
|
583
583
|
def get_common_genes(elment1, elment2):
|
584
|
-
common_genes=ips.shared(elment1, elment2)
|
584
|
+
common_genes=ips.shared(elment1, elment2,verbose=False)
|
585
585
|
return common_genes
|
586
586
|
|
587
587
|
def counts2expression(
|
@@ -667,7 +667,7 @@ def counts2expression(
|
|
667
667
|
|
668
668
|
length.index=length.index.astype(str).str.strip()
|
669
669
|
counts.columns = counts.columns.astype(str).str.strip()
|
670
|
-
shared_genes=ips.shared(length.index, counts.columns)
|
670
|
+
shared_genes=ips.shared(length.index, counts.columns,verbose=False)
|
671
671
|
length=length.loc[shared_genes]
|
672
672
|
counts=counts.loc[:,shared_genes]
|
673
673
|
columns_org = counts.columns.tolist()
|
@@ -842,6 +842,7 @@ def scope_genes(gene_list: list, scopes:str=None, fields: str = "symbol", specie
|
|
842
842
|
|
843
843
|
def get_enrichr(gene_symbol_list,
|
844
844
|
gene_sets:str,
|
845
|
+
download:bool = False,
|
845
846
|
species='Human',
|
846
847
|
dir_save="./",
|
847
848
|
plot_=False,
|
@@ -854,6 +855,7 @@ def get_enrichr(gene_symbol_list,
|
|
854
855
|
title=None,# 'KEGG'
|
855
856
|
cutoff=0.05,
|
856
857
|
cmap="coolwarm",
|
858
|
+
size=5,
|
857
859
|
**kwargs):
|
858
860
|
"""
|
859
861
|
Note: Enrichr uses a list of Entrez gene symbols as input.
|
@@ -878,16 +880,22 @@ def get_enrichr(gene_symbol_list,
|
|
878
880
|
lib_support_names = gp.get_library_name()
|
879
881
|
# correct input gene_set name
|
880
882
|
gene_sets_name=ips.strcmp(gene_sets,lib_support_names)[0]
|
883
|
+
|
881
884
|
# download it
|
882
|
-
|
883
|
-
|
885
|
+
if download:
|
886
|
+
gene_sets = gp.get_library(name=gene_sets_name, organism=species)
|
887
|
+
else:
|
888
|
+
gene_sets = gene_sets_name # 避免重复下载
|
889
|
+
print(f"\ngene_sets get ready: {gene_sets_name}")
|
884
890
|
|
885
891
|
# gene symbols are uppercase
|
886
892
|
gene_symbol_list=[str(i).upper() for i in gene_symbol_list]
|
887
893
|
|
888
894
|
# # check how shared genes
|
889
|
-
if check_shared:
|
890
|
-
shared_genes=ips.shared(ips.flatten(gene_symbol_list,verbose=False),
|
895
|
+
if check_shared and isinstance(gene_sets, dict):
|
896
|
+
shared_genes=ips.shared(ips.flatten(gene_symbol_list,verbose=False),
|
897
|
+
ips.flatten(gene_sets,verbose=False),
|
898
|
+
verbose=False)
|
891
899
|
|
892
900
|
#! enrichr
|
893
901
|
try:
|
@@ -903,13 +911,13 @@ def get_enrichr(gene_symbol_list,
|
|
903
911
|
return None
|
904
912
|
|
905
913
|
results_df = enr.results
|
906
|
-
print(f"got enrichr reslutls; shape: {results_df.shape}")
|
914
|
+
print(f"got enrichr reslutls; shape: {results_df.shape}\n")
|
907
915
|
results_df["-log10(Adjusted P-value)"] = -np.log10(results_df["Adjusted P-value"])
|
908
916
|
results_df.sort_values("-log10(Adjusted P-value)", inplace=True, ascending=False)
|
909
917
|
|
910
918
|
if plot_:
|
911
919
|
if palette is None:
|
912
|
-
palette=plot.get_color(n_top, cmap=
|
920
|
+
palette=plot.get_color(n_top, cmap=cmap)[::-1]
|
913
921
|
#! barplot
|
914
922
|
if n_top<5:
|
915
923
|
height_=4
|
@@ -921,11 +929,12 @@ def get_enrichr(gene_symbol_list,
|
|
921
929
|
height_=7
|
922
930
|
elif 15<=n_top<20:
|
923
931
|
height_=8
|
924
|
-
elif
|
932
|
+
elif 20<=n_top<30:
|
925
933
|
height_=9
|
926
934
|
else:
|
927
935
|
height_=int(n_top/3)
|
928
|
-
plt.figure(figsize=[
|
936
|
+
plt.figure(figsize=[10, height_])
|
937
|
+
|
929
938
|
ax1=plot.plotxy(
|
930
939
|
data=results_df.head(n_top),
|
931
940
|
kind="barplot",
|
@@ -935,18 +944,17 @@ def get_enrichr(gene_symbol_list,
|
|
935
944
|
palette=palette,
|
936
945
|
legend=None,
|
937
946
|
)
|
947
|
+
plot.figsets(ax=ax1, **kws_figsets)
|
938
948
|
if dir_save:
|
939
949
|
ips.figsave(f"{dir_save} enr_barplot.pdf")
|
940
|
-
plot.figsets(ax=ax1, **kws_figsets)
|
941
950
|
plt.show()
|
942
951
|
|
943
952
|
#! dotplot
|
944
953
|
cutoff_curr = cutoff
|
945
954
|
step=0.05
|
946
955
|
cutoff_stop = 0.5
|
947
|
-
while cutoff_curr <=cutoff_stop:
|
956
|
+
while cutoff_curr <= cutoff_stop:
|
948
957
|
try:
|
949
|
-
print(kws_figsets)
|
950
958
|
if cutoff_curr!=cutoff:
|
951
959
|
plt.clf()
|
952
960
|
ax2 = gp.dotplot(enr.res2d,
|
@@ -957,7 +965,8 @@ def get_enrichr(gene_symbol_list,
|
|
957
965
|
cmap=cmap,
|
958
966
|
cutoff=cutoff_curr,
|
959
967
|
top_term=n_top,
|
960
|
-
|
968
|
+
size=size,
|
969
|
+
figsize=[10, height_])
|
961
970
|
if len(ax2.collections)>=n_top:
|
962
971
|
print(f"cutoff={cutoff_curr} done! ")
|
963
972
|
break
|
@@ -975,6 +984,420 @@ def get_enrichr(gene_symbol_list,
|
|
975
984
|
|
976
985
|
return results_df
|
977
986
|
|
987
|
+
def plot_enrichr(results_df,
|
988
|
+
kind="bar",# 'barplot', 'dotplot'
|
989
|
+
cutoff=0.05,
|
990
|
+
show_ring=False,
|
991
|
+
xticklabels_rot=0,
|
992
|
+
title=None,# 'KEGG'
|
993
|
+
cmap="coolwarm",
|
994
|
+
n_top=10,
|
995
|
+
size=5,
|
996
|
+
ax=None,
|
997
|
+
**kwargs):
|
998
|
+
kws_figsets = {}
|
999
|
+
for k_arg, v_arg in kwargs.items():
|
1000
|
+
if "figset" in k_arg:
|
1001
|
+
kws_figsets = v_arg
|
1002
|
+
kwargs.pop(k_arg, None)
|
1003
|
+
break
|
1004
|
+
if isinstance(cmap,str):
|
1005
|
+
palette = plot.get_color(n_top, cmap=cmap)[::-1]
|
1006
|
+
elif isinstance(cmap,list):
|
1007
|
+
palette=cmap
|
1008
|
+
|
1009
|
+
if n_top<5:
|
1010
|
+
height_=4
|
1011
|
+
elif 5<=n_top<10:
|
1012
|
+
height_=5
|
1013
|
+
elif 5<=n_top<10:
|
1014
|
+
height_=6
|
1015
|
+
elif 10<=n_top<15:
|
1016
|
+
height_=7
|
1017
|
+
elif 15<=n_top<20:
|
1018
|
+
height_=8
|
1019
|
+
elif 20<=n_top<30:
|
1020
|
+
height_=9
|
1021
|
+
else:
|
1022
|
+
height_=int(n_top/3)
|
1023
|
+
if ax is None:
|
1024
|
+
_,ax=plt.subplots(1,1,figsize=[10, height_])
|
1025
|
+
#! barplot
|
1026
|
+
if 'bar' in kind.lower():
|
1027
|
+
ax=plot.plotxy(
|
1028
|
+
data=results_df.head(n_top),
|
1029
|
+
kind="barplot",
|
1030
|
+
x="-log10(Adjusted P-value)",
|
1031
|
+
y="Term",
|
1032
|
+
hue="Term",
|
1033
|
+
palette=palette,
|
1034
|
+
legend=None,
|
1035
|
+
)
|
1036
|
+
plot.figsets(ax=ax, **kws_figsets)
|
1037
|
+
return ax,results_df
|
1038
|
+
#! dotplot
|
1039
|
+
elif 'dot' in kind.lower():
|
1040
|
+
#! dotplot
|
1041
|
+
cutoff_curr = cutoff
|
1042
|
+
step=0.05
|
1043
|
+
cutoff_stop = 0.5
|
1044
|
+
while cutoff_curr <= cutoff_stop:
|
1045
|
+
try:
|
1046
|
+
if cutoff_curr!=cutoff:
|
1047
|
+
plt.clf()
|
1048
|
+
ax = gp.dotplot(results_df,
|
1049
|
+
column="Adjusted P-value",
|
1050
|
+
show_ring=show_ring,
|
1051
|
+
xticklabels_rot=xticklabels_rot,
|
1052
|
+
title=title,
|
1053
|
+
cmap=cmap,
|
1054
|
+
cutoff=cutoff_curr,
|
1055
|
+
top_term=n_top,
|
1056
|
+
size=size,
|
1057
|
+
figsize=[10, height_])
|
1058
|
+
if len(ax.collections)>=n_top:
|
1059
|
+
print(f"cutoff={cutoff_curr} done! ")
|
1060
|
+
break
|
1061
|
+
if cutoff_curr==cutoff_stop:
|
1062
|
+
break
|
1063
|
+
cutoff_curr+=step
|
1064
|
+
except Exception as e:
|
1065
|
+
cutoff_curr+=step
|
1066
|
+
print(f"Warning: trying cutoff={cutoff_curr}, cutoff={cutoff_curr-step} failed: {e} ")
|
1067
|
+
plot.figsets(ax=ax, **kws_figsets)
|
1068
|
+
return ax,results_df
|
1069
|
+
#! barplot with counts
|
1070
|
+
elif 'count' in kind.lower():
|
1071
|
+
# 从overlap中提取出个数
|
1072
|
+
results_df["count"] = results_df["Overlap"].apply(
|
1073
|
+
lambda x: int(x.split("/")[0]) if isinstance(x, str) else x)
|
1074
|
+
df_=results_df.sort_values(by="count", ascending=False)
|
1075
|
+
ax=plot.plotxy(
|
1076
|
+
data=df_.head(n_top),
|
1077
|
+
kind="barplot",
|
1078
|
+
x="count",
|
1079
|
+
y="Term",
|
1080
|
+
hue="Term",
|
1081
|
+
palette=palette,
|
1082
|
+
legend=None,
|
1083
|
+
ax=ax
|
1084
|
+
)
|
1085
|
+
|
1086
|
+
plot.figsets(ax=ax, **kws_figsets)
|
1087
|
+
return ax,df_
|
1088
|
+
|
1089
|
+
def plot_bp_cc_mf(
|
1090
|
+
deg_gene_list,
|
1091
|
+
gene_sets=[
|
1092
|
+
"GO_Biological_Process_2023",
|
1093
|
+
"GO_Cellular_Component_2023",
|
1094
|
+
"GO_Molecular_Function_2023",
|
1095
|
+
],
|
1096
|
+
species="human",
|
1097
|
+
n_top=10,
|
1098
|
+
plot_=True,
|
1099
|
+
ax=None,
|
1100
|
+
palette=plot.get_color(3),
|
1101
|
+
** kwargs,
|
1102
|
+
):
|
1103
|
+
|
1104
|
+
def res_enrichr_2_count(res_enrichr, n_top=10):
|
1105
|
+
"""把enrich resulst 提取出count,并排序"""
|
1106
|
+
res_enrichr["Count"] = res_enrichr["Overlap"].apply(
|
1107
|
+
lambda x: int(x.split("/")[0]) if isinstance(x, str) else x
|
1108
|
+
)
|
1109
|
+
res_enrichr.sort_values(by="Count", ascending=False, inplace=True)
|
1110
|
+
|
1111
|
+
return res_enrichr.head(n_top)#[["Term", "Count"]]
|
1112
|
+
|
1113
|
+
res_enrichr_BP = get_enrichr(
|
1114
|
+
deg_gene_list, gene_sets[0], species=species, plot_=False
|
1115
|
+
)
|
1116
|
+
res_enrichr_CC = get_enrichr(
|
1117
|
+
deg_gene_list, gene_sets[1], species=species, plot_=False
|
1118
|
+
)
|
1119
|
+
res_enrichr_MF = get_enrichr(
|
1120
|
+
deg_gene_list, gene_sets[2], species=species, plot_=False
|
1121
|
+
)
|
1122
|
+
|
1123
|
+
df_BP = res_enrichr_2_count(res_enrichr_BP, n_top=n_top)
|
1124
|
+
df_BP["Ontology"] = ["BP"] * n_top
|
1125
|
+
|
1126
|
+
df_CC = res_enrichr_2_count(res_enrichr_CC, n_top=n_top)
|
1127
|
+
df_CC["Ontology"] = ["CC"] * n_top
|
1128
|
+
|
1129
|
+
df_MF = res_enrichr_2_count(res_enrichr_MF, n_top=n_top)
|
1130
|
+
df_MF["Ontology"] = ["MF"] * n_top
|
1131
|
+
|
1132
|
+
# 合并
|
1133
|
+
df2plot = pd.concat([df_BP, df_CC, df_MF])
|
1134
|
+
n_top=n_top*3
|
1135
|
+
if n_top < 5:
|
1136
|
+
height_ = 4
|
1137
|
+
elif 5 <= n_top < 10:
|
1138
|
+
height_ = 5
|
1139
|
+
elif 10 <= n_top < 15:
|
1140
|
+
height_ = 6
|
1141
|
+
elif 15 <= n_top < 20:
|
1142
|
+
height_ = 7
|
1143
|
+
elif 20 <= n_top < 30:
|
1144
|
+
height_ = 8
|
1145
|
+
elif 30 <= n_top < 40:
|
1146
|
+
height_ = int(n_top / 4)
|
1147
|
+
else:
|
1148
|
+
height_ = int(n_top / 5)
|
1149
|
+
if ax is None:
|
1150
|
+
_,ax=plt.subplots(1,1,figsize=[10, height_])
|
1151
|
+
# 作图
|
1152
|
+
if df2plot["Term"].tolist()[0].endswith(")"):
|
1153
|
+
df2plot["Term"] = df2plot["Term"].apply(lambda x: x.split("(")[0][:-1])
|
1154
|
+
if plot_:
|
1155
|
+
ax = plot.plotxy(
|
1156
|
+
data=df2plot,
|
1157
|
+
x="Count",
|
1158
|
+
y="Term",
|
1159
|
+
hue="Ontology",
|
1160
|
+
kind="bar",
|
1161
|
+
palette=palette,
|
1162
|
+
ax=ax,
|
1163
|
+
**kwargs
|
1164
|
+
)
|
1165
|
+
return ax, df2plot
|
1166
|
+
|
1167
|
+
def get_library_name():
|
1168
|
+
return gp.get_library_name()
|
1169
|
+
|
1170
|
+
def get_gsva(
|
1171
|
+
data_gene_samples: pd.DataFrame, # index(gene),columns(samples)
|
1172
|
+
gene_sets: str,
|
1173
|
+
species:str="Human",
|
1174
|
+
dir_save:str="./",
|
1175
|
+
plot_:bool=False,
|
1176
|
+
n_top:int=30,
|
1177
|
+
check_shared:bool=True,
|
1178
|
+
cmap="coolwarm",
|
1179
|
+
min_size=1,
|
1180
|
+
max_size=1000,
|
1181
|
+
kcdf="Gaussian",# 'Gaussian' for continuous data
|
1182
|
+
method='gsva',
|
1183
|
+
seed=1,
|
1184
|
+
**kwargs,
|
1185
|
+
):
|
1186
|
+
kws_figsets = {}
|
1187
|
+
for k_arg, v_arg in kwargs.items():
|
1188
|
+
if "figset" in k_arg:
|
1189
|
+
kws_figsets = v_arg
|
1190
|
+
kwargs.pop(k_arg, None)
|
1191
|
+
break
|
1192
|
+
species_org = species
|
1193
|
+
# organism (str) – Select one from { ‘Human’, ‘Mouse’, ‘Yeast’, ‘Fly’, ‘Fish’, ‘Worm’ }
|
1194
|
+
organisms = ["Human", "Mouse", "Yeast", "Fly", "Fish", "Worm"]
|
1195
|
+
species = ips.strcmp(species, organisms)[0]
|
1196
|
+
if species_org.lower() != species.lower():
|
1197
|
+
print(f"species was corrected to {species}, becasue only support {organisms}")
|
1198
|
+
if os.path.isfile(gene_sets):
|
1199
|
+
gene_sets_name = os.path.basename(gene_sets)
|
1200
|
+
gene_sets = ips.fload(gene_sets)
|
1201
|
+
else:
|
1202
|
+
lib_support_names = gp.get_library_name()
|
1203
|
+
# correct input gene_set name
|
1204
|
+
gene_sets_name = ips.strcmp(gene_sets, lib_support_names)[0]
|
1205
|
+
# download it
|
1206
|
+
gene_sets = gp.get_library(name=gene_sets_name, organism=species)
|
1207
|
+
print(f"gene_sets get ready: {gene_sets_name}")
|
1208
|
+
|
1209
|
+
# gene symbols are uppercase
|
1210
|
+
gene_symbol_list = [str(i).upper() for i in data_gene_samples.index]
|
1211
|
+
data_gene_samples.index=gene_symbol_list
|
1212
|
+
# display(data_gene_samples.head(3))
|
1213
|
+
# # check how shared genes
|
1214
|
+
if check_shared:
|
1215
|
+
ips.shared(
|
1216
|
+
ips.flatten(gene_symbol_list, verbose=False),
|
1217
|
+
ips.flatten(gene_sets, verbose=False),
|
1218
|
+
verbose=False
|
1219
|
+
)
|
1220
|
+
gsva_results = gp.gsva(
|
1221
|
+
data=data_gene_samples, # matrix should have genes as rows and samples as columns
|
1222
|
+
gene_sets=gene_sets,
|
1223
|
+
outdir=None,
|
1224
|
+
kcdf=kcdf, # 'Gaussian' for continuous data
|
1225
|
+
min_size=min_size,
|
1226
|
+
method=method,
|
1227
|
+
max_size=max_size,
|
1228
|
+
verbose=True,
|
1229
|
+
seed=seed,
|
1230
|
+
# no_plot=False,
|
1231
|
+
)
|
1232
|
+
gsva_res = gsva_results.res2d.copy()
|
1233
|
+
gsva_res["ES_abs"] = gsva_res["ES"].apply(np.abs)
|
1234
|
+
gsva_res = gsva_res.sort_values(by="ES_abs", ascending=False)
|
1235
|
+
gsva_res = (
|
1236
|
+
gsva_res.drop_duplicates(subset="Term").drop(columns="ES_abs")
|
1237
|
+
# .iloc[:80, :]
|
1238
|
+
.reset_index(drop=True)
|
1239
|
+
)
|
1240
|
+
gsva_res = gsva_res.sort_values(by="ES", ascending=False)
|
1241
|
+
if plot_:
|
1242
|
+
if gsva_res.shape[0]>=2*n_top:
|
1243
|
+
gsva_res_plot=pd.concat([gsva_res.head(n_top),gsva_res.tail(n_top)])
|
1244
|
+
else:
|
1245
|
+
gsva_res_plot = gsva_res
|
1246
|
+
if isinstance(cmap,str):
|
1247
|
+
palette = plot.get_color(n_top*2, cmap=cmap)[::-1]
|
1248
|
+
elif isinstance(cmap,list):
|
1249
|
+
if len(cmap)==2:
|
1250
|
+
palette = [cmap[0]]*n_top+[cmap[1]]*n_top
|
1251
|
+
else:
|
1252
|
+
palette=cmap
|
1253
|
+
# ! barplot
|
1254
|
+
if n_top < 5:
|
1255
|
+
height_ = 3
|
1256
|
+
elif 5 <= n_top < 10:
|
1257
|
+
height_ = 4
|
1258
|
+
elif 10 <= n_top < 15:
|
1259
|
+
height_ = 5
|
1260
|
+
elif 15 <= n_top < 20:
|
1261
|
+
height_ = 6
|
1262
|
+
elif 20 <= n_top < 30:
|
1263
|
+
height_ = 7
|
1264
|
+
elif 30 <= n_top < 40:
|
1265
|
+
height_ = int(n_top / 3.5)
|
1266
|
+
else:
|
1267
|
+
height_ = int(n_top / 3)
|
1268
|
+
plt.figure(figsize=[10, height_])
|
1269
|
+
ax2 = plot.plotxy(
|
1270
|
+
data=gsva_res_plot,
|
1271
|
+
x="ES",
|
1272
|
+
y="Term",
|
1273
|
+
hue="Term",
|
1274
|
+
palette=palette,
|
1275
|
+
kind=["bar"],
|
1276
|
+
figsets=dict(yticklabel=[], ticksloc="b", boxloc="b", ylabel=None),
|
1277
|
+
)
|
1278
|
+
# 改变labels的位置
|
1279
|
+
for i, bar in enumerate(ax2.patches):
|
1280
|
+
term = gsva_res_plot.iloc[i]["Term"]
|
1281
|
+
es_value = gsva_res_plot.iloc[i]["ES"]
|
1282
|
+
|
1283
|
+
# Positive ES values: Align y-labels to the left
|
1284
|
+
if es_value > 0:
|
1285
|
+
ax2.annotate(
|
1286
|
+
term,
|
1287
|
+
xy=(0, bar.get_y() + bar.get_height() / 2),
|
1288
|
+
xytext=(-5, 0), # Move to the left
|
1289
|
+
textcoords="offset points",
|
1290
|
+
ha="right",
|
1291
|
+
va="center", # Align labels to the right
|
1292
|
+
fontsize=10,
|
1293
|
+
color="black",
|
1294
|
+
)
|
1295
|
+
# Negative ES values: Align y-labels to the right
|
1296
|
+
else:
|
1297
|
+
ax2.annotate(
|
1298
|
+
term,
|
1299
|
+
xy=(0, bar.get_y() + bar.get_height() / 2),
|
1300
|
+
xytext=(5, 0), # Move to the right
|
1301
|
+
textcoords="offset points",
|
1302
|
+
ha="left",
|
1303
|
+
va="center", # Align labels to the left
|
1304
|
+
fontsize=10,
|
1305
|
+
color="black",
|
1306
|
+
)
|
1307
|
+
plot.figsets(ax=ax2, **kws_figsets)
|
1308
|
+
if dir_save:
|
1309
|
+
ips.figsave(dir_save + f"GSVA_{gene_sets_name}.pdf")
|
1310
|
+
plt.show()
|
1311
|
+
return gsva_res.reset_index(drop=True)
|
1312
|
+
|
1313
|
+
def plot_gsva(gsva_res, # output from bio.get_gsva()
|
1314
|
+
n_top=10,
|
1315
|
+
ax=None,
|
1316
|
+
x="ES",
|
1317
|
+
y="Term",
|
1318
|
+
hue="Term",
|
1319
|
+
cmap="coolwarm",
|
1320
|
+
**kwargs
|
1321
|
+
):
|
1322
|
+
kws_figsets = {}
|
1323
|
+
for k_arg, v_arg in kwargs.items():
|
1324
|
+
if "figset" in k_arg:
|
1325
|
+
kws_figsets = v_arg
|
1326
|
+
kwargs.pop(k_arg, None)
|
1327
|
+
break
|
1328
|
+
# ! barplot
|
1329
|
+
if n_top < 5:
|
1330
|
+
height_ = 4
|
1331
|
+
elif 5 <= n_top < 10:
|
1332
|
+
height_ = 5
|
1333
|
+
elif 10 <= n_top < 15:
|
1334
|
+
height_ = 6
|
1335
|
+
elif 15 <= n_top < 20:
|
1336
|
+
height_ = 7
|
1337
|
+
elif 20 <= n_top < 30:
|
1338
|
+
height_ = 8
|
1339
|
+
elif 30 <= n_top < 40:
|
1340
|
+
height_ = int(n_top / 3.5)
|
1341
|
+
else:
|
1342
|
+
height_ = int(n_top / 3)
|
1343
|
+
if ax is None:
|
1344
|
+
_,ax=plt.subplots(1,1,figsize=[10, height_])
|
1345
|
+
gsva_res = gsva_res.sort_values(by=x, ascending=False)
|
1346
|
+
|
1347
|
+
if gsva_res.shape[0]>=2*n_top:
|
1348
|
+
gsva_res_plot=pd.concat([gsva_res.head(n_top),gsva_res.tail(n_top)])
|
1349
|
+
else:
|
1350
|
+
gsva_res_plot = gsva_res
|
1351
|
+
if isinstance(cmap,str):
|
1352
|
+
palette = plot.get_color(n_top*2, cmap=cmap)[::-1]
|
1353
|
+
elif isinstance(cmap,list):
|
1354
|
+
if len(cmap)==2:
|
1355
|
+
palette = [cmap[0]]*n_top+[cmap[1]]*n_top
|
1356
|
+
else:
|
1357
|
+
palette=cmap
|
1358
|
+
|
1359
|
+
ax = plot.plotxy(
|
1360
|
+
ax=ax,
|
1361
|
+
data=gsva_res_plot,
|
1362
|
+
x=x,
|
1363
|
+
y=y,
|
1364
|
+
hue=hue,
|
1365
|
+
palette=palette,
|
1366
|
+
kind=["bar"],
|
1367
|
+
figsets=dict(yticklabel=[], ticksloc="b", boxloc="b", ylabel=None),
|
1368
|
+
)
|
1369
|
+
# 改变labels的位置
|
1370
|
+
for i, bar in enumerate(ax.patches):
|
1371
|
+
term = gsva_res_plot.iloc[i]["Term"]
|
1372
|
+
es_value = gsva_res_plot.iloc[i]["ES"]
|
1373
|
+
|
1374
|
+
# Positive ES values: Align y-labels to the left
|
1375
|
+
if es_value > 0:
|
1376
|
+
ax.annotate(
|
1377
|
+
term,
|
1378
|
+
xy=(0, bar.get_y() + bar.get_height() / 2),
|
1379
|
+
xytext=(-5, 0), # Move to the left
|
1380
|
+
textcoords="offset points",
|
1381
|
+
ha="right",
|
1382
|
+
va="center", # Align labels to the right
|
1383
|
+
fontsize=10,
|
1384
|
+
color="black",
|
1385
|
+
)
|
1386
|
+
# Negative ES values: Align y-labels to the right
|
1387
|
+
else:
|
1388
|
+
ax.annotate(
|
1389
|
+
term,
|
1390
|
+
xy=(0, bar.get_y() + bar.get_height() / 2),
|
1391
|
+
xytext=(5, 0), # Move to the right
|
1392
|
+
textcoords="offset points",
|
1393
|
+
ha="left",
|
1394
|
+
va="center", # Align labels to the left
|
1395
|
+
fontsize=10,
|
1396
|
+
color="black",
|
1397
|
+
)
|
1398
|
+
plot.figsets(ax=ax, **kws_figsets)
|
1399
|
+
return ax
|
1400
|
+
|
978
1401
|
|
979
1402
|
#! https://string-db.org/help/api/
|
980
1403
|
|
@@ -1296,7 +1719,12 @@ def plot_ppi(
|
|
1296
1719
|
)
|
1297
1720
|
plot.figsets(ax=ax,**kws_figsets)
|
1298
1721
|
ax.axis("off")
|
1299
|
-
|
1722
|
+
if dir_save:
|
1723
|
+
if not os.path.basename(dir_save):
|
1724
|
+
dir_save="_.html"
|
1725
|
+
net.write_html(dir_save)
|
1726
|
+
nx.write_graphml(G, dir_save.replace(".html",".graphml")) # Export to GraphML
|
1727
|
+
print(f"could be edited in Cytoscape \n{dir_save.replace(".html",".graphml")}")
|
1300
1728
|
return G,ax
|
1301
1729
|
|
1302
1730
|
|
py2ls/ips.py
CHANGED
@@ -554,14 +554,14 @@ def shared(*args, strict=True, n_shared=2, verbose=True):
|
|
554
554
|
# Get elements that appear in at least n_shared lists
|
555
555
|
shared_elements = [item for item, count in element_count.items() if count >= n_shared]
|
556
556
|
|
557
|
-
shared_elements = flatten(shared_elements)
|
557
|
+
shared_elements = flatten(shared_elements, verbose=verbose)
|
558
558
|
if verbose:
|
559
559
|
elements2show = shared_elements if len(shared_elements)<10 else shared_elements[:5]
|
560
560
|
print(f"{' '*2}{len(shared_elements)} elements shared: {' '*2}{elements2show}")
|
561
561
|
print("********* checking shared elements *********")
|
562
562
|
return shared_elements
|
563
563
|
|
564
|
-
def flatten(nested: Any, unique_list=True,verbose=True):
|
564
|
+
def flatten(nested: Any, unique_list=True, verbose=True):
|
565
565
|
"""
|
566
566
|
Recursively flattens a nested structure (lists, tuples, dictionaries, sets) into a single list.
|
567
567
|
Parameters:
|
@@ -2840,7 +2840,7 @@ def listdir(
|
|
2840
2840
|
# print(result)
|
2841
2841
|
# df=listdir("/", contains='sss',sort_by='name',ascending=False)
|
2842
2842
|
# print(df.fname.to_list(),"\n",df.fpath.to_list())
|
2843
|
-
def
|
2843
|
+
def listfunc(lib_name, opt="call"):
|
2844
2844
|
if opt == "call":
|
2845
2845
|
funcs = [func for func in dir(lib_name) if callable(getattr(lib_name, func))]
|
2846
2846
|
else:
|
py2ls/plot.py
CHANGED
@@ -2220,6 +2220,9 @@ def figsets(*args, **kwargs):
|
|
2220
2220
|
legend = ax.get_legend()
|
2221
2221
|
if legend is not None:
|
2222
2222
|
legend.remove()
|
2223
|
+
if any(['colorbar' in key.lower(),'cbar' in key.lower()]) and "loc" in key.lower():
|
2224
|
+
cbar = ax.collections[0].colorbar # Access the colorbar from the plot
|
2225
|
+
cbar.ax.set_position(value) # [left, bottom, width, height] [0.475, 0.15, 0.04, 0.25]
|
2223
2226
|
|
2224
2227
|
for arg in args:
|
2225
2228
|
if isinstance(arg, matplotlib.axes._axes.Axes):
|
@@ -2708,15 +2711,45 @@ def adjust_spines(ax=None, spines=["left", "bottom"], distance=2):
|
|
2708
2711
|
# And then plot the data:
|
2709
2712
|
|
2710
2713
|
|
2711
|
-
def add_colorbar(im, width=None, pad=None, **kwargs):
|
2712
|
-
|
2713
|
-
|
2714
|
-
|
2715
|
-
|
2716
|
-
|
2717
|
-
|
2718
|
-
|
2714
|
+
# def add_colorbar(im, width=None, pad=None, **kwargs):
|
2715
|
+
# # usage: add_colorbar(im, width=0.01, pad=0.005, label="PSD (dB)", shrink=0.8)
|
2716
|
+
# l, b, w, h = im.axes.get_position().bounds # get boundaries
|
2717
|
+
# width = width or 0.1 * w # get width of the colorbar
|
2718
|
+
# pad = pad or width # get pad between im and cbar
|
2719
|
+
# fig = im.axes.figure # get figure of image
|
2720
|
+
# cax = fig.add_axes([l + w + pad, b, width, h]) # define cbar Axes
|
2721
|
+
# return fig.colorbar(im, cax=cax, **kwargs) # draw cbar
|
2722
|
+
|
2723
|
+
def add_colorbar(im,
|
2724
|
+
cmap="viridis",
|
2725
|
+
vmin=-1,
|
2726
|
+
vmax=1,
|
2727
|
+
orientation='vertical',
|
2728
|
+
width_ratio=0.05,
|
2729
|
+
pad_ratio=0.02,
|
2730
|
+
shrink=1.0,
|
2731
|
+
**kwargs):
|
2732
|
+
import matplotlib as mpl
|
2733
|
+
if all([cmap, vmin, vmax]):
|
2734
|
+
norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)
|
2735
|
+
else:
|
2736
|
+
norm=False
|
2737
|
+
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
|
2738
|
+
sm.set_array([])
|
2739
|
+
l, b, w, h = im.axes.get_position().bounds # position: left, bottom, width, height
|
2740
|
+
if orientation == 'vertical':
|
2741
|
+
width = width_ratio * w
|
2742
|
+
pad = pad_ratio * w
|
2743
|
+
cax = im.figure.add_axes([l + w + pad, b, width, h * shrink]) # Right of the image
|
2744
|
+
else:
|
2745
|
+
height = width_ratio * h
|
2746
|
+
pad = pad_ratio * h
|
2747
|
+
cax = im.figure.add_axes([l, b - height - pad, w * shrink, height]) # Below the image
|
2748
|
+
cbar=im.figure.colorbar(sm, cax=cax, orientation=orientation, **kwargs)
|
2749
|
+
return cbar
|
2719
2750
|
|
2751
|
+
# Usage:
|
2752
|
+
# add_colorbar(im, width_ratio=0.03, pad_ratio=0.01, orientation='horizontal', label="PSD (dB)")
|
2720
2753
|
|
2721
2754
|
def generate_xticks_with_gap(x_len, hue_len):
|
2722
2755
|
"""
|
@@ -3129,7 +3162,7 @@ def plotxy(
|
|
3129
3162
|
kws_count = kwargs.pop("kws_count", kwargs)
|
3130
3163
|
if not kws_count.get("hue",None):
|
3131
3164
|
kws_count.pop("palette",None)
|
3132
|
-
ax = sns.countplot(data=data, x=x, ax=ax, **kws_count)
|
3165
|
+
ax = sns.countplot(data=data, x=x,y=y, ax=ax, **kws_count)
|
3133
3166
|
elif k == "regplot":
|
3134
3167
|
kws_reg = kwargs.pop("kws_reg", kwargs)
|
3135
3168
|
ax = sns.regplot(data=data, x=x, y=y, ax=ax, **kws_reg)
|
@@ -173,7 +173,7 @@ py2ls/LICENSE,sha256=UOZ1F5fFDe3XXvG4oNnkL1-Ecun7zpHzRxjp-XsMeAo,11324
|
|
173
173
|
py2ls/README.md,sha256=CwvJWAnSXnCnrVHlnEbrxxi6MbjbE_MT6DH2D53S818,11572
|
174
174
|
py2ls/__init__.py,sha256=Nn8jTIvySX7t7DMJ8VNRVctTStgXGjHldOIdZ35PdW8,165
|
175
175
|
py2ls/batman.py,sha256=E7gYofbDzN7S5oCmO_dd5Z1bxxhoYMJSD6s-VaF388E,11398
|
176
|
-
py2ls/bio.py,sha256=
|
176
|
+
py2ls/bio.py,sha256=7q-zIxGU76g9AABUcrCLW2GrowTw-ljN_8zKbjdi7p0,67677
|
177
177
|
py2ls/brain_atlas.py,sha256=w1o5EelRjq89zuFJUNSz4Da8HnTCwAwDAZ4NU4a-bAY,5486
|
178
178
|
py2ls/chat.py,sha256=Yr22GoIvoWhpV3m4fdwV_I0Mn77La346_ymSinR-ORA,3793
|
179
179
|
py2ls/correlators.py,sha256=RbOaJIPLCHJtUm5SFi_4dCJ7VFUPWR0PErfK3K26ad4,18243
|
@@ -214,16 +214,16 @@ py2ls/export_requirements.py,sha256=x2WgUF0jYKz9GfA1MVKN-MdsM-oQ8yUeC6Ua8oCymio,
|
|
214
214
|
py2ls/fetch_update.py,sha256=9LXj661GpCEFII2wx_99aINYctDiHni6DOruDs_fdt8,4752
|
215
215
|
py2ls/freqanalysis.py,sha256=F4218VSPbgL5tnngh6xNCYuNnfR-F_QjECUUxrPYZss,32594
|
216
216
|
py2ls/ich2ls.py,sha256=3E9R8oVpyYZXH5PiIQgT3CN5NxLe4Dwtm2LwaeacE6I,21381
|
217
|
-
py2ls/ips.py,sha256=
|
217
|
+
py2ls/ips.py,sha256=4CmSK5Ye4eHPSkTbrbS9KZ20mz-GA7xw2vEa1o1fI4k,227789
|
218
218
|
py2ls/ml2ls.py,sha256=XSe2-sLNzUVSvVRkeRGfhrB_q8C49SDK1sekYC1Bats,50277
|
219
219
|
py2ls/netfinder.py,sha256=RJFr80tGEJiuwEx99IBOhI5-ZuXnPdWnGUYpF7XCEwI,56426
|
220
220
|
py2ls/ocr.py,sha256=5lhUbJufIKRSOL6wAWVLEo8TqMYSjoI_Q-IO-_4u3DE,31419
|
221
|
-
py2ls/plot.py,sha256=
|
221
|
+
py2ls/plot.py,sha256=h-pcdlQN7Aqqgxw52Rsq5Wvu8LzgiYwO1F6CBvKpTkg,145989
|
222
222
|
py2ls/setuptools-70.1.0-py3-none-any.whl,sha256=2bi3cUVal8ip86s0SOvgspteEF8SKLukECi-EWmFomc,882588
|
223
223
|
py2ls/sleep_events_detectors.py,sha256=bQA3HJqv5qnYKJJEIhCyhlDtkXQfIzqksnD0YRXso68,52145
|
224
224
|
py2ls/stats.py,sha256=DMoJd8Z5YV9T1wB-4P52F5K5scfVK55DT8UP4Twcebo,38627
|
225
225
|
py2ls/translator.py,sha256=zBeq4pYZeroqw3DT-5g7uHfVqKd-EQptT6LJ-Adi8JY,34244
|
226
226
|
py2ls/wb_detector.py,sha256=7y6TmBUj9exCZeIgBAJ_9hwuhkDh1x_-yg4dvNY1_GQ,6284
|
227
|
-
py2ls-0.2.4.
|
228
|
-
py2ls-0.2.4.
|
229
|
-
py2ls-0.2.4.
|
227
|
+
py2ls-0.2.4.5.dist-info/METADATA,sha256=z1aLD2Jcfn3klBZIptJYjHcdwMRZ4hOe9GdjsmI8bBU,20038
|
228
|
+
py2ls-0.2.4.5.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
229
|
+
py2ls-0.2.4.5.dist-info/RECORD,,
|
File without changes
|