# # 计算CD值
# import numpy as np
# # import Orange
# from matplotlib import pyplot as plt
#
#
#
# def compute_cd(N, K, q_α):
#     # input data
#     CD = np.sqrt(K * (K + 1) / (6 * N)) * q_α
#     return CD
#
#
#
#
# if __name__ == "__main__":
#
#     # # chebyshev
#     Ours=
#     EDL =
#     AAKNN =
#     LDLLCLR = 
#     LDLLDM =
#     LDLFC =
#     LDLFCC =
#     LDLPLDM =
#
#     # clark
#     # Ours =
#     # EDL =
#     # AAKNN =
#     # LDLLCLR =
#     # LDLLDM =
#     # LDLFC =
#     # LDLFCC =
#     # LDLPLDM=
#
#     # # canberra
#     # Ours =
#     # EDL =
#     # AAKNN =
#     # LDLLCLR =
#     # LDLLDM =
#     # LDLFC =
#     # LDLFCC =
#     # LDLPLDM=
#
#     # # kl对比.py
#     # Ours =
#     # EDL =
#     # AAKNN =
#     # LDLLCLR =
#     # LDLLDM =
#     # LDLFC =
#     # LDLFCC =
#     # LDLPLDM =
#
#     # cosine
#     # Ours =
#     # EDL =
#     # AAKNN =
#     # LDLLCLR =
#     # LDLLDM =
#     # LDLFC =
#     # LDLFCC =
#     # LDLPLDM =
#
#     #intersection
#     # Ours =
#     # EDL =
#     # AAKNN =
#     # LDLLCLR =
#     # LDLLDM =
#     # LDLFC =
#     # LDLFCC =
#     # LDLPLDM =
#
#     name_list = ["Ours", "EDL", "AAKNN", "LDLLCLR", "LDLLDM", "LDLFC","LDLFCC"," LDLPLDM"]
#     Rank = [Ours, EDL, AAKNN , LDLLCLR,  LDLLDM, LDLFC,LDLFCC,LDLPLDM]
#     import Orange
#     # import orngStat
#     import matplotlib
#
#     matplotlib.use('TkAgg')
#
#     cd = Orange.evaluation.compute_CD(Rank, 8, alpha='0.05', test="bonferroni-dunn")
#     print(cd)
#
#     Orange.evaluation.graph_ranks(Rank, name_list, reverse=True, cd=cd, width=6, textspace=1.5)
#     plt.show()

import numpy as np
import matplotlib
matplotlib.use('TkAgg')   # 如果只想保存不弹窗，可改为 'Agg'
import matplotlib.pyplot as plt
import Orange

# === 全局参数 ===

N = 6                   # 数据集个数
ALPHA = 0.05              # 显著性水平
TEST  = 'bonferroni-dunn' # 可改为 'nemenyi'
REVERSE_AXIS = True       # True: 最好(秩=1)在右侧；False: 在左侧

# 算法名称（顺序要和 Rank 输入一致）

names = ["FWMFS", "PMU", "D2F", "MFS-MFR","MFS-MCDM", "SCLS", "GRRO"]

# === 平均秩（不同指标下） ===

avranks_by_metric = {
" Hamming Loss ": [2.1667,6.7500,5.3333,3.5000,4.2500,3.3333,2.6667],
"Ranking Loss":     [2.0000,6.0000,5.5000,4.3333,4.3333,3.5000,2.3333],
"Average Precision":  [1.8333,5.0000,6.0833,4.3333,3.9167,4.1667,2.6667],
"Macro-F1":        [1.3333,6.0000,5.8333,3.6667,5.6667,3.5000,2.0000],
"Micro-F1":    [1.6667,6.0000,5.8333,2.6667,5.5000,4.0000,2.3333],

}

def plot_one(metric, ranks):
    # 计算 CD
    cd = Orange.evaluation.compute_CD(ranks, N, alpha=str(ALPHA), test=TEST)
    print(f"[{metric}] CD({TEST}, alpha={ALPHA}, N={N}, k={len(ranks)}) = {cd:.4f}")


    # 绘制并保存图像
    Orange.evaluation.graph_ranks(
        avranks=ranks,
        names=names,
        cd=cd,
        width=6.0,
        textspace=1.6,
        reverse=REVERSE_AXIS
    )
    plt.title("")
    plt.tight_layout()
    # plt.savefig(f"{metric}_CD_{TEST}.jpeg", dpi=300, bbox_inches="tight")
    # plt.savefig(f"{metric}_CD_{TEST}.eps", bbox_inches="tight")
    plt.savefig(f"fig6.{i}.pdf", bbox_inches="tight",dpi=300)
    # plt.show()

i=0
for metric, ranks in avranks_by_metric.items():
    i=i+1;
    plot_one(metric, ranks)