2015-01-23 3 views
7

Я использую кусок кода (основанный на решении чужой задачи с учетом here), чтобы создать графики спектральных данных с двумя по оси x. Первый (нижний) находится в частотных единицах, второй (верхний) просто преобразован в единицы длины волны (длина волны = 3E8/частота). Это работало хорошо, пока я не обновил MPL до 1.4.2, после чего значения на верхней оси будут такими же, как и на нижней оси (см. Пример).Matplotlib Вторая ось x с преобразованными значениями

MWE (точная копия из списка рассылки MPL) является:

from matplotlib.transforms import Transform, BlendedGenericTransform, IdentityTransform 
import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid.parasite_axes import SubplotHost 
import numpy as np 

c = 3.e2 

class Freq2WavelengthTransform(Transform): 
    input_dims = 1 
    output_dims = 1 
    is_separable = False 
    has_inverse = True 

    def transform(self, tr): 
     return c/tr 

    def inverted(self): 
     return Wavelength2FreqTransform() 


class Wavelength2FreqTransform(Freq2WavelengthTransform): 
    def inverted(self): 
     return Freq2WavelengthTransform() 

aux_trans = BlendedGenericTransform(Freq2WavelengthTransform(), 
IdentityTransform()) 

fig = plt.figure(2) 

ax_GHz = SubplotHost(fig, 1,1,1) 
fig.add_subplot(ax_GHz) 
ax_GHz.set_xlabel("Frequency (GHz)") 


xvals = np.arange(199.9, 999.9, 0.1) 
#make some test data 
data = np.sin(0.03*xvals) 

ax_mm = ax_GHz.twin(aux_trans) 
ax_mm.set_xlabel('Wavelength (mm)') 
ax_mm.set_viewlim_mode("transform") 
ax_mm.axis["right"].toggle(ticklabels=False) 

ax_GHz.plot(xvals, data) 
ax_GHz.set_xlim(200, 1000) 

plt.draw() 
plt.show() 

Это производит MWE output

Может ли один мне посоветовать, как решить эту проблему в MPL 1.4.2?

+0

Возможный дубликат [Как добавить вторую ось x в matplotlib] (http://stackoverflow.com/q/10514315/2823755). Может быть, [принятый ответ] (http://stackoverflow.com/a/10517481/2823755) поможет. [ '' 'Pyplot.twiny()' ''] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.twiny) – wwii

ответ

8

Использование комбинации ответа Adobe от thread, связанного с комментарием wwii, и вашего собственного кода.

import numpy as np 
import matplotlib.pyplot as plt 

c=3.e2 
fig = plt.figure()  
ax1 = fig.add_subplot(111)  
ax2 = ax1.twiny() 

xvals = np.arange(199.9, 999.9, 0.1)  
data = np.sin(0.03*xvals)  
ax1.plot(xvals, data) 

ax1Ticks = ax1.get_xticks() 
ax2Ticks = ax1Ticks 

def tick_function(X): 
    V = c/X 
    return ["%.3f" % z for z in V] 

ax2.set_xticks(ax2Ticks) 
ax2.set_xbound(ax1.get_xbound()) 
ax2.set_xticklabels(tick_function(ax2Ticks)) 

ax1.set_xlabel("Frequency (GHz)") 
ax2.set_xlabel('Wavelength (mm)') 
ax1.grid(True) 
plt.ylim(ymin=-1.1,ymax=1.1) 
plt.show() 

Это производит; Output

Надеюсь, это поможет!

Смежные вопросы