python实现临界图(cd图)的绘制

python实现CD图的绘制

所需包:Orange
可以直接使用pip或conda安装

pip install orange3 # or
conda install orange3

以下为一段实例代码:

import Orange
# import orngStat
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

# Adam-LDL-SCL x^2
names = ['alg1', 'alg2', 'alg3', 'alg4', 'alg5', 'alg6', 'alg7', 'alg8', 'alg9']
avranks = [5.48, 6.52, 6.92, 3.44, 4.24, 5.6, 6.44, 4.68, 1.68]
 #tested on 25 datasets
cd = Orange.evaluation.compute_CD(avranks, 25, alpha='0.05', test='bonferroni-dunn') 

print('cd=', cd)
Orange.evaluation.graph_ranks(avranks, names, cd=cd, width=8, cdmethod=8, reverse=True)
# reverse表示按照算法平均排名从左到右依次增大的顺序绘图
# cdmethod 为控制算法的索引,如果不指定则每个算法都会标出其CD范围
plt.show()

结果如下所示:
在这里插入图片描述
但是有些时候我们可能需要另一种形式的,形如下图:
在这里插入图片描述
而Orange这个包并没有这种图的参数,此时就可以通过修改源码的方式来实现。

        if cdmethod < 0 or cdmethod > len(names) - 1:
            raise ValueError('cdmethod 小于0或者超出范围')
        def get_lines(sums, hsd):
            # get all pairs
            lsums = len(sums)
            allpairs = [(i, j) for i, j in mxrange([[lsums], [lsums]]) if j > i]
            # remove not significant
            notSig = [(i, j) for i, j in allpairs
                      if abs(sums[i] - sums[j]) <= hsd]

            # keep only longest

            def no_longer(ij_tuple, notSig):
                i, j = ij_tuple
                for i1, j1 in notSig:
                    if (i1 <= i and j1 > j) or (i1 < i and j1 >= j):
                        return False
                return True

            longest = [(i, j) for i, j in notSig if no_longer((i, j), notSig)]

            return longest

        lines = get_lines(ssums, cd)
        cd_lines = []
        for temp_line in lines:
            if cdmethod >= temp_line[0] and cdmethod <= temp_line[1]:
                cd_lines.append(temp_line)
        def draw_lines(lines, side=0.05, height=0.1):
            start = cline + 0.2
            for l, r in lines:
                line([(rankpos(ssums[l]), start),
                      (rankpos(ssums[r]), start)],
                     linewidth=2.5)
                # start += height
        draw_lines(cd_lines)
        print(lines[-1])

将上述代码粘贴到orange包下的scoring.py文件内(在本人电脑上为
D:\Software\Python\Miniconda3\envs\pytorch\lib\site-packages\Orange\ evaluation\scoring.py)
的以下部分,将源代码部分替换掉

    elif cd:
        # 源代码
        begin = rankpos(avranks[cdmethod] - cd)
        end = rankpos(avranks[cdmethod] + cd)
        line([(begin, cline), (end, cline)],
             linewidth=2.5)
        line([(begin, cline + bigtick / 2),
              (begin, cline - bigtick / 2)],
             linewidth=2.5)
        line([(end, cline + bigtick / 2),
              (end, cline - bigtick / 2)],
             linewidth=2.5)
        # of 源代码

即可得到另一种形式的CD图。
如果有高人知道更简单的方法,期待您的指导:-D。

  • 13
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
csdn CD4046是一种集成电路,它是一种锁相环(PLL)器件。在CD4046中,引脚被用来表示电路的物理连接和功能。以下是对csdn CD4046引脚的300字中文回答: CD4046引脚共有14个引脚,分为两个主要部分:输入引脚和输出引脚。 输入引脚: 1.引脚1(VCO IN):该引脚用于控制电压控制振荡器(VCO)的输入信号。输入的频率范围可以通过外部电路进行控制。 2.引脚2(INHIBIT):当此引脚接收到高电平时,VCO将会被禁用,其输出频率变为低频信号。 3.引脚3至5(PHASE DETECTOR IN):这些引脚用于接收相位差检测器的输入信号。它们可以接收外部参考信号并与VCO输入信号进行比较。 4.引脚7至9(FILTER CAPACITOR1和2):这两个引脚用于连接滤波电容器,用于对VCO输入信号进行滤波处理。 输出引脚: 5.引脚6(PHASE COMPARATOR OUT):此引脚用于输出相位差检测器的比较结果。 6.引脚10和11(VCO OUT1和2):这两个引脚用于输出VCO的频率信号。 7.引脚12和13(FILTER OUTPUT1和2):这两个引脚用于输出VCO信号的滤波结果。 8.引脚14(SUPPLY VOLTAGE):此引脚用于连接电路的供电电压。 通过合理连接这些引脚,我们可以实现对输入信号的控制、相位差检测和输出VCO频率信号的控制。这使得CD4046引脚成为了实现锁相环电路的重要工具,在通信、控制和信号处理领域有着广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值