我有一个包含记录事件的文件 . 每个条目都有时间和延迟 . 我有兴趣绘制延迟的累积分布函数 . 我对尾部延迟最感兴趣所以我希望绘图具有对数y轴 . 我对以下百分位数的延迟感兴趣:第90,99,99.9,99.99和99.999 . 到目前为止,这是我的代码生成一个常规的CDF图:
# retrieve event times and latencies from the file
times, latencies = read_in_data_from_file('myfile.csv')
# compute the CDF
cdfx = numpy.sort(latencies)
cdfy = numpy.linspace(1 / len(latencies), 1.0, len(latencies))
# plot the CDF
plt.plot(cdfx, cdfy)
plt.show()
我知道我希望情节看起来像什么,但我很难得到它 . 我希望它看起来像这样(我没有生成这个情节):
使x轴对数很简单 . y轴是给我带来问题的那个 . 使用 set_yscale('log')
不起作用,因为它想要使用10的幂 . 我真的希望y轴具有与该图相同的刻度标签 .
如何将我的数据放入像这样的对数图中?
编辑:
如果我将yscale设置为'log',并将ylim设置为[0.1,1],我会得到以下图:
问题是数据集上从0到1的典型对数刻度图将集中在接近零的值上 . 相反,我想专注于接近1的值 .
2 回答
基本上,您需要将以下转换应用于
Y
值:-log10(1-y)
. 这强加了y < 1
的唯一限制,因此您应该能够在转换后的图上具有负值 .以下是来自
matplotlib
文档的修改后的example,其中显示了如何将自定义转换合并到"scales"中:请注意,您可以通过关键字参数控制9的数量:
好吧,这不是最干净的代码,但我看不到它的方法 . 也许我真正要求的不是对数CDF,但我会等一位统计学家告诉我 . 无论如何,这是我想出的:
凌乱的部分是我改变yticklabels的地方 .
logcdfy
变量将保持0到10之间的值,在我的示例中,它介于0和6之间 . 在此代码中,我将标签与百分位数交换 . 也可以使用plot
函数,但我喜欢scatter
函数显示尾部异常值的方式 . 另外,我选择不在对数刻度上制作x轴,因为我的特定数据在没有它的情况下具有良好的线性线 .