2012-11-08 58 views
2

我想用同一个x轴在单个列中创建任意数量的图。在matplotlib子图上重置默认坐标轴

下面是一个例子:

import numpy as np 
from matplotlib import pyplot as plt 

N=1000 
x = np.linspace(-.5,1.5,num=N) 
xshift = x-0.5 
Bz = 30*np.exp(-xshift**8/0.00125)*np.sin(xshift*2.*np.pi) 
Np = 30*np.exp(-xshift**10/0.00125)+5 
Vx = 200*np.exp(-xshift**10/0.00125)+400 

fig = plt.figure() 

#list of tuples of the form `(data, label)`  
data_list = [(Bz,"B_z"),(Vx,"V_x"),(Np,"N_p")] 

for i,(data,lab) in enumerate(data_list,1): 
    ax = fig.add_subplot(len(data_list),1,i) 
    ax.set_ylabel("$\mathrm{%s}$"%lab) 
    ax.get_xaxis().set_ticklabels([]) 
    ax.plot(x,data) 
else: 
    #Reset default tick labels here on ax 
    pass 

plt.show() 

在本图中,这将是合乎逻辑的,而其他所有的地块都不放过信息的最后情节,以显示xtic标签。我可能弹出data_list的最后一项并明确阐明,但这似乎对我来说很难。有没有一种优雅的方式来告诉matplotlib轴,它应该恢复默认的xticlabel设置?

(一些documentation

回答

1

我想这你想要做什么,但我认为这可能是因为“哈克”为你担心。我也认为这可能是正确的方法。 :)

import numpy as np 
from matplotlib import pyplot as plt 

N=1000 
x = np.linspace(-.5,1.5,num=N) 
xshift = x-0.5 
Bz = 30*np.exp(-xshift**8/0.00125)*np.sin(xshift*2.*np.pi) 
Np = 30*np.exp(-xshift**10/0.00125)+5 
Vx = 200*np.exp(-xshift**10/0.00125)+400 

fig = plt.figure() 

#list of tuples of the form `(data, label)`  
data_list = [(Bz,"B_z"),(Vx,"V_x"),(Np,"N_p")] 

left = .15 
height = .2 
width = .7 
bottom = .0 
axes_ticks = [] 
axes = [] 
for i,(data,lab) in enumerate(data_list,1): 
    ax = fig.add_subplot(len(data_list),1,i) 
    bottom += height 
    ax.set_position((left, bottom, width, height)) 

    ax.set_ylabel("$\mathrm{%s}$"%lab) 
    axes_ticks.append(ax.get_xaxis().get_ticklocs()) 
    ax.get_xaxis().set_ticks([]) 
    ax.plot(x,data) 
    axes.append(ax) 
else: 
    #Reset default tick labels here on ax 
    axes[0].get_xaxis().set_ticks(axes_ticks[0]) 


plt.show() 
+1

这对我来说似乎有点无聊。这似乎*应该是一个相当简单的操作。事实上,我并不是特别想对每个情节的高度和宽度进行硬编码来完成这项工作。这似乎不像*正确的方式*给我:)。但是,谢谢,这比我到目前为止所做的任何事都要好。 – mgilson

+0

如果它让你感觉更好,至少你没有使用硬编码的光栅坐标,它都是相对于显示器。 –