2015-01-23 7 views
7

मैं दो एक्स-अक्ष के साथ स्पेक्ट्रोस्कोपिक डेटा के भूखंड बनाने के लिए कोड का एक टुकड़ा (here दिए गए किसी अन्य समस्या के समाधान के आधार पर) का उपयोग कर रहा हूं। पहला (नीचे) आवृत्ति इकाइयों में है, दूसरा (शीर्ष) सिर्फ तरंगदैर्ध्य इकाइयों (तरंग दैर्ध्य = 3E8/आवृत्ति) में परिवर्तित हो गया है। यह तब तक अच्छा काम कर रहा था जब तक मैंने एमपीएल को 1.4.2 तक अपग्रेड नहीं किया जिसके बाद ऊपरी अक्ष पर मान निम्न अक्ष के समान होते हैं (उदाहरण देखें)।ट्रांसप्लेटेड मानों के साथ Matplotlib दूसरा एक्स-अक्ष

एक मेगावाट (एमपीएल मेलिंग सूची से एक सटीक प्रतिलिपि) है:

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

पैदा करता है किसी भी एक मुझे सलाह कैसे एमपीएल 1.4.2 में यह पता करने के लिए कर सकते हैं?

+0

संभावित डुप्लिकेट [matplotlib में दूसरा x-axis कैसे जोड़ें] (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

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

मुझे उम्मीद है कि इससे मदद मिलती है!