0

执行以下代码会给出一个图,其中最后 2 条次要网格线在 x 和 y 中都缺失。如果我删除修剪数据的代码部分或扩展接受的数据量(xylimit),那么可以避免这种情况。谁能看到我做错了什么?

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
from pylab import *

l=201
x=linspace(-l,l,201)
y=linspace(-l,l,201)
z=np.random.rand(l,l)

xylimit=100

i=0
while i<len(x[:]):
     if abs(x[i])>xylimit:
         x=np.delete(x,i,0)
         y=np.delete(y,i,0)
     else:
         i+=1
i=0
while i<len(y[:]):
     if abs(y[i])>xylimit:
         x=np.delete(x,i,0)
         y=np.delete(y,i,0)
     else:
         i+=1

z=np.random.rand(len(x),len(x))

xgridlines = getp(gca(), 'xgridlines')
ygridlines = getp(gca(), 'ygridlines')
plt.minorticks_on()
plt.grid(b=True, which='both',linestyle='-')

l=plt.contourf(x,y,z,np.linspace(0,1,255))

plt.show()

等高线图

4

1 回答 1

2

这似乎是 matplotlib 的次要刻度定位器 ( matplotlib.ticker.AutoMinorLocator) 中的一个错误。90.0 的刻度不存在。如果你这样做:

xlim(-98.5,100.0)

蜱奇迹般地出现了。但是,如果您使用任何会阻止绘制最后一条主线的数字(即低于 100.0 的任何数字),刻度线就会消失。

可以通过以下方式验证是否缺少刻度:

>>> gca().get_xaxis().get_minorticklocs()

array([-90., -80., -70., -60., -40., -30., -20., -10.,  10.,  20.,  30.,
    40.,  60.,  70.,  80.])

有一个丑陋的手动破解来解决这个问题

gca().get_xaxis().set_minor_locator(matplotlib.ticker.FixedLocator(
    array([-90., -80., -70., -60., -40., -30., -20., -10.,  10.,  20.,  30.,
    40.,  60.,  70.,  80., 90.])))

不幸的是,这需要手动设置位置。


一个最小的错误示例(省略了命名空间,我使用 ipython+pylab):

figure()
plot([0,100], [0,100])
axis([0,99.5,0,99.5])
minorticks_on()
grid(which='both')

还有这个错误......它似乎ticker.py在 github 上的第 1732 行(或版本 1.3.1 中的第 1712 行)。由于版本可能会更改,我将其粘贴在这里:

if len(majorlocs) > 0:
    t0 = majorlocs[0]
    tmin = np.ceil((vmin - t0) / minorstep) * minorstep
    tmax = np.floor((vmax - t0) / minorstep) * minorstep
    locs = np.arange(tmin, tmax, minorstep) + t0
    cond = np.abs((locs - t0) % majorstep) > minorstep / 10.0
    locs = locs.compress(cond)
else:
    locs = []

错误本身就在线locs = ...。实际上有两个错误:

  • 以此处显示的方式使用arange,因为在我的简单示例中 tmin = 0.0, tmax = 95.0 and minorstep = 5.0; arange在一般情况下,是否会给 95.0纯粹是运气。(实际上,对于整数,它总是以错误的方式工作,但对于其他任何东西都非常容易出现舍入错误。)
  • 即使数学正好在上面(他们在示例中这样做),最后一个样本也会被遗漏

在我看来,这应该重写为使用整数。作为一种临时治疗方法,可以将这条线替换为:

locs = np.arange(tmin, tmax + minorstep / 2., minorstep) + t0

这至少在我的matplotlib.


所以,简短的回答:找到ticker.pypython包文件夹中的某个地方,进行小编辑,你就完成了。

于 2014-06-24T19:49:53.737 回答