2015-01-23 14 views
7

Użyłem fragmentu kodu (opartego na rozwiązaniu dla innego problemu podanego here), aby utworzyć wykresy danych spektroskopowych z dwiema osiami x. Pierwszy (na dole) jest w jednostkach częstotliwości, drugi (na górze) jest właśnie transformowany do jednostek długości fali (długość fali = 3E8/częstotliwość). To działało dobrze, dopóki nie zmodernizowałem MPL do 1.4.2, po którym wartości na górnej osi są takie same jak na dolnej osi (patrz przykład).Matplotlib Druga oś X z transformowanymi wartościami

MWE (dokładną kopią z listy mailingowej MPL) jest:

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() 

ta produkuje MWE output

Może ktoś mi doradzić, jak rozwiązać ten w MPL 1.4.2?

+0

Możliwy duplikat [Jak dodać drugą oś X w matplotlib] (http://stackoverflow.com/q/10514315/2823755). Może pomoże ci [zaakceptowana odpowiedź] (http://stackoverflow.com/a/10517481/2823755). ['' pyplot.twiny() '' '] (http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.twiny) – wwii

Odpowiedz

8

Używanie kombinacji odpowiedzi Adobe z thread powiązanej z komentarzem wwii i własnego kodu.

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() 

To produkuje; Output

Mam nadzieję, że to pomoże!

Powiązane problemy