如何使pyplot在y轴方向上具有均匀分布的刻度值 [0, 1/2, 3/4, 7/8, ...]?

3
我希望能够通过一张收敛概率曲线图来比较几种算法。
目前,我的图表如下:

enter image description here

这使得许多曲线之间的差异无法看到。

我希望y轴是“对数”的,但它与值1的差异是[0, 1/2, 3/4, 7/8, 15/16, ... 1023/1024],以便每个刻度仍然与上一个具有相同的距离(例如,从1/2到3/4的距离与从15/16到31/32的距离相同)。

我尝试使用yticks()函数,但它不会均匀地放置刻度:

enter image description here

这个轴怎么才能看起来正确?

我的当前代码:

def plotCDFs(CDFs, names = []):
   legend = []
   for i, CDF in enumerate(CDFs):
       keys = sorted(CDF)
       vals = sorted(CDF.values())
       plt.plot(keys,vals)
       legend.append(str(names[i]))
   plt.title('Cumulative Distribution')
   plt.legend(legend, loc='lower right')
   plt.xscale('log')
   plt.gca().set_ylim([0,1])
   #plt.yticks([1-2**-i for i in xrange(11)])
   plt.show()

以下答案有帮助吗? - plonser
1个回答

0

有两种可能性:您可以在普通的对数-对数图中绘制1-累积分布,这是我通常做的,或者您(可能)需要创建自己的对数图,就像您上面描述的那样。至少我从未见过一个内置函数可以实现这一点。

这段代码应该可以工作

import numpy as np
import matplotlib.pyplot as plt

def ToLog(x):
    return 1.-np.log10(1.-x)

def plotCDFs(CDFs, names = []):
    legend = []
    max_vals = 0.0
    for i, CDF in enumerate(CDFs):
        keys = sorted(CDF)
        vals = sorted(CDF.values())
        if vals.max() > max_vals:
            max_vals = vals
        plt.plot(keys,ToLog(vals))
        legend.append(str(names[i]))
    plt.title('Cumulative Distribution')
    plt.legend(legend, loc='lower right')
    plt.xscale('log')

    # handling the yaxis ticks and ticklabels
    i_max = np.floor(np.log(1-max_vals.max())/np.log(2.))
    yticks = 1.-2.**np.linspace(i_max,0,-i_max+1)
    ax = plt.gca()
    ax.set_yticks(1.-np.log10(1.-yticks))
    ax.set_yticklabels([str(i-1)+'/'+str(i) for i in 2**np.arange(-int(i_max),0,-1)])

    ax.set_ylim([0,1])
    plt.show()

请注意,在绘图之前必须对所有的ydata应用ToLog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接