2009-03-15 19 views
8

में स्वतंत्र स्केलिंग के साथ एकाधिक ओवरलैपिंग प्लॉट्स में वर्तमान में कोड है जो एक ही स्क्रीन पर डेटा के एकाधिक सेट प्रदर्शित करने के लिए matplotlib.pylab.plot कई बार कॉल करता है, और सभी प्लॉट्स पर विचार करते हुए मैटलप्लिब प्रत्येक वैश्विक न्यूनतम और अधिकतम तक स्केल करता है। क्या यह एक साजिश है कि प्रत्येक साजिश को स्वतंत्र रूप से, उस विशेष साजिश के न्यूनतम और अधिकतम तक स्केल करने के लिए कहें?Matplotlib

उत्तर

3

इस के लिए कोई सीधा समर्थन नहीं है, लेकिन यहाँ है कि दो स्वतंत्र ऊर्ध्वाधर अक्ष illlustrates एक mailing list posting से कुछ कोड है:

x=arange(10) 
y1=sin(x) 
y2=10*cos(x) 

rect=[0.1,0.1,0.8,0.8] 
a1=axes(rect) 
a1.yaxis.tick_left() 
plot(x,y1) 
ylabel('axis 1') 
xlabel('x') 

a2=axes(rect,frameon=False) 
a2.yaxis.tick_right() 
plot(x,y2) 
a2.yaxis.set_label_position('right') 
ylabel('axis 2') 
a2.set_xticks([]) 
+0

मूल प्रश्न का दायरा 2 स्केल किए गए भूखंडों की बजाय एन के लिए किया गया है - जब मैं 3 या उससे अधिक की कोशिश करता हूं तो यह मर जाता है (अतिरिक्त अक्ष उदाहरणों के लिए ए 2, ए 3 और इतने पर उपयोग करना।) कोई विचार कैसे प्राप्त करें एक बार में ठीक से स्केल किए गए डेटासेट का एक पूरा समूह? – tehwalrus

0

इस तरह आप एक ही प्लॉट बनाने है (add_subplot (1,1,1)) और y-axes पर पैमाने को सीमित करें।

myFig = figure() 
myPlot = self.figure.add_subplot(1,1,1) 
myPlot.plot([1,2,3,4,5], [5,4,3,2,1], '+r') 
myPlot.set_ylim(1,5) # Limit y-axes min 1, max 5 
0

मुझे ऐसा कुछ चाहिए लेकिन एक ऐसा उदाहरण बनाना चाहता था जिसे आप इंटरैक्टिव खोल में कॉपी और पेस्ट कर सकें और इसे देखें। यहाँ यह आप में से जो एक काम कर समाधान की आवश्यकता होती है के लिए है:

from numpy import arange 
from math import sin, cos 
import matplotlib.pyplot as plt 

x = arange(10) 
y1 = [sin(i) for i in x] 
y2 = [10*cos(i) for i in x] 

rect = [0.1, 0.1, 0.8, 0.8] 
a1 = plt.axes(rect) # Create subplot, rect = [left, bottom, width, height] in normalized (0, 1) units 
a1.yaxis.tick_left() # Use ticks only on left side of plot 
plt.plot(x, y1) 
plt.ylabel('axis 1') 
plt.xlabel('x') 

a2 = plt.axes(rect, frameon=False) # frameon, if False, suppress drawing the figure frame 
a2.yaxis.tick_right() 
plt.plot(x, y2) 
a2.yaxis.set_label_position('right') 
plt.ylabel('axis 2') 
a2.set_xticks([]) 

plt.show() 

परीक्षण किया गया और अजगर 2.7.6, numpy 1.8.1, matpotlib 1.3.1 में काम करता है। मैं इसके साथ खेलना जारी रखूंगा, ओवरलेइंग डेट प्लॉट के साथ काम करने के लिए एक साफ तरीका तलाश रहा हूं। मैं अपने निष्कर्ष वापस पोस्ट करूंगा।

0

यहां डेट प्लॉट का उपयोग करके एक समाधान है, और मुझे लगता है कि यह दूसरा वाई अक्ष जोड़ने के लिए twinx() का उपयोग करके सबसे अनुकूलित समाधान है।

import matplotlib.pyplot as plt 
import matplotlib.dates as md 
import datetime 
import numpy 
numpy.random.seed(0) 
t = md.drange(datetime.datetime(2012, 11, 1), 
      datetime.datetime(2014, 4, 01), 
      datetime.timedelta(hours=1)) # takes start, end, delta 
x1 = numpy.cumsum(numpy.random.random(len(t)) - 0.5) * 40000 
x2 = numpy.cumsum(numpy.random.random(len(t)) - 0.5) * 0.002 
fig = plt.figure() 
ax1 = fig.add_subplot(111) 
fig.suptitle('a title', fontsize=14) 
fig.autofmt_xdate() 
plt.ylabel('axis 1') 
plt.xlabel('dates') 
ax2 = ax1.twinx() 
ax1.plot_date(t, x1, 'b-', alpha=.65) 
ax2.plot_date(t, x2, 'r-', alpha=.65) 
plt.ylabel('axis 2') 
plt.show() 

डॉक्स से, matplotlib.pyplot.twinx (कुल्हाड़ी = कोई नहीं) एक दूसरे कुल्हाड़ियों कि x- अक्ष के शेयरों बनाओ। नई अक्ष ओवरले कुल्हाड़ी (या कुल्हाड़ी अगर कोई अक्ष नहीं है)। Ax2 के लिए टिक दाईं ओर रखे जाएंगे, और ax2 इंस्टेंस वापस कर दिया जाएगा। अधिक here