我的x轴都是对数刻度。上x轴是下轴的函数(在本例中为平方)。
虽然下轴刻度标签自动格式化为十的幂,但上轴具有不同的默认格式(科学记数法):
我该如何解决这个问题?
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()
x = np.logspace(-9,0,10)
x2 = x**2
new_tick_locations = x[3:-3]
new_tick_labels = x2[3:-3]
y = np.ones(np.size(x))
ax1.semilogx(x,y)
plt.grid(True)
ax1.set_xlabel(r"Original x-axis: $X$")
ax2.set_xscale('log')
ax2.set_xlim(ax1.get_xlim())
ax2.set_xticks(new_tick_locations)
ax2.set_xticklabels(new_tick_labels)
ax2.set_xlabel(r"Modified x-axis: $X^2$")
plt.show()
答案 0 :(得分:0)
至少有两种解决方法:
在new_tick_labels
ax2.set_xticklabels()
前对其进行格式化
使用FuncFormater
进行单位转换和格式化,而无需致电ax2.set_xticklabels()
要采用第一种方式,您需要更换此行:
ax2.set_xticklabels(new_tick_labels)
使用此块:
new_tick_labels = ['$\mathdefault{10^{%i}}$' % np.log10(l)
for l in new_tick_labels]
ax2.set_xticklabels(new_tick_labels)
要从FuncFormater
中受益,请将以下行替换为:
from matplotlib.ticker import FuncFormatter
ax2.xaxis.set_major_formatter(
FuncFormatter(lambda x, p:
'$\mathdefault{10^{%i}}$' % np.log10(x**2)))
如果您使用new_tick_labels = x2[3:-3]
,也可以删除FuncFormater
。