2015-04-05 9 views
8

मैं एक्स भाग को ठीक करने, एक्स भाग को ठीक करने, लेकिन वाई भाग ऑटोस्केल देने के लिए सरणी का केवल एक हिस्सा प्लॉट करना चाहता हूं। मैंने नीचे दिखाए गए प्रयास किए, लेकिन यह काम नहीं करता है।मैटलप्लिब - फिक्सिंग एक्स अक्ष स्केल और ऑटोस्केल वाई अक्ष

कोई सुझाव?

import numpy as np 
import matplotlib.pyplot as plt 

data=[np.arange(0,101,1),300-0.1*np.arange(0,101,1)] 

plt.figure() 

plt.scatter(data[0], data[1]) 
plt.xlim([50,100]) 
plt.autoscale(enable=True, axis='y') 

plt.show() 

उत्तर

5

Autoscaling हमेशा डेटा की पूरी रेंज का उपयोग करता है, तो y- अक्ष y-डेटा ही नहीं, क्या एक्स-सीमा के भीतर है की पूर्ण सीमा तक से नापा जाता है।

import numpy as np 
import matplotlib.pyplot as plt 

x, y = np.arange(0,101,1) ,300 - 0.1*np.arange(0,101,1) 
mask = (x >= 50) & (x <= 100) 

fig, ax = plt.subplots() 
ax.scatter(x[mask], y[mask]) 

plt.show() 
+0

मैं भी इस विचार था लेकिन मुझे नहीं पता था कि सबसेट बनाने अजगर :) – Pygmalion

8

जबकि Joe Kington निश्चित रूप से सबसे समझदार जवाब का प्रस्ताव जब वह यह है कि केवल आवश्यक डेटा सिफारिश की गई है:

आप डेटा के एक उपसमूह प्रदर्शित करना चाहते हैं, तो यह शायद सबसे आसान ही नहीं सबसेट प्लॉट करने के लिए है प्लॉट किया जाना चाहिए, ऐसी स्थितियां हैं जहां सभी डेटा प्लॉट करना सबसे अच्छा होगा और बस एक निश्चित खंड पर ज़ूम करें। इसके अतिरिक्त, "autoscale_y" फ़ंक्शन होना अच्छा लगेगा, जिसके लिए केवल अक्ष ऑब्जेक्ट की आवश्यकता होती है (यानी, here के उत्तर के विपरीत, जिसके लिए डेटा का प्रत्यक्ष उपयोग की आवश्यकता होती है।)

यहां एक ऐसा फ़ंक्शन है जो वाई-

def autoscale_y(ax,margin=0.1): 
    """This function rescales the y-axis based on the data that is visible given the current xlim of the axis. 
    ax -- a matplotlib axes object 
    margin -- the fraction of the total height of the y-data to pad the upper and lower ylims""" 

    import numpy as np 

    def get_bottom_top(line): 
     xd = line.get_xdata() 
     yd = line.get_ydata() 
     lo,hi = ax.get_xlim() 
     y_displayed = yd[((xd>lo) & (xd<hi))] 
     h = np.max(y_displayed) - np.min(y_displayed) 
     bot = np.min(y_displayed)-margin*h 
     top = np.max(y_displayed)+margin*h 
     return bot,top 

    lines = ax.get_lines() 
    bot,top = np.inf, -np.inf 

    for line in lines: 
     new_bot, new_top = get_bottom_top(line) 
     if new_bot < bot: bot = new_bot 
     if new_top > top: top = new_top 

    ax.set_ylim(bot,top) 

यह एक हैक के बारे में कुछ है, और शायद कई स्थितियों में काम नहीं करेगा, लेकिन एक सरल साजिश के लिए, यह अच्छी तरह से काम करता है: अक्ष डेटा दृश्यमान एक्स-क्षेत्र में है कि के आधार पर।

यहाँ इस समारोह का उपयोग कर एक सरल उदाहरण है:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(-100,100,1000) 
y = x**2 + np.cos(x)*100 

fig,axs = plt.subplots(1,2,figsize=(8,5)) 

for ax in axs: 
    ax.plot(x,y) 
    ax.plot(x,y*2) 
    ax.plot(x,y*10) 
    ax.set_xlim(-10,10) 

autoscale_y(axs[1]) 

axs[0].set_title('Rescaled x-axis') 
axs[1].set_title('Rescaled x-axis\nand used "autoscale_y"') 

plt.show() 

enter image description here

+0

में इतना आसान यह महान है था, लेकिन यह विफल रहता है अगर साजिश में axhline() है। मैं इसे ट्यून करने की कोशिश करूंगा क्योंकि यह वही है जो मैं चाहता हूं। –

+0

मैं प्रतिस्थापित y_displayed = यार्ड [((xd> = लो) और (xd <= हाय))] के साथ अगर LEN (xd) == 2 और xd [0] == 0.0 और xd [1] == 1.0: y_displayed = yd # विशेष केस axhline को संभालने के लिए: y_displayed = yd [((xd> = lo) और (xd <= hi))] –

+0

हां यह एक दयालु है कि कोई autoscale_axis नहीं है, शायद यह हो सकता है matplotlib के हालिया अपडेट में पहले ही लागू किया गया है। आपके योगदान के लिए धन्यवाद, मैं इसका उपयोग करता हूं और बहुत अच्छा काम करता हूं! हालांकि, यहां तक ​​कि जब आप मूल्यों की पूरी श्रृंखला को साजिश करना चाहते हैं और फिर ज़ूम इन करना चाहते हैं, तो @ जो किन्टन का समाधान बाएं पैनल की सभी रेंज और दाहिनी ओर मुखौटा मूल्यों की साजिश करके सरल है। – Hugo