我找到了一种更简单的方法,可能适用于此问题:
我使用了ax.set_xticks方法,并将下面函数的输出作为参数传入:
def gen_tick_positions(scale_start=100, scale_max=10000):
start, finish = np.floor(np.log10((scale_start, scale_max)))
finish += 1
majors = [10 ** x for x in np.arange(start, finish)]
minors = []
for idx, major in enumerate(majors[:-1]):
minor_list = np.arange(majors[idx], majors[idx+1], major)
minors.extend(minor_list[1:])
return minors, majors
对于这个例子,您可以从ax.get_yticks()推断出线性区域(即围绕零且与0-1/10不相差10倍的值)。
y_ticks = ax.get_yticks()
total_scale = list(y_ticks)
zero_point = total_scale.index(0.0)
post_zeroes = np.log10(total_scale[zero_point+1:])
first_log = []
for idx, value in enumerate(post_zeroes[:-1]):
if 1.005 > post_zeroes[idx+1] - value > 0.995:
first_log = total_scale[idx + zero_point]
这样,您就可以得到一个起始值,将其放入上面的函数中,其中scale_max
可以是任何您喜欢的值,例如total_scale[-1]
。
您可以使用first_log
的正区域和负区域生成线性刻度,然后将列表合并。
lin_ticks = list(np.linspace(first_log * -1, first_log, 21))
pos_log_ticks_minors, pos_log_ticks_majors = gen_tick_positions(first_log, scale_max)
neg_log_ticks_minors = [x * -1 for x in pos_log_ticks_minors]
neg_log_ticks_majors = [x * -1 for x in pos_log_ticks_majors]
final_scale_minors = neg_log_ticks_minors + lin_ticks + pos_log_ticks_minors
The merged list can then be passed into e.g.
ax.set_yticks(final_scale_minors, minor=True)
虽然我想到了您不需要从图表或轴上读取线性阈值,因为在应用“symlog”时已指定为参数。