From 9f0fc74012b34ff38dfd62edf219c1034f9a48a8 Mon Sep 17 00:00:00 2001 From: Qing Date: Tue, 3 Dec 2024 22:52:34 -0500 Subject: [PATCH 1/3] modified: metax/taxafunc_ploter/basic_plot.py --- metax/taxafunc_ploter/basic_plot.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/metax/taxafunc_ploter/basic_plot.py b/metax/taxafunc_ploter/basic_plot.py index 86ba8ff..8bc4648 100644 --- a/metax/taxafunc_ploter/basic_plot.py +++ b/metax/taxafunc_ploter/basic_plot.py @@ -381,6 +381,7 @@ def plot_corr_sns( theme: str = None, cmap: str = "Auto", rename_sample: bool = False, + corr_method: str = "pearson", ): dft= df.copy() if rename_sample: @@ -394,7 +395,12 @@ def plot_corr_sns( cmap = cmap color_list = self.assign_colors(group_list) - corr = dft.corr() + + # check if the correlation method is valid + if corr_method not in ['pearson', 'spearman', 'kendall']: + raise ValueError(f"Invalid correlation method: {corr_method}. Please choose from 'pearson', 'spearman', or 'kendall'.") + + corr = dft.corr(method=corr_method) # mask = np.triu(np.ones_like(corr, dtype=bool)) try: @@ -430,7 +436,8 @@ def plot_corr_sns( fig.ax_col_dendrogram.set_title(f'Correlation of {title_name}', fontsize=font_size+2, fontweight='bold') cbar = fig.ax_heatmap.collections[0].colorbar - cbar.set_label('Intensity', rotation=90, labelpad=1) + cbar.set_label('correlation', + rotation=90, labelpad=1) cbar.ax.yaxis.set_ticks_position('left') cbar.ax.yaxis.set_label_position('left') plt.subplots_adjust(left=0.03, bottom=0.095, right=0.5, top=0.96, wspace=0.01, hspace=0.01) From e5cb94163931ef25a2307962a59f71b59dff4f56 Mon Sep 17 00:00:00 2001 From: Qing Date: Thu, 5 Dec 2024 13:41:37 -0500 Subject: [PATCH 2/3] - Change: Optimized the correlation heatmap plot. --- Docs/ChangeLog.md | 5 ++ metax/gui/main_gui.py | 23 +++-- metax/gui/metax_gui/main_window.ui | 90 ++++++++++++++++--- metax/gui/metax_gui/ui_main_window.py | 76 ++++++++++++---- .../analyzer_utils/basic_stats.py | 8 +- metax/taxafunc_ploter/basic_plot.py | 75 ++++++++++------ metax/taxafunc_ploter/get_distinct_colors.py | 21 +++-- metax/utils/version.py | 2 +- pyproject.toml | 2 +- 9 files changed, 229 insertions(+), 73 deletions(-) diff --git a/Docs/ChangeLog.md b/Docs/ChangeLog.md index 452106c..f43b4e7 100644 --- a/Docs/ChangeLog.md +++ b/Docs/ChangeLog.md @@ -1,3 +1,8 @@ +# Version: 1.119.6 +## Date: 2024-12-5 +### Changes: +- Change: Optimized the correlation heatmap plot. + # Version: 1.119.5 ## Date: 2024-12-3 ### Changes: diff --git a/metax/gui/main_gui.py b/metax/gui/main_gui.py index 0c473fc..46ca921 100644 --- a/metax/gui/main_gui.py +++ b/metax/gui/main_gui.py @@ -365,6 +365,7 @@ def __init__(self, MainWindow): self.comboBox_method_of_protein_inference.currentIndexChanged.connect(self.update_method_of_protein_inference) self.comboBox_3dbar_sub_meta.currentIndexChanged.connect(self.change_event_comboBox_3dbar_sub_meta) self.comboBox_tflink_sub_meta.currentIndexChanged.connect(self.change_event_comboBox_tflink_sub_meta) + self.comboBox_sub_meta_pca.currentIndexChanged.connect(self.change_event_comboBox_sub_meta_pca) ## Basic Stat self.pushButton_plot_pca_sns.clicked.connect(lambda: self.plot_basic_info_sns('pca')) @@ -889,6 +890,13 @@ def change_event_comboBox_3dbar_sub_meta(self): # self.comboBox_3dbar_sub_meta.setEnabled(False) # else: # self.comboBox_3dbar_sub_meta.setEnabled(True) + + def change_event_comboBox_sub_meta_pca(self): + if self.comboBox_sub_meta_pca.currentText() != 'None': + self.checkBox_corr_plot_samples.setEnabled(False) + else: + self.checkBox_corr_plot_samples.setEnabled(True) + def change_event_comboBox_tflink_sub_meta(self): # when the sub_meta comboBox is not None, the mean plot is not available if self.comboBox_tflink_sub_meta.currentText() != 'None': @@ -4509,6 +4517,8 @@ def get_title_by_table_name(self, table_name): cluster = self.checkBox_corr_cluster.isChecked() show_all_labels = (self.checkBox_corr_show_all_labels_x.isChecked(), self.checkBox_corr_show_all_labels_y.isChecked()) cmap = self.comboBox_basic_corr_cmap.currentText() + corr_method = self.comboBox_basic_corr_method.currentText() + plot_mean = False if self.checkBox_corr_plot_samples.isChecked() else True # checek if the dataframe has at least 2 rows and 2 columns if df.shape[0] < 2 or df.shape[1] < 2: QMessageBox.warning(self.MainWindow, 'Warning', 'The number of rows or columns is less than 2, correlation cannot be plotted!') @@ -4520,7 +4530,8 @@ def get_title_by_table_name(self, table_name): BasicPlot(self.tfa, **self.heatmap_params_dict).plot_corr_sns(df=df, title_name=title_name, cluster= cluster, width=width, height=height, font_size=font_size, show_all_labels=show_all_labels, theme=theme, cmap=cmap, - rename_sample = rename_sample) + rename_sample = rename_sample, corr_method=corr_method, + plot_mean = plot_mean, sub_meta = sub_meta) elif method == 'alpha_div': self.show_message('Alpha diversity is running, please wait...') @@ -5355,9 +5366,11 @@ def plot_co_expr(self, plot_type = 'network'): self.show_message('Co-expression heatmap is plotting...\n\n It may take a long time! Please wait...') try: print(f'Calculate correlation with {corr_method} method...') - df = self.tfa.BasicStats.get_correlation(df_type = df_type, sample_list = sample_list, focus_list = focus_list, plot_list_only = plot_list_only, rename_taxa = rename_taxa, method=corr_method) + df = self.tfa.BasicStats.get_correlation(df_type = df_type, sample_list = sample_list, + focus_list = focus_list, plot_list_only = plot_list_only, + rename_taxa = rename_taxa, method=corr_method) # save df to table_dict - self.update_table_dict(f'expression correlation heatmap({df_type})', df) + self.update_table_dict(f'{corr_method} correlation heatmap({df_type})', df) show_all_labels = ( self.checkBox_corr_hetatmap_show_all_labels_x.isChecked(), @@ -5365,12 +5378,12 @@ def plot_co_expr(self, plot_type = 'network'): ) cmap = self.comboBox_corr_hetatmap_cmap.currentText() BasicPlot(self.tfa, **self.heatmap_params_dict).plot_items_corr_heatmap(df=df, - title_name=f'Expression Correlation Heatmap({df_type})', + title_name=f'{corr_method.capitalize()} Correlation of {df_type}', cluster=True, cmap=cmap, width=width, height=height, font_size=font_size, - show_all_labels=show_all_labels + show_all_labels=show_all_labels, ) except Exception: diff --git a/metax/gui/metax_gui/main_window.ui b/metax/gui/metax_gui/main_window.ui index 5ddd1fe..100fcdc 100644 --- a/metax/gui/metax_gui/main_window.ui +++ b/metax/gui/metax_gui/main_window.ui @@ -46,7 +46,7 @@ Qt::LeftToRight - 5 + 3 false @@ -1447,7 +1447,7 @@ QTabWidget::Triangular - 1 + 0 @@ -1830,7 +1830,7 @@ 0 0 - 799 + 885 239 @@ -2406,6 +2406,12 @@ + + + 0 + 0 + + Show All Labels @@ -2413,6 +2419,12 @@ + + + 0 + 0 + + X @@ -2420,11 +2432,33 @@ + + + 0 + 0 + + Y + + + + + 0 + 0 + + + + Theme + + + + + + @@ -2471,6 +2505,13 @@ + + + + Plot Samples + + + @@ -2488,20 +2529,42 @@ - + - + 0 0 - Theme + Method - + + + + 0 + 0 + + + + + pearson + + + + + spearman + + + + + kendall + + + @@ -6532,7 +6595,7 @@ QTabWidget::Triangular - 1 + 0 @@ -6840,6 +6903,11 @@ spearman + + + kendall + + @@ -7131,7 +7199,7 @@ false - Plot Co-Expression Heatmap + Plot Correlation Heatmap @@ -8350,8 +8418,8 @@ 0 0 - 885 - 225 + 775 + 102 diff --git a/metax/gui/metax_gui/ui_main_window.py b/metax/gui/metax_gui/ui_main_window.py index 9104649..c770287 100644 --- a/metax/gui/metax_gui/ui_main_window.py +++ b/metax/gui/metax_gui/ui_main_window.py @@ -904,7 +904,7 @@ def setupUi(self, metaX_main): self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() - self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 799, 239)) + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 885, 239)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.gridLayout_34 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents) self.gridLayout_34.setObjectName("gridLayout_34") @@ -1190,14 +1190,40 @@ def setupUi(self, metaX_main): self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.label_129 = QtWidgets.QLabel(self.scrollAreaWidgetContents) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_129.sizePolicy().hasHeightForWidth()) + self.label_129.setSizePolicy(sizePolicy) self.label_129.setObjectName("label_129") self.horizontalLayout_5.addWidget(self.label_129) self.checkBox_corr_show_all_labels_x = QtWidgets.QCheckBox(self.scrollAreaWidgetContents) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.checkBox_corr_show_all_labels_x.sizePolicy().hasHeightForWidth()) + self.checkBox_corr_show_all_labels_x.setSizePolicy(sizePolicy) self.checkBox_corr_show_all_labels_x.setObjectName("checkBox_corr_show_all_labels_x") self.horizontalLayout_5.addWidget(self.checkBox_corr_show_all_labels_x) self.checkBox_corr_show_all_labels_y = QtWidgets.QCheckBox(self.scrollAreaWidgetContents) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.checkBox_corr_show_all_labels_y.sizePolicy().hasHeightForWidth()) + self.checkBox_corr_show_all_labels_y.setSizePolicy(sizePolicy) self.checkBox_corr_show_all_labels_y.setObjectName("checkBox_corr_show_all_labels_y") self.horizontalLayout_5.addWidget(self.checkBox_corr_show_all_labels_y) + self.label_192 = QtWidgets.QLabel(self.scrollAreaWidgetContents) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_192.sizePolicy().hasHeightForWidth()) + self.label_192.setSizePolicy(sizePolicy) + self.label_192.setObjectName("label_192") + self.horizontalLayout_5.addWidget(self.label_192) + self.comboBox_basic_corr_cmap = QtWidgets.QComboBox(self.scrollAreaWidgetContents) + self.comboBox_basic_corr_cmap.setObjectName("comboBox_basic_corr_cmap") + self.horizontalLayout_5.addWidget(self.comboBox_basic_corr_cmap) self.gridLayout_34.addLayout(self.horizontalLayout_5, 4, 2, 1, 1) self.label_168 = QtWidgets.QLabel(self.scrollAreaWidgetContents) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) @@ -1222,6 +1248,9 @@ def setupUi(self, metaX_main): self.gridLayout_34.addLayout(self.horizontalLayout_20, 8, 1, 1, 1) self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.checkBox_corr_plot_samples = QtWidgets.QCheckBox(self.scrollAreaWidgetContents) + self.checkBox_corr_plot_samples.setObjectName("checkBox_corr_plot_samples") + self.horizontalLayout_3.addWidget(self.checkBox_corr_plot_samples) self.checkBox_corr_cluster = QtWidgets.QCheckBox(self.scrollAreaWidgetContents) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -1231,17 +1260,25 @@ def setupUi(self, metaX_main): self.checkBox_corr_cluster.setChecked(True) self.checkBox_corr_cluster.setObjectName("checkBox_corr_cluster") self.horizontalLayout_3.addWidget(self.checkBox_corr_cluster) - self.label_192 = QtWidgets.QLabel(self.scrollAreaWidgetContents) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred) + self.label_98 = QtWidgets.QLabel(self.scrollAreaWidgetContents) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.label_192.sizePolicy().hasHeightForWidth()) - self.label_192.setSizePolicy(sizePolicy) - self.label_192.setObjectName("label_192") - self.horizontalLayout_3.addWidget(self.label_192) - self.comboBox_basic_corr_cmap = QtWidgets.QComboBox(self.scrollAreaWidgetContents) - self.comboBox_basic_corr_cmap.setObjectName("comboBox_basic_corr_cmap") - self.horizontalLayout_3.addWidget(self.comboBox_basic_corr_cmap) + sizePolicy.setHeightForWidth(self.label_98.sizePolicy().hasHeightForWidth()) + self.label_98.setSizePolicy(sizePolicy) + self.label_98.setObjectName("label_98") + self.horizontalLayout_3.addWidget(self.label_98) + self.comboBox_basic_corr_method = QtWidgets.QComboBox(self.scrollAreaWidgetContents) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.comboBox_basic_corr_method.sizePolicy().hasHeightForWidth()) + self.comboBox_basic_corr_method.setSizePolicy(sizePolicy) + self.comboBox_basic_corr_method.setObjectName("comboBox_basic_corr_method") + self.comboBox_basic_corr_method.addItem("") + self.comboBox_basic_corr_method.addItem("") + self.comboBox_basic_corr_method.addItem("") + self.horizontalLayout_3.addWidget(self.comboBox_basic_corr_method) self.gridLayout_34.addLayout(self.horizontalLayout_3, 4, 1, 1, 1) self.horizontalLayout_105 = QtWidgets.QHBoxLayout() self.horizontalLayout_105.setObjectName("horizontalLayout_105") @@ -3538,6 +3575,7 @@ def setupUi(self, metaX_main): self.comboBox_co_expr_corr_method.setObjectName("comboBox_co_expr_corr_method") self.comboBox_co_expr_corr_method.addItem("") self.comboBox_co_expr_corr_method.addItem("") + self.comboBox_co_expr_corr_method.addItem("") self.horizontalLayout_54.addWidget(self.comboBox_co_expr_corr_method) self.gridLayout_58.addLayout(self.horizontalLayout_54, 0, 1, 1, 1) self.horizontalLayout_30 = QtWidgets.QHBoxLayout() @@ -4349,7 +4387,7 @@ def setupUi(self, metaX_main): self.scrollArea_6.setWidgetResizable(True) self.scrollArea_6.setObjectName("scrollArea_6") self.scrollAreaWidgetContents_7 = QtWidgets.QWidget() - self.scrollAreaWidgetContents_7.setGeometry(QtCore.QRect(0, 0, 885, 225)) + self.scrollAreaWidgetContents_7.setGeometry(QtCore.QRect(0, 0, 775, 102)) self.scrollAreaWidgetContents_7.setObjectName("scrollAreaWidgetContents_7") self.gridLayout_69 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_7) self.gridLayout_69.setObjectName("gridLayout_69") @@ -5711,11 +5749,11 @@ def setupUi(self, metaX_main): self.retranslateUi(metaX_main) self.stackedWidget.setCurrentIndex(0) - self.tabWidget_TaxaFuncAnalyzer.setCurrentIndex(5) + self.tabWidget_TaxaFuncAnalyzer.setCurrentIndex(3) self.toolBox_2.setCurrentIndex(0) - self.tabWidget_4.setCurrentIndex(1) + self.tabWidget_4.setCurrentIndex(0) self.tabWidget_3.setCurrentIndex(3) - self.tabWidget.setCurrentIndex(1) + self.tabWidget.setCurrentIndex(0) self.tabWidget_2.setCurrentIndex(1) self.tabWidget_6.setCurrentIndex(0) self.toolBox_metalab_res_anno.setCurrentIndex(0) @@ -5960,10 +5998,15 @@ def retranslateUi(self, metaX_main): self.label_129.setText(_translate("metaX_main", "Show All Labels")) self.checkBox_corr_show_all_labels_x.setText(_translate("metaX_main", "X")) self.checkBox_corr_show_all_labels_y.setText(_translate("metaX_main", "Y")) + self.label_192.setText(_translate("metaX_main", "Theme")) self.label_168.setText(_translate("metaX_main", "Correlation Heatmap")) self.checkBox_sunburst_show_all_lables.setText(_translate("metaX_main", "Show All Lables for Sunburst")) + self.checkBox_corr_plot_samples.setText(_translate("metaX_main", "Plot Samples")) self.checkBox_corr_cluster.setText(_translate("metaX_main", "Cluster")) - self.label_192.setText(_translate("metaX_main", "Theme")) + self.label_98.setText(_translate("metaX_main", "Method")) + self.comboBox_basic_corr_method.setItemText(0, _translate("metaX_main", "pearson")) + self.comboBox_basic_corr_method.setItemText(1, _translate("metaX_main", "spearman")) + self.comboBox_basic_corr_method.setItemText(2, _translate("metaX_main", "kendall")) self.label_207.setText(_translate("metaX_main", "UpSet")) self.checkBox_basic_plot_upset_show_percentage.setText(_translate("metaX_main", "Show Percentages")) self.label_206.setText(_translate("metaX_main", "Min Subset Size")) @@ -6210,6 +6253,7 @@ def retranslateUi(self, metaX_main): self.label_65.setText(_translate("metaX_main", "Method of Correlation")) self.comboBox_co_expr_corr_method.setItemText(0, _translate("metaX_main", "pearson")) self.comboBox_co_expr_corr_method.setItemText(1, _translate("metaX_main", "spearman")) + self.comboBox_co_expr_corr_method.setItemText(2, _translate("metaX_main", "kendall")) self.label_162.setText(_translate("metaX_main", "Font Size")) self.checkBox_co_expr_show_label.setText(_translate("metaX_main", "Show Labels")) self.label_191.setText(_translate("metaX_main", "Theme")) @@ -6223,7 +6267,7 @@ def retranslateUi(self, metaX_main): self.pushButton_co_expr_add_top.setToolTip(_translate("metaX_main", "Add conditionally filtered items to the drawing box")) self.pushButton_co_expr_add_top.setText(_translate("metaX_main", "Add Top to List")) self.pushButton_co_expr_plot.setText(_translate("metaX_main", "Plot Co-Expression Network")) - self.pushButton_co_expr_heatmap_plot.setText(_translate("metaX_main", "Plot Co-Expression Heatmap")) + self.pushButton_co_expr_heatmap_plot.setText(_translate("metaX_main", "Plot Correlation Heatmap")) self.label_73.setText(_translate("metaX_main", "Select Top")) self.label_74.setText(_translate("metaX_main", "Sort by")) self.comboBox_co_expr_top_by.setItemText(0, _translate("metaX_main", "Total Intensity")) diff --git a/metax/taxafunc_analyzer/analyzer_utils/basic_stats.py b/metax/taxafunc_analyzer/analyzer_utils/basic_stats.py index 9dda064..7bbb551 100644 --- a/metax/taxafunc_analyzer/analyzer_utils/basic_stats.py +++ b/metax/taxafunc_analyzer/analyzer_utils/basic_stats.py @@ -166,7 +166,7 @@ def get_correlation(self, df_type: str, `df_type`: str: 'taxa', 'func', 'taxa_func', 'func_taxa', 'custom' `sample_list`: a list of samples to calculate correlation `plot_list_only`: bool: if True, only return the list of samples that can be plotted - `method`: str: 'pearson', 'spearman' + `method`: str: 'pearson', 'spearman', 'kendall' ''' df = self.tfa.get_df(df_type) df = self.tfa.replace_if_two_index(df) @@ -204,7 +204,7 @@ def get_combined_sub_meta_df( tuple[pd.DataFrame, Dict[str, str]]: A tuple containing the combined DataFrame and a dictionary with the sample names as keys and the group names as values. """ if sub_meta != 'None': - + plot_mean = False # if sub_meta is not None, the mean will be calculated based on the meta and sub_meta automatically sample_groups = {sample: self.tfa.get_group_of_a_sample(sample, self.tfa.meta_name) for sample in df.columns} sub_groups = {sample: self.tfa.get_group_of_a_sample(sample, sub_meta) for sample in df.columns} @@ -218,8 +218,8 @@ def get_combined_sub_meta_df( else: grouped_data = df.T.groupby([sample_groups, sub_groups]).mean().T - # group_list is the sub-meta group - group_list = [i[1] for i in grouped_data.columns] if not plot_mean else grouped_data.columns.tolist() + # group_list is the meta group:i[0], set i[1] if want to show sub_meta group + group_list = [i[0] for i in grouped_data.columns] # Convert multi-index to single index grouped_data.columns = ['_'.join(col).strip() for col in grouped_data.columns.values] diff --git a/metax/taxafunc_ploter/basic_plot.py b/metax/taxafunc_ploter/basic_plot.py index 8bc4648..d5b44a7 100644 --- a/metax/taxafunc_ploter/basic_plot.py +++ b/metax/taxafunc_ploter/basic_plot.py @@ -27,7 +27,7 @@ def __init__(self, tfobj, sns.set_theme() - def plot_taxa_stats_pie(self, theme:str = 'Auto', res_type = 'pic', font_size = 12): + def plot_taxa_stats_pie(self, theme:str = 'Auto', res_type = 'pic', font_size = 10, width = None, height = None): df = self.tfa.BasicStats.get_stats_peptide_num_in_taxa() # if 'not_found' is 0, then remove it @@ -51,17 +51,20 @@ def plot_taxa_stats_pie(self, theme:str = 'Auto', res_type = 'pic', font_size = # set color palette colors = sns.color_palette("deep") - # set figure size base on font size - if font_size <= 10: - fig_size = (8, 6) - elif font_size <= 12: - fig_size = (10, 8) - elif font_size <= 14: - fig_size = (12, 10) - elif font_size <= 16: - fig_size = (14, 12) + # set figure size base on font size if not specified + if width is None and height is None: + if font_size <= 10: + fig_size = (8, 6) + elif font_size <= 12: + fig_size = (10, 8) + elif font_size <= 14: + fig_size = (12, 10) + elif font_size <= 16: + fig_size = (14, 12) + else: + fig_size = (16, 14) else: - fig_size = (16, 14) + fig_size = (width, height) fig = plt.figure(figsize=fig_size) if res_type == 'show' else plt.figure() @@ -91,7 +94,7 @@ def plot_taxa_stats_pie(self, theme:str = 'Auto', res_type = 'pic', font_size = return fig # input: self.get_stats_taxa_level() - def plot_taxa_number(self, peptide_num = 1, theme:str = 'Auto', res_type = 'pic', font_size = 10): + def plot_taxa_number(self, peptide_num = 1, theme:str = 'Auto', res_type = 'pic', font_size = 10, width = None, height = None): df = self.tfa.BasicStats.get_stats_taxa_level(peptide_num) # if genome in taxa_level and count of species == count of genome, then remove genome, and rename species to species (genome) @@ -106,7 +109,12 @@ def plot_taxa_number(self, peptide_num = 1, theme:str = 'Auto', res_type = 'pic' else: custom_params = {"axes.spines.right": False, "axes.spines.top": False} sns.set_theme(style="ticks", rc=custom_params) - plt.figure(figsize=(10, 8)) if res_type == 'show' else plt.figure() + # plt.figure(figsize=(10, 8)) if res_type == 'show' else plt.figure() + if width is None and height is None: + plt.figure(figsize=(10, 8)) if res_type == 'show' else plt.figure() + else: + plt.figure(figsize=(width, height)) if res_type == 'show' else plt.figure() + ax = sns.barplot(data=df, x='taxa_level', y='count',dodge=False, hue='taxa_level') for i in ax.containers: # set the label of the bar, and fontsize @@ -129,7 +137,7 @@ def plot_taxa_number(self, peptide_num = 1, theme:str = 'Auto', res_type = 'pic' return ax # input: self.get_stats_func_prop() - def plot_prop_stats(self, func_name = 'eggNOG_OGs', theme:str = 'Auto', res_type = 'pic', font_size = 10): + def plot_prop_stats(self, func_name = 'eggNOG_OGs', theme:str = 'Auto', res_type = 'pic', font_size = 10, width = None, height = None): df = self.tfa.BasicStats.get_stats_func_prop(func_name) # #dodge=False to make the bar wider # plt.figure(figsize=(8, 6)) @@ -138,8 +146,10 @@ def plot_prop_stats(self, func_name = 'eggNOG_OGs', theme:str = 'Auto', res_type else: custom_params = {"axes.spines.right": False, "axes.spines.top": False} sns.set_theme(style="ticks", rc=custom_params) - - plt.figure(figsize=(8, 6)) if res_type == 'show' else plt.figure() + if width is None and height is None: + plt.figure(figsize=(8, 6)) if res_type == 'show' else plt.figure() + else: + plt.figure(figsize=(width, height)) if res_type == 'show' else plt.figure() ax = sns.barplot(data=df, x='prop', y='n', hue='label', dodge=False, palette='tab10_r') for i in ax.containers: @@ -382,18 +392,24 @@ def plot_corr_sns( cmap: str = "Auto", rename_sample: bool = False, corr_method: str = "pearson", + sub_meta: str | None = 'None', + plot_mean: bool = False, ): - dft= df.copy() - if rename_sample: - dft, group_list = self.tfa.add_group_name_for_sample(dft) - else: - group_list = [self.tfa.get_group_of_a_sample(i) for i in dft.columns] + dft, group_dict = self.tfa.BasicStats.prepare_dataframe_for_heatmap(df = df, sub_meta = sub_meta, + rename_sample = rename_sample, + plot_mean = plot_mean) + + # if rename_sample: + # _, group_list = self.tfa.add_group_name_for_sample(dft) + # else: + # group_list = [self.tfa.get_group_of_a_sample(i) for i in dft.columns] if cmap == 'Auto': cmap = 'RdYlBu_r' else: cmap = cmap - + + group_list = [group_dict[i] for i in dft.columns] color_list = self.assign_colors(group_list) # check if the correlation method is valid @@ -413,9 +429,12 @@ def plot_corr_sns( 'row_cluster':True if cluster else False, 'method':self.linkage_method, 'metric':self.distance_metric, - "linecolor":(0/255, 0/255, 0/255, 0.01), "dendrogram_ratio":(.1, .2),"col_colors":color_list, + "linecolor":(0/255, 0/255, 0/255, 0.01), "dendrogram_ratio":(.1, .2), + "col_colors": color_list, "figsize":(width, height), "xticklabels":True if show_all_labels[0] else "auto", - "yticklabels":True if show_all_labels[1] else 'auto'} + "yticklabels":True if show_all_labels[1] else 'auto', + "center":0, "vmin":-1, "vmax":1 + } fig = sns.clustermap(corr, **sns_params) ax = fig.ax_heatmap @@ -433,7 +452,7 @@ def plot_corr_sns( va = self.get_y_labels_va() ) - fig.ax_col_dendrogram.set_title(f'Correlation of {title_name}', fontsize=font_size+2, fontweight='bold') + fig.ax_col_dendrogram.set_title(f'{corr_method.capitalize()} Correlation of {title_name}', fontsize=font_size+2, fontweight='bold') cbar = fig.ax_heatmap.collections[0].colorbar cbar.set_label('correlation', @@ -711,12 +730,14 @@ def plot_items_corr_heatmap( 'metric':self.distance_metric, "linecolor":(0/255, 0/255, 0/255, 0.01), "dendrogram_ratio":(.1, .2), "figsize":(width, height), "xticklabels":True if show_all_labels[0] else "auto", - "yticklabels":True if show_all_labels[1] else 'auto'} + "yticklabels":True if show_all_labels[1] else 'auto', + "center":0, "vmin":-1, "vmax":1 + } fig = sns.clustermap(corr, **sns_params) ax = fig.ax_heatmap - fig.ax_col_dendrogram.set_title(f'Correlation of {title_name}', fontsize=font_size+2, fontweight='bold') + fig.ax_col_dendrogram.set_title(f'{title_name}', fontsize=font_size+2, fontweight='bold') fig.ax_heatmap.set_xticklabels( fig.ax_heatmap.get_xmajorticklabels(), fontsize=font_size, diff --git a/metax/taxafunc_ploter/get_distinct_colors.py b/metax/taxafunc_ploter/get_distinct_colors.py index 65fdd7e..fe01c6b 100644 --- a/metax/taxafunc_ploter/get_distinct_colors.py +++ b/metax/taxafunc_ploter/get_distinct_colors.py @@ -11,15 +11,20 @@ def __init__(self): pass def assign_colors(self, groups_list: list) -> list: - ''' - Assign colors of the number of unique groups in the list + """ + Assign colors to the number of unique groups in the list - return a list of colors in hex format - ''' - colors = self.get_distinct_colors(len(set(groups_list))) - result = [] - for group in groups_list: - index = sorted(set(groups_list)).index(group) - result.append(colors[index]) + """ + # Get unique sorted groups and their indices + unique_groups = sorted(set(groups_list)) + group_to_index = {group: idx for idx, group in enumerate(unique_groups)} + + # Generate distinct colors based on the number of unique groups + colors = self.get_distinct_colors(len(unique_groups)) + print(f'Assigned colors for {len(unique_groups)} groups') + + # Map groups to colors using the precomputed index + result = [colors[group_to_index[group]] for group in groups_list] return result def adjust_color(self, color, sat_factor=0.7, light_factor=1.2): diff --git a/metax/utils/version.py b/metax/utils/version.py index 7bdb37c..b6393cc 100644 --- a/metax/utils/version.py +++ b/metax/utils/version.py @@ -1,2 +1,2 @@ -__version__ = '1.119.5' +__version__ = '1.119.6' API_version = '4' \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 2f31c1e..9c53d4f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "MetaXTools" -version = "1.119.5" +version = "1.119.6" description = "MetaXTools is a novel tool for linking peptide sequences with taxonomic and functional information in Metaproteomics." readme = "README_PyPi.md" license = { text = "NorthOmics" } From 210d87c6d43b78b070c08cdffe229a14f867b91f Mon Sep 17 00:00:00 2001 From: Qing Date: Thu, 5 Dec 2024 15:04:17 -0500 Subject: [PATCH 3/3] - Change: Optimized the Data Overview section to make the layout more clear. - Update README.md --- Docs/ChangeLog.md | 7 ++++ Docs/MetaX_Cookbook.assets/otf_heatmap.png | Bin 0 -> 132944 bytes README.md | 4 +++ metax/gui/main_gui.py | 17 ++++----- metax/gui/metax_gui/main_window.ui | 32 +++++++++++------ .../gui/metax_gui/matplotlib_figure_canvas.py | 34 ++++++++++++++++-- metax/gui/metax_gui/ui_main_window.py | 22 +++++++----- metax/utils/version.py | 2 +- pyproject.toml | 2 +- 9 files changed, 88 insertions(+), 32 deletions(-) create mode 100644 Docs/MetaX_Cookbook.assets/otf_heatmap.png diff --git a/Docs/ChangeLog.md b/Docs/ChangeLog.md index f43b4e7..cf38796 100644 --- a/Docs/ChangeLog.md +++ b/Docs/ChangeLog.md @@ -1,3 +1,10 @@ + +# Version: 1.119.7 +## Date: 2024-12-5 +### Changes: +- Change: Optimized the Data Overview section to make the layout more clear. +- Update README.md + # Version: 1.119.6 ## Date: 2024-12-5 ### Changes: diff --git a/Docs/MetaX_Cookbook.assets/otf_heatmap.png b/Docs/MetaX_Cookbook.assets/otf_heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..e499ec2fb24a2eb2b2eca36716f2d7f8bd788297 GIT binary patch literal 132944 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 z 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 bZO?Y>c=rD3xG7KMr;j!nKQd;-tPTGQo2e6P literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 263bda4..2392313 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,11 @@ Show all functions of a taxon - tf_link_bar +**OTF Heatmap** +Show OTFS intensity in groups(samples), e.g., **Species-KO** OTF Heatmap + +otf_heatmap ## Download & Installation - **Desktop Version** (Recommended) diff --git a/metax/gui/main_gui.py b/metax/gui/main_gui.py index 46ca921..e3b5f22 100644 --- a/metax/gui/main_gui.py +++ b/metax/gui/main_gui.py @@ -1045,7 +1045,7 @@ def change_theme(self, theme, silent=False): padding: 5px; margin: 2px; height: 20px; - }} + }} ''' current_app = QtWidgets.QApplication.instance() @@ -4070,7 +4070,7 @@ def plot_trends_cluster(self): width=width, height=height, title=title , font_size=font_size, num_col=num_col) # create a dialog to show the figure - # plt_dialog = PltDialog(self.MainWindow, fig) + # plt_dialog = PltDialog(self.MainWindow, fig) #obsolete plt_size= (width*50, int(height*num_cluster*50/num_col) ) plt_dialog = ExportablePlotDialog(self.MainWindow,fig, plt_size) #set title @@ -4348,9 +4348,9 @@ def plot_taxa_stats(self): else: # BasicPlot(self.tfa).plot_taxa_stats() theme = self.comboBox_data_overiew_theme.currentText() - pic = BasicPlot(self.tfa).plot_taxa_stats_pie(theme=theme) + pic = BasicPlot(self.tfa).plot_taxa_stats_pie(theme=theme, font_size=8, width=5, height=4) # Add the new MatplotlibWidget - self.mat_widget_plot_peptide_num = MatplotlibWidget(pic) + self.mat_widget_plot_peptide_num = MatplotlibWidget(pic, width = 5, height = 4) self.verticalLayout_overview_plot.addWidget(self.mat_widget_plot_peptide_num) def plot_taxa_stats_new_window(self): @@ -4369,9 +4369,10 @@ def plot_taxa_number(self): QMessageBox.warning(self.MainWindow, 'Warning', 'Please run OTF Analyzer first!') else: theme = self.comboBox_data_overiew_theme.currentText() - pic = BasicPlot(self.tfa).plot_taxa_number(theme = theme).get_figure() + pic = BasicPlot(self.tfa).plot_taxa_number(theme = theme, font_size = 8, width = 5,height = 4 + ).get_figure() - self.mat_widget_plot_taxa_num = MatplotlibWidget(pic) + self.mat_widget_plot_taxa_num = MatplotlibWidget(pic, width = 5, height = 4) self.verticalLayout_overview_plot.addWidget(self.mat_widget_plot_taxa_num) def plot_taxa_number_new_window(self): @@ -4399,9 +4400,9 @@ def plot_peptide_num_in_func(self): self.show_message('Plotting peptide number in function...') BasicPlot(self.tfa).plot_prop_stats(func_name, theme=theme, res_type='show', font_size = font_size) else: - pic = BasicPlot(self.tfa).plot_prop_stats(func_name, theme=theme) + pic = BasicPlot(self.tfa).plot_prop_stats(func_name, theme=theme, font_size = 8, width=5, height=4) - self.mat_widget_plot_peptide_num_in_func = MatplotlibWidget(pic.get_figure()) + self.mat_widget_plot_peptide_num_in_func = MatplotlibWidget(pic.get_figure(), width = 5, height = 4) self.verticalLayout_overview_func.addWidget(self.mat_widget_plot_peptide_num_in_func) diff --git a/metax/gui/metax_gui/main_window.ui b/metax/gui/metax_gui/main_window.ui index 100fcdc..32aac38 100644 --- a/metax/gui/metax_gui/main_window.ui +++ b/metax/gui/metax_gui/main_window.ui @@ -46,7 +46,7 @@ Qt::LeftToRight - 3 + 1 false @@ -186,7 +186,7 @@ - Operational Taxa-Functions (OTF) Table (head 200) + Operational Taxon-Function (OTF) Table (head 200) @@ -205,6 +205,9 @@ 0 + + true + @@ -215,6 +218,15 @@ 0 + + true + + + true + + + false + @@ -246,7 +258,7 @@ 0 0 462 - 531 + 527 @@ -3248,8 +3260,8 @@ 0 0 - 885 - 170 + 665 + 157 @@ -6810,7 +6822,7 @@ 0 0 885 - 170 + 168 @@ -7664,8 +7676,8 @@ 0 0 - 885 - 123 + 620 + 65 @@ -9600,7 +9612,7 @@ 0 0 885 - 158 + 155 @@ -10869,7 +10881,7 @@ 0 0 991 - 21 + 23 diff --git a/metax/gui/metax_gui/matplotlib_figure_canvas.py b/metax/gui/metax_gui/matplotlib_figure_canvas.py index d9bc04d..84ead4e 100644 --- a/metax/gui/metax_gui/matplotlib_figure_canvas.py +++ b/metax/gui/metax_gui/matplotlib_figure_canvas.py @@ -3,14 +3,42 @@ from matplotlib.figure import Figure class MatplotlibWidget(QWidget): - def __init__(self, figure=None, parent=None): + def __init__(self, figure=None, parent=None, width=6, height=4, dpi=100): + """ + A QWidget that embeds a Matplotlib figure with fixed size to prevent deformation. + + :param figure: The Matplotlib Figure object. If None, a new Figure is created. + :param parent: The parent QWidget. + :param width: Width of the figure in inches. + :param height: Height of the figure in inches. + :param dpi: Dots per inch (resolution) of the figure. + """ super(MatplotlibWidget, self).__init__(parent) - self.figure = figure if figure else Figure() + # Create or use the provided figure + self.figure = figure if figure else Figure(figsize=(width, height), dpi=dpi) self.figure.tight_layout() + # Create the canvas for rendering the figure self.canvas = FigureCanvas(self.figure) self.canvas.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + + # Set fixed size for the canvas + self.canvas.setFixedSize(width * dpi, height * dpi) + # Create and set layout self.layout = QHBoxLayout(self) - self.layout.addWidget(self.canvas) \ No newline at end of file + self.layout.addWidget(self.canvas) + + def set_size(self, width, height, dpi=None): + """ + Update the size of the Matplotlib figure and canvas. + + :param width: New width in inches. + :param height: New height in inches. + :param dpi: Optional new DPI. If not provided, the current DPI is used. + """ + dpi = dpi if dpi else self.figure.get_dpi() + self.figure.set_size_inches(width, height, forward=True) + self.canvas.setFixedSize(width * dpi, height * dpi) + self.canvas.draw() diff --git a/metax/gui/metax_gui/ui_main_window.py b/metax/gui/metax_gui/ui_main_window.py index c770287..c91043d 100644 --- a/metax/gui/metax_gui/ui_main_window.py +++ b/metax/gui/metax_gui/ui_main_window.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'c:\Users\Qing\OneDrive - University of Ottawa\code\TaxaFunc\MetaX\metax\gui\metax_gui\main_window.ui' +# Form implementation generated from reading ui file 'c:\Users\max\OneDrive - University of Ottawa\code\TaxaFunc\MetaX\metax\gui\metax_gui\main_window.ui' # # Created by: PyQt5 UI code generator 5.15.9 # @@ -133,6 +133,8 @@ def setupUi(self, metaX_main): sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tableWidget_taxa_func_view.sizePolicy().hasHeightForWidth()) self.tableWidget_taxa_func_view.setSizePolicy(sizePolicy) + self.tableWidget_taxa_func_view.setShowGrid(True) + self.tableWidget_taxa_func_view.setWordWrap(False) self.tableWidget_taxa_func_view.setObjectName("tableWidget_taxa_func_view") self.tableWidget_taxa_func_view.setColumnCount(0) self.tableWidget_taxa_func_view.setRowCount(0) @@ -147,7 +149,7 @@ def setupUi(self, metaX_main): self.toolBox_2.setMaximumSize(QtCore.QSize(1677, 16777215)) self.toolBox_2.setObjectName("toolBox_2") self.page_2 = QtWidgets.QWidget() - self.page_2.setGeometry(QtCore.QRect(0, 0, 462, 531)) + self.page_2.setGeometry(QtCore.QRect(0, 0, 462, 527)) self.page_2.setObjectName("page_2") self.gridLayout_27 = QtWidgets.QGridLayout(self.page_2) self.gridLayout_27.setObjectName("gridLayout_27") @@ -1652,7 +1654,7 @@ def setupUi(self, metaX_main): self.scrollArea_2.setWidgetResizable(True) self.scrollArea_2.setObjectName("scrollArea_2") self.scrollAreaWidgetContents_2 = QtWidgets.QWidget() - self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 885, 170)) + self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 665, 157)) self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2") self.gridLayout_50 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_2) self.gridLayout_50.setObjectName("gridLayout_50") @@ -3524,7 +3526,7 @@ def setupUi(self, metaX_main): self.scrollArea_4.setWidgetResizable(True) self.scrollArea_4.setObjectName("scrollArea_4") self.scrollAreaWidgetContents_5 = QtWidgets.QWidget() - self.scrollAreaWidgetContents_5.setGeometry(QtCore.QRect(0, 0, 885, 170)) + self.scrollAreaWidgetContents_5.setGeometry(QtCore.QRect(0, 0, 885, 168)) self.scrollAreaWidgetContents_5.setObjectName("scrollAreaWidgetContents_5") self.gridLayout_49 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_5) self.gridLayout_49.setObjectName("gridLayout_49") @@ -3986,7 +3988,7 @@ def setupUi(self, metaX_main): self.scrollArea_5.setWidgetResizable(True) self.scrollArea_5.setObjectName("scrollArea_5") self.scrollAreaWidgetContents_6 = QtWidgets.QWidget() - self.scrollAreaWidgetContents_6.setGeometry(QtCore.QRect(0, 0, 885, 123)) + self.scrollAreaWidgetContents_6.setGeometry(QtCore.QRect(0, 0, 620, 65)) self.scrollAreaWidgetContents_6.setObjectName("scrollAreaWidgetContents_6") self.gridLayout_57 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_6) self.gridLayout_57.setObjectName("gridLayout_57") @@ -5029,7 +5031,7 @@ def setupUi(self, metaX_main): self.scrollArea_7.setWidgetResizable(True) self.scrollArea_7.setObjectName("scrollArea_7") self.scrollAreaWidgetContents_8 = QtWidgets.QWidget() - self.scrollAreaWidgetContents_8.setGeometry(QtCore.QRect(0, 0, 885, 158)) + self.scrollAreaWidgetContents_8.setGeometry(QtCore.QRect(0, 0, 885, 155)) self.scrollAreaWidgetContents_8.setObjectName("scrollAreaWidgetContents_8") self.gridLayout_66 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_8) self.gridLayout_66.setObjectName("gridLayout_66") @@ -5683,7 +5685,7 @@ def setupUi(self, metaX_main): self.statusbar.setObjectName("statusbar") metaX_main.setStatusBar(self.statusbar) self.menuBar = QtWidgets.QMenuBar(metaX_main) - self.menuBar.setGeometry(QtCore.QRect(0, 0, 991, 21)) + self.menuBar.setGeometry(QtCore.QRect(0, 0, 991, 23)) self.menuBar.setObjectName("menuBar") self.menuTools = QtWidgets.QMenu(self.menuBar) self.menuTools.setObjectName("menuTools") @@ -5749,7 +5751,7 @@ def setupUi(self, metaX_main): self.retranslateUi(metaX_main) self.stackedWidget.setCurrentIndex(0) - self.tabWidget_TaxaFuncAnalyzer.setCurrentIndex(3) + self.tabWidget_TaxaFuncAnalyzer.setCurrentIndex(1) self.toolBox_2.setCurrentIndex(0) self.tabWidget_4.setCurrentIndex(0) self.tabWidget_3.setCurrentIndex(3) @@ -5802,8 +5804,10 @@ def retranslateUi(self, metaX_main): self.pushButton_load_example_for_analyzer.setText(_translate("metaX_main", "Load Example Data")) self.label_46.setText(_translate("metaX_main", "Operational Taxa-Functions (OTF) Analyzer")) self.tabWidget_TaxaFuncAnalyzer.setTabText(self.tabWidget_TaxaFuncAnalyzer.indexOf(self.tab), _translate("metaX_main", "Data Import")) - self.label_26.setText(_translate("metaX_main", "Operational Taxa-Functions (OTF) Table (head 200)")) + self.label_26.setText(_translate("metaX_main", "Operational Taxon-Function (OTF) Table (head 200)")) self.label_25.setText(_translate("metaX_main", "Meta Table")) + self.tableWidget_meta_view.setSortingEnabled(True) + self.tableWidget_taxa_func_view.setSortingEnabled(True) self.pushButton_overview_tax_plot_new_window.setText(_translate("metaX_main", "Plot taxa stats in new window")) self.pushButton_overview_peptide_plot_new_window.setText(_translate("metaX_main", "Plot peptide stats in new window")) self.label_154.setText(_translate("metaX_main", "Theme")) diff --git a/metax/utils/version.py b/metax/utils/version.py index b6393cc..eb7770b 100644 --- a/metax/utils/version.py +++ b/metax/utils/version.py @@ -1,2 +1,2 @@ -__version__ = '1.119.6' +__version__ = '1.119.7' API_version = '4' \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 9c53d4f..779741d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "MetaXTools" -version = "1.119.6" +version = "1.119.7" description = "MetaXTools is a novel tool for linking peptide sequences with taxonomic and functional information in Metaproteomics." readme = "README_PyPi.md" license = { text = "NorthOmics" }