答案 0 :(得分:3)
您可以使用次要刻度来产生额外的刻度。可以使用FixedLocator
指定其位置。然后,您可以通过获取相应的rcParams来调整其样式以匹配其中一个主要刻度。
import matplotlib.pyplot as plt
import matplotlib.ticker
plt.plot([0,5],[1,1])
locs= [3.95,4.05] + [4.9,4.95,5.05,5.1]
plt.gca().xaxis.set_minor_locator(matplotlib.ticker.FixedLocator( locs ))
plt.gca().tick_params('x', length=plt.rcParams["xtick.major.size"],
width=plt.rcParams["xtick.major.width"], which='minor')
plt.show()
<小时/> 上述问题是它与尺度有关,即对于不同的尺度,例如从4.8到5.2,蜱将远远超过预期 为了克服这个问题,我们可以对
FixedLocator
进行子类化,并让它返回位置,这些位置偏离所需位置,以像素为单位而不是数据坐标。
import matplotlib.pyplot as plt
import matplotlib.ticker
import matplotlib.transforms
import numpy as np
class MultiTicks(matplotlib.ticker.FixedLocator):
def __init__(self, locs, nticks, space=3, ax=None):
"""
@locs: list of locations where multiple ticks should be shown
@nticks: list of number of ticks per location specified in locs
@space: space between ticks in pixels
"""
if not ax:
self.ax = plt.gca()
else:
self.ax = ax
self.locs = np.asarray(locs)
self.nticks = np.asarray(nticks).astype(int)
self.nbins = None
self.space = space
def tick_values(self, vmin, vmax):
t = self.ax.transData.transform
it = self.ax.transData.inverted().transform
pos = []
for i,l in enumerate(self.locs):
x = t((l,0))[0]
p = np.arange(0,self.nticks[i])//2+1
for k,j in enumerate(p):
f = (k%2)+((k+1)%2)*(-1)
pos.append( it(( x + f*j*self.space, 0))[0] )
return np.array(pos)
# test it:
plt.plot([0,5],[1,1])
plt.gca().xaxis.set_minor_locator(MultiTicks(locs=[4,5],nticks=[2,4]))
plt.gca().tick_params('x', length=plt.rcParams["xtick.major.size"],
width=plt.rcParams["xtick.major.width"], which='minor')
plt.show()
在自定义定位器MultiTicks(locs=[4,5],nticks=[2,4])
的初始化中,我们指定应出现一些额外刻度的位置(在4和5处)以及相应的刻度数(4个刻度,4刻度,4刻度) 。我们还可以使用space
参数指定这些刻度应彼此间隔的像素数。