Python Matplotlib-获取轴编号以在日志图上正确显示
我有一个有点复杂的图,我有两个X轴(一个在顶部,一个在底部)和一个Y轴,都在对数空间中。虽然我不是说这是最有效的方法,但这就是它目前的工作方式:Python Matplotlib-获取轴编号以在日志图上正确显示,python,matplotlib,axis-labels,Python,Matplotlib,Axis Labels,我有一个有点复杂的图,我有两个X轴(一个在顶部,一个在底部)和一个Y轴,都在对数空间中。虽然我不是说这是最有效的方法,但这就是它目前的工作方式: Jy = (.15E-5) D = [11.4,2.7,3.,9.,8.,8.,13.6,10.,16.6,4.3,14.7,2.7,13.5,18.,9.9] years = [1994,1972,1937,1989,1981,1937,1971,1960,1965,1974,1960,1895,1939,1983,1998]
Jy = (.15E-5)
D = [11.4,2.7,3.,9.,8.,8.,13.6,10.,16.6,4.3,14.7,2.7,13.5,18.,9.9]
years = [1994,1972,1937,1989,1981,1937,1971,1960,1965,1974,1960,1895,1939,1983,1998]
names= ['SN1994D','SN1972E','SN1937C','SN1989B','SN1981B','SN1937D','SN1971I','SN1960F','SN1965I','SN1974G','SN1960R','SN1895B','SN1939A','SN1983U','SN1998bu']
Sv = Jy*10E-23
Lv = [4*np.pi*((i*3.086e+24)**2)*Sv for i in D]
def two_scales(ax1, data1, data2,lum, c1, c2):
ax2 = ax1.twiny()
ax1.loglog(data1, lum, color=c1)
ax1.set_xlabel('Time (years)')
ax1.set_ylabel('Luminosity (erg/s/Hz)')
ax2.loglog(data2, lum, color=c2)
ax2.set_xlabel('Radius (cm)')
return ax1, ax2
# Create axes
fig, ax = plt.subplots()
ax1, ax2 = two_scales(ax, tim, rad*3.086e+18, lum, 'g', 'w')
ax1.loglog(tim3, lum3, 'g', label= "n=.1 cm^-3")
ax1.loglog(tim, lum, 'b', label= "n=1 cm^-3")
ax1.loglog(tim10, lum10, 'r', label="n= 10 cm^-3")
ax1.legend(loc=3)
ax1.set_xlim(20,1.5E2)
ax1.set_ylim(1E23, 5E25)
ax1.scatter(time, Lv)
ax1.get_xaxis().set_major_formatter(ScalarFormatter())
ax1.set_xticks([20, 30, 40, 60, 100])
for i, txt in enumerate(names):
ax1.annotate(txt, (time[i],Lv[i]))
plt.savefig('lumin-rad.png',dpi=600, bbox_inches='tight')
我得到的问题是,理想情况下,我希望时间的下轴不在日志空间中,而只是说“20、30、40、60、100”而不是“2x10^1”等。因此,我在网上找到了两个关于如何实现这一点的示例,或者为该轴设置XTICK,或者将主格式化程序设置为标量。但是,如果只使用ScalarFormatter,则得到的是100而不是1x10^2,但其余数字仍将显示指数。如果我在没有那一行的情况下编写代码,它就根本不起作用。但如果我同时做这两件事,我会得到正确的数字,但最重要的是我会得到指数,表明我不想要
有人知道如何解决这个问题吗?您的问题是,您只更改主刻度(100)的显示,而不更改次刻度。要获得所需的行为,请同时更改主格式化程序和次格式化程序
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
fig, ax = plt.subplots()
ax.loglog([20, 1.5e2], [1e23, 5e25])
frmt = ScalarFormatter()
ax.get_xaxis().set_major_formatter(frmt)
ax.get_xaxis().set_minor_formatter(frmt)
plt.show()
PS:请注意我是如何将您的问题简化为几行代码的。请参见当您发布要求解决方案的代码时,请确保其他人可以复制粘贴并运行该代码,而不会因缺少数据而导致任何错误。它抱怨
未定义tim
。此外,还包括您正在使用的所有导入命令。只有你才能更有效地得到答案。