我有一个图,其中x轴是以GeV表示的温度,但是我还需要以Kelvin表示温度的参考,因此我想到了以K表示温度的寄生轴。尝试遵循此答案,这是代码示例。我在图形的顶部获得了第二个轴,但这不是我需要的以K为单位的温度。
import numpy as np
import matplotlib.pyplot as plt
tt = np.logspace(-14,10,100)
yy = np.logspace(-10,-2,100)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()
ax1.loglog(tt,yy)
ax1.set_xlabel('Temperature (GeV')
new_tick_locations = np.array([.2, .5, .9])
def tick_function(X):
V = X*1.16e13
return ["%.1f" % z for z in V]
ax2.set_xlim(ax1.get_xlim())
ax2.set_xticks(new_tick_locations)
ax2.set_xticklabels(tick_function(ax1Xs))
ax2.set_xlabel('Temp (Kelvin)')
plt.show()
这是我运行代码时得到的。
对数图
我需要将寄生轴与原始x轴成比例。而且,当有人看到图表时,可以很容易地读取开氏温度。提前致谢。
最佳答案
通用解决方案可能如下所示。由于您具有非线性刻度,因此可以在开尔文中找到漂亮的刻度线位置,转换为GeV,以GeV为单位设置位置,但以开尔文为单位标记它们。这听起来很复杂,但是好处是您不需要自己找到刻度线,只需依靠matplotlib即可找到刻度线。
但是,这需要两个量表之间的功能依赖关系,即GeV和Kelvin之间的转换及其反函数。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
tt = np.logspace(-14,10,100)
yy = np.logspace(-10,-2,100)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()
plt.setp([ax1,ax2], xscale="log", yscale="log")
ax1.get_shared_x_axes().join(ax1, ax2)
ax1.plot(tt,yy)
ax1.set_xlabel('Temperature (GeV)')
ax2.set_xlabel('Temp (Kelvin)')
fig.canvas.draw()
# 1 GeV == 1.16 × 10^13 Kelvin
Kelvin2GeV = lambda k: k / 1.16e13
GeV2Kelvin = lambda gev: gev * 1.16e13
loc = mticker.LogLocator()
locs = loc.tick_values(*GeV2Kelvin(np.array(ax1.get_xlim())))
ax2.set_xticks(Kelvin2GeV(locs))
ax2.set_xlim(ax1.get_xlim())
f = mticker.ScalarFormatter(useOffset=False, useMathText=True)
g = lambda x,pos : "${}$".format(f._formatSciNotation('%1.10e' % GeV2Kelvin(x)))
fmt = mticker.FuncFormatter(g)
ax2.xaxis.set_major_formatter(mticker.FuncFormatter(fmt))
plt.show()
关于python - loglog图中的寄生x轴,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54640423/