我想在Matplotlib中以semilogx刻度绘制曲线。我有两个大小为17874的向量fpr
和tpr
。我想在同一条曲线上显示标记。但由于积分过多,我使用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()
然后,我尝试使用切片对象。如下图所示,左图中的标记均匀分布,但在右半图中,标记仅显示在曲线的一半。所以我想知道是否有任何方法可以解决这个问题的变量切片间隔。
我的代码如下:
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()
答案 0 :(得分:3)
我怀疑数据中看起来接近于零的值 为零。由于零的对数未定义,因此无法在对数刻度上绘制该点。缺少图中的第一个点但不允许计算markevery
的间距。 (就像“计算NaN
和1
”的平均值一样,这是不可能的。)
解决方案当然是要忽略这一点,在调用对数刻度的绘图函数时无论如何都无法绘制。
plt.semilogx(fpr[1:], tpr[1:], marker='o', markevery=0.1)