我想在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()
我怀疑数据中似乎接近于零的值实际上是零。由于零的对数未定义,因此无法在对数刻度上绘制该点。缺少图中的第一个点虽然不允许计算markevery
的间距。 (就像在“计算NaN
和1
的平均值”中一样,这是不可能的。)
一个解决方案当然是忽略这一点,在调用对数刻度的绘图函数时无论如何都无法绘制。
plt.semilogx(fpr[1:], tpr[1:], marker='o', markevery=0.1)