在Python中使用多个x轴过度绘制数据

时间:2013-03-14 13:37:53

标签: python

我正在尝试从包含计数率与时间的.fits文件中绘制一些数据。 我的目标是在同一个绘图中绘制不同事件的计数率,在三个不同的x轴上绘制不同的时间。 由于我想要绘制的事件是周期性的,因此我在确定正确的时间时施加了条件,因此我只能从我需要的时间范围中提取计数率。 这是我的努力:

#!/usr/bin/env python

from scipy import *
from numpy import *
from pylab import *
from scipy import optimize
import pyfits, os, re, glob
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.ticker import FuncFormatter

rc('font',**{'family':'serif','serif':['Helvetica']})
rc('ps',usedistiller='xpdf')
rc('text', usetex=True)

#------------------------------------------------------

tmin=56200
tmax=56249

data=pyfits.open('http://heasarc.gsfc.nasa.gov/docs/swift/results/transients/weak/GX304-1.orbit.lc.fits')

time  = data[1].data.field(0)/86400. + data[1].header['MJDREFF'] + data[1].header['MJDREFI']
rate  = data[1].data.field(1)
error = data[1].data.field(2)
data.close()

cond= ((time > tmin-5) & (time < tmax)) | ((time + 132.5 > tmin) & (time + 132.5 < tmax-10)) | ((time + 265 > tmin) & (time + 265 < tmax-12))
time=time[cond]
rate=rate[cond]
error=error[cond]

fig, ax1 = plt.subplots()
newax2 = ax1.twiny()
newax3 = ax1.twiny()

# Make some room at the bottom
fig.subplots_adjust(bottom=0.30)

newax2.set_frame_on(True)
newax2.patch.set_visible(False)
newax2.xaxis.set_ticks_position('bottom')
newax2.xaxis.set_label_position('bottom')
newax2.spines['bottom'].set_position(('outward', 20))

newax3.set_frame_on(True)
newax3.patch.set_visible(False)
newax3.xaxis.set_ticks_position('bottom')
newax3.xaxis.set_label_position('bottom')
newax3.spines['bottom'].set_position(('outward', 40))

#..plot the current light curve
errorbar(time, rate, error, fmt='r.', capsize=0)
gca().xaxis.set_major_formatter(FormatStrFormatter('%5.1f'))

#..overplot a previous outburst
errorbar(time + 122.5, rate, error, fmt='g.', capsize=0)
errorbar(time + 255, rate, error, fmt='k.', capsize=0)

axis([tmin-10,tmax,-0.00,0.45])
xlabel('Time, MJD')
ylabel("BAT cts/s/cm$^2$")
savefig("sync.eps",orientation='portrait',papertype='a4',format='eps')
os.system('gv sync.eps')

我正在策划三个事件,所以我需要三个x轴;但是,如果可能的话,我也想在x轴上写出相应的颜色和相应的颜色。在底线报告的时间是红色曲线的正确时间,即最近的事件。 有什么建议吗? 非常感谢提前。

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,问题是第一和第二个x轴上的错误滴答。 您应该简单地将errorbar函数绑定到正确的轴,然后matplotlib将为您进行缩放。像这样:

...
#..plot the current light curve
ax1.errorbar(time, rate, error, fmt='r.', capsize=0)
gca().xaxis.set_major_formatter(FormatStrFormatter('%5.1f'))

#..overplot a previous outburst
newax2.errorbar(time + 122.5, rate, error, fmt='g.', capsize=0)
newax3.errorbar(time + 255, rate, error, fmt='k.', capsize=0)
...

我通常更喜欢matplotlib中更加面向对象的方法,所以这是唯一的方法。

如果您不介意,我会在评论中将着色部分留给参考。

<强>更新

以下是一些更新的代码;也许这就是你要找的东西。 诀窍是移动x数据(time),但只需将x限制(&#34;窗口&#34;你正在查看)转移到你要。所以我将122.5和255偏移(反向)分别应用于每个轴的x极限。

我还必须分别为每个轴设置格式化程序;如果我没有设置格式化程序,你最终会得到一个偏移表示法(0 .. 10 .. 20 .. 30 + 56190)。像你一样使用全局格式化程序,只在ax1上工作(我认为)。 请注意,我只在全局设置y限制,注释掉axis命令。

...
##..plot the current light curve
ax1.errorbar(time, rate, error, fmt='r.', capsize=0)
ax1.set_xlim(tmin-10,tmax)
ax1.xaxis.set_major_formatter(FormatStrFormatter('%5.1f'))
##..overplot a previous outburst
newax2.errorbar(time, rate, error, fmt='g.', capsize=0)
newax3.errorbar(time, rate, error, fmt='k.', capsize=0)
newax2.set_xlim(tmin-10-122.5,tmax-122.5)
newax2.xaxis.set_major_formatter(FormatStrFormatter('%5.1f'))
newax3.set_xlim(tmin-10-255,tmax-255)
newax3.xaxis.set_major_formatter(FormatStrFormatter('%5.1f'))
ylim(0,0.45)
#axis([tmin-10,tmax,-0.00,0.45])
...

这导致了 enter image description here 这是你的原始剧本产生的,但有一组希望正确的x轴(除了着色)。