我花了一些时间徒劳地寻找我的问题的答案,所以我认为一个新的问题是有序的。考虑这个情节:
轴标签使用科学记数法。在y轴上,一切都很好。但是,我已经尝试并且未能摆脱Python在右下角添加的缩放因子。我想要完全删除这个因素,只需用轴标题中的单位表示它,或者将它乘以每个刻度标签。一切看起来都比这丑陋的1e14
好。
以下是代码:
import numpy as np data_a = np.loadtxt('exercise_2a.txt')
import matplotlib as mpl
font = {'family' : 'serif',
'size' : 12}
mpl.rc('font', **font)
import matplotlib.pyplot as plt
fig = plt.figure()
subplot = fig.add_subplot(1,1,1)
subplot.plot(data_a[:,0], data_a[:,1], label='$T(t)$', linewidth=2)
subplot.set_yscale('log')
subplot.set_xlabel("$t[10^{14}s]$",fontsize=14)
subplot.set_ylabel("$T\,[K]$",fontsize=14)
plt.xlim(right=max(data_a [:,0]))
plt.legend(loc='upper right')
plt.savefig('T(t).pdf', bbox_inches='tight')
更新:将Will的scientificNotation
实现合并到我的脚本中,情节现在看起来像
如果你问我,好多了。对于想要采用其中某些部分的人来说,这是完整的代码:
import numpy as np
data = np.loadtxt('file.txt')
import matplotlib as mpl
font = {'family' : 'serif',
'size' : 16}
mpl.rc('font', **font)
import matplotlib.pyplot as plt
fig = plt.figure()
subplot = fig.add_subplot(1,1,1)
subplot.plot(data[:,0], data[:,1], label='$T(t)$', linewidth=2)
subplot.set_yscale('log')
subplot.set_xlabel("$t[s]$",fontsize=20)
subplot.set_ylabel("$T\,[K]$",fontsize=20)
plt.xlim(right=max(data [:,0]))
plt.legend(loc='upper right')
def scientificNotation(value):
if value == 0:
return '0'
else:
e = np.log10(np.abs(value))
m = np.sign(value) * 10 ** (e - int(e))
return r'${:.0f} \cdot 10^{{{:d}}}$'.format(m, int(e))
formatter = mpl.ticker.FuncFormatter(lambda x, p: scientificNotation(x))
plt.gca().xaxis.set_major_formatter(formatter)
plt.savefig('T(t).pdf', bbox_inches='tight', transparent=True)
答案 0 :(得分:5)
只需将x值除以1e14
:
subplot.plot(data_a[:,0] / 1e14, data_a[:,1], label='$T(t)$', linewidth=2)
如果你想为每个单独的标记添加标签,你必须提供一个custom formatter,就像汤姆的答案一样。
如果你希望它看起来像你的y轴上的刻度一样好,你可以提供一个函数来用LaTeX格式化它:
def scientificNotation(value):
if value == 0:
return '0'
else:
e = np.log10(np.abs(value))
m = np.sign(value) * 10 ** (e - int(e))
return r'${:.0f} \times 10^{{{:d}}}$'.format(m, int(e))
# x is the tick value; p is the position on the axes.
formatter = mpl.ticker.FuncFormatter(lambda x, p: scientificNotation(x))
plt.gca().xaxis.set_major_formatter(formatter)
当然,这会使你的x轴混乱很多,所以你最终可能需要以某个角度显示它们。例如。
答案 1 :(得分:3)
You can also change the tick formatter with the ticker
module.
An example would be to use a FormatStrFormatter
:
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
fig,ax = plt.subplots()
ax.semilogy(np.linspace(0,5e14,50),np.logspace(3,7,50),'b-')
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.0e'))
Also see the answers here with lots of good ideas for ways to solve this.
答案 2 :(得分:2)
除了Will Vousden的好答案之外,您还可以设置您在刻度线中写的内容:
plt.xticks(range(6), range(6))
第一个range(6)
是位置,第二个是标签。