Matplotlib-获取轴号以在对数-对数图上正确显示

时间:2018-07-31 20:14:53

标签: 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]
    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”等。所以我在网上找到了两个有关如何执行此操作的示例,它们自己为该轴设置了xticks,或者将主格式设置为标量。但是,如果仅执行ScalarFormatter,则得到100而不是1x10 ^ 2,但是其余数字仍将显示指数。如果我没有那行代码,那根本就行不通。但是,如果我,我会得到正确的数字,但最重要的是,我会得到表明我不想要的指数!

有人知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:1)

您的问题是您仅更改了主要刻度线(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()

enter image description here PS:请注意,我是如何将您的问题减少到仅几行代码的。参见Minimal, Complete, and Verifiable example