Python Matplotlib-获取轴编号以在日志图上正确显示

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]

我有一个有点复杂的图,我有两个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]
    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
。此外,还包括您正在使用的所有导入命令。只有你才能更有效地得到答案。