Matplotlib在semilogx图上分布标记

时间:2017-12-17 14:54:33

标签: python-3.x matplotlib plot slice

我想在Matplotlib中以semilogx刻度绘制曲线。我有两个大小为17874的向量fprtpr。我想在同一条曲线上显示标记。但由于积分过多,我使用markevery=0.1,如图所示来自matplotlib页面的this example。但是,在这种情况下使用markevery在semilog图中没有任何标记(右图):

fig = plt.figure(figsize=(12, 4))
ax = fig.add_subplot(1, 2, 1)
plt.plot(fpr, tpr, marker='o', markevery=0.1)
ax = fig.add_subplot(1, 2, 2)
plt.semilogx(fpr, tpr, marker='o', markevery=0.1) 
plt.show()

enter image description here

然后,我尝试使用切片对象。如下图所示,左图中的标记均匀分布,但在右半图中,标记仅显示在曲线的一半。所以我想知道是否有任何方法可以解决这个问题的变量切片间隔。

ROC plot on a normal scale and the semilogx

我的代码如下:

fig = plt.figure(figsize=(12, 4))
ax = fig.add_subplot(1, 2, 1)
plt.plot(fpr, tpr, marker='o', markevery=slice(0, 20000, 1000))
ax = fig.add_subplot(1, 2, 2)
plt.semilogx(fpr, tpr, marker='o', markevery=slice(0, 20000, 1000))
plt.show()

1 个答案:

答案 0 :(得分:3)

我怀疑数据中看起来接近于零的值 为零。由于零的对数未定义,因此无法在对数刻度上绘制该点。缺少图中的第一个点但不允许计算markevery的间距。 (就像“计算NaN1的平均值一样,这是不可能的。)

解决方案当然是要忽略这一点,在调用对数刻度的绘图函数时无论如何都无法绘制。

plt.semilogx(fpr[1:], tpr[1:], marker='o', markevery=0.1)