2010-03-20 7 views
19

मैं Matplotlib में फॉर्म एफ (एक्स, वाई) = जी (एक्स, वाई) उदाहरण एक्स^वाई = वाई^एक्स) के अंतर्निहित समीकरणों को साजिश करना चाहता हूं। क्या यह संभव है?Matplotlib का उपयोग करके अंतर्निहित समीकरणों को साजिश करना संभव है?

उत्तर

18

मैं इसके लिए बहुत अच्छा समर्थन है पर विश्वास नहीं है, लेकिन आप contour के लिए API docs देखें

import matplotlib.pyplot 
from numpy import arange 
from numpy import meshgrid 

delta = 0.025 
xrange = arange(-5.0, 20.0, delta) 
yrange = arange(-5.0, 20.0, delta) 
X, Y = meshgrid(xrange,yrange) 

# F is one side of the equation, G is the other 
F = Y**X 
G = X**Y 

matplotlib.pyplot.contour(X, Y, (F - G), [0]) 
matplotlib.pyplot.show() 

की तरह कुछ की कोशिश कर सकते हैं: अगर चौथा तर्क एक दृश्य तो यह निर्दिष्ट करता है जो समोच्च पंक्तियों प्लॉट करने के लिए है । लेकिन साजिश केवल आपकी श्रेणियों के संकल्प के रूप में उतनी ही अच्छी होगी, और कुछ विशेषताओं को कभी भी सही नहीं मिल सकता है, अक्सर स्वयं-छेड़छाड़ बिंदुओं पर।

+0

यह एक अच्छा उपाय है। मेरा समाधान एक ही अंतर्निहित अवधारणा का उपयोग करके सूचना के एक ही टुकड़े को प्राप्त करने का एक और अधिक मैन्युअल तरीका है: एफ (एक्स, वाई) के रूप में अंतर्निहित समीकरण स्थापित करना जैसे कि एफ (एक्स, वाई) = 0 मूल निहित समीकरण के बराबर है और इसके शून्य समोच्च को अलग करना। –

6

matplotlib समीकरणों को साजिश नहीं देता है; यह अंक की श्रृंखला plots। आप scipy​.optimize जैसे टूल का उपयोग कर सकते हैं ताकि संख्यात्मक मानों के x मानों (या इसके विपरीत) से संख्यात्मक रूप से गणना की जा सके या संख्यात्मक रूप से अन्य टूल की संख्या।


उदाहरण के लिए, यहाँ एक उदाहरण है जहां मैं एक निश्चित क्षेत्र में निहित समीकरण x ** 2 + x * y + y ** 2 = 10 साजिश है।

from functools import partial 

import numpy 
import scipy.optimize 
import matplotlib.pyplot as pp 

def z(x, y): 
    return x ** 2 + x * y + y ** 2 - 10 

x_window = 0, 5 
y_window = 0, 5 

xs = [] 
ys = [] 
for x in numpy.linspace(*x_window, num=200): 
    try: 
     # A more efficient technique would use the last-found-y-value as a 
     # starting point 
     y = scipy.optimize.brentq(partial(z, x), *y_window) 
    except ValueError: 
     # Should we not be able to find a solution in this window. 
     pass 
    else: 
     xs.append(x) 
     ys.append(y) 

pp.plot(xs, ys) 
pp.xlim(*x_window) 
pp.ylim(*y_window) 
pp.show() 
1

कई धन्यवाद स्टीव, माइक, एलेक्स। मैं स्टीव के समाधान के साथ चला गया है (कृपया नीचे कोड देखें)। मेरा एकमात्र शेष मुद्दा यह है कि एक नियमित साजिश के विपरीत, मेरी ग्रिडलाइन के पीछे समोच्च साजिश दिखाई देती है, जिसे मैं ज़ॉर्डर के साथ आगे बढ़ सकता हूं। किसी और हल्प की सराहना की।

चीयर्स, Geddes

import matplotlib.pyplot as plt 
from matplotlib.ticker import MultipleLocator, FormatStrFormatter 
import numpy as np 

fig = plt.figure(1) 
ax = fig.add_subplot(111) 

# set up axis 
ax.spines['left'].set_position('zero') 
ax.spines['right'].set_color('none') 
ax.spines['bottom'].set_position('zero') 
ax.spines['top'].set_color('none') 
ax.xaxis.set_ticks_position('bottom') 
ax.yaxis.set_ticks_position('left') 

# setup x and y ranges and precision 
x = np.arange(-0.5,5.5,0.01) 
y = np.arange(-0.5,5.5,0.01) 

# draw a curve 
line, = ax.plot(x, x**2,zorder=100) 

# draw a contour 
X,Y=np.meshgrid(x,y) 
F=X**Y 
G=Y**X 
ax.contour(X,Y,(F-G),[0],zorder=100) 

#set bounds 
ax.set_xbound(-1,7) 
ax.set_ybound(-1,7) 

#produce gridlines of different colors/widths 
ax.xaxis.set_minor_locator(MultipleLocator(0.2)) 
ax.yaxis.set_minor_locator(MultipleLocator(0.2)) 
ax.xaxis.grid(True,'minor',linestyle='-') 
ax.yaxis.grid(True,'minor',linestyle='-') 

minor_grid_lines = [tick.gridline for tick in ax.xaxis.get_minor_ticks()] 
for idx,loc in enumerate(ax.xaxis.get_minorticklocs()): 
    if loc % 2.0 == 0: 
     minor_grid_lines[idx].set_color('0.3') 
     minor_grid_lines[idx].set_linewidth(2) 
    elif loc % 1.0 == 0: 
     minor_grid_lines[idx].set_c('0.5') 
     minor_grid_lines[idx].set_linewidth(1) 
    else: 
     minor_grid_lines[idx].set_c('0.7') 
     minor_grid_lines[idx].set_linewidth(1) 

minor_grid_lines = [tick.gridline for tick in ax.yaxis.get_minor_ticks()] 
for idx,loc in enumerate(ax.yaxis.get_minorticklocs()): 
    if loc % 2.0 == 0: 
     minor_grid_lines[idx].set_color('0.3') 
     minor_grid_lines[idx].set_linewidth(2) 
    elif loc % 1.0 == 0: 
     minor_grid_lines[idx].set_c('0.5') 
     minor_grid_lines[idx].set_linewidth(1) 
    else: 
     minor_grid_lines[idx].set_c('0.7') 
     minor_grid_lines[idx].set_linewidth(1) 

plt.show() 
+0

@Geddes, ऐसा लगता है कि समोच्च सम्मान ज़ेडर के लिए समर्थन हाल ही में matplotlib स्रोत में जोड़ा गया है। उनके एसवीएन ट्रंक से: http://matplotlib.svn.sourceforge.net/viewvc/matplotlib?देखें = rev & revision = 8098 – Mark

14

आप sympy के साथ इस सवाल टैग किया है के बाद से, मैं इस तरह के एक उदाहरण दे देंगे।

प्रलेखन से: http://docs.sympy.org/modules/plotting.html

from sympy import var, Plot 
var('x y') 
Plot(x*y**3 - y*x**3) 
+1

ऐसा लगता है कि नया वाक्यविन्यास 'plot_implicit (eq (x ** 5 + y ** 5, 1)) है, और नया दस्तावेज़ लिंक [यहां है] (http: //docs.sympy .org/नवीनतम/मॉड्यूल/plotting.html)। –

4

सिम्पी में एक अंतर्निहित समीकरण (और असमानता) प्लॉटटर है। यह जीएसओसी के एक हिस्से के रूप में बनाया गया है और यह भूखंडों को matplotlib आकृति उदाहरण के रूप में पैदा करता है। http://docs.sympy.org/latest/modules/plotting.html#sympy.plotting.plot_implicit.plot_implicit

पर

डॉक्स sympy संस्करण 0.7.2 यह उपलब्ध है के रूप में के बाद से:

>>> from sympy.plotting import plot_implicit 
>>> p = plot_implicit(x < sin(x)) # also creates a window with the plot 
>>> the_matplotlib_axes_instance = p._backend._ax 
+0

ऐसा लगता है कि यह अब जारी किया गया है। :) –

+0

आपका 'the_matplotlib_axes_instance' कहां से आ रहा है? – theV0ID

+0

'पी' आपके द्वारा बनाई गई साजिश है। 'p._backend._ax' धुरी उदाहरण होगा और यदि आप चाहें तो आप इसे एक नए चर में संदर्भित कर सकते हैं और किसी भी matplotlib अक्ष उदाहरण का उपयोग करने के लिए इसका उपयोग कर सकते हैं। – Krastanov

संबंधित मुद्दे