семейство кривых в matplotlib с константой [duplicate]

(См. обновленный ответ за 2016 год )

Я думаю, что вполне разумно хотеть выполнить действие, подождать, а затем выполнить другое действие. Если вы привыкли писать на многопоточных языках, у вас, вероятно, есть идея уступить выполнение на определенное количество времени, пока ваш поток не проснется.

Проблема в том, что JavaScript является однопоточным основанной на событиях. Хотя в конкретном случае было бы неплохо заставить весь двигатель ждать несколько секунд, в общем, это плохая практика. Предположим, я хотел использовать ваши функции при написании собственных? Когда я позвоню вашему методу, мои методы все замерзнут. Если JavaScript каким-то образом сохранит контекст выполнения вашей функции, сохраните его где-нибудь, затем верните его и продолжите позже, тогда может произойти сон, но это будет в основном потоком.

Таким образом, вы сильно зацикливаетесь на том, что другие предложили - вам нужно разбить код на несколько функций.

Тогда ваш вопрос немного ложный. Невозможно спать так, как вы хотите, и не следует предлагать решение, которое вы предлагаете.

24
задан Peter O. 26 June 2015 в 03:57
поделиться

7 ответов

Я не верю, что для этого есть очень хорошая поддержка, но вы можете попробовать что-то вроде

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

См. API docs для contour: если четвертый Аргумент - это последовательность, затем он указывает, какие контурные линии будут отображаться. Но сюжет будет только так хорош, как разрешение ваших диапазонов, и есть определенные возможности, которые он может никогда не получить правильно, часто в точках самопересечения.

20
ответ дан ubershmekel 23 August 2018 в 19:02
поделиться

Если вы хотите использовать что-то другое, кроме matplotlib (но все еще python), есть мудрец:

Пример: http://sagenb.org/home/pub/1806

Документация для implicit_plot

Домашняя страница Sage

2
ответ дан Alex 23 August 2018 в 19:02
поделиться

Большое спасибо Стив, Майк, Алекс. Я согласился с решением Стива (см. Код ниже). Моя единственная оставшаяся проблема заключается в том, что график контура появляется за моими линиями сетки, в отличие от обычного сюжета, который я могу заставить фронт с zorder.

Приветствия, Геддес

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()
1
ответ дан Geddes 23 August 2018 в 19:02
поделиться

В sympy имеется неявное уравнение (и неравенство). Он создается как часть GSoC и создает графики как экземпляры фигуры 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
4
ответ дан Krastanov 23 August 2018 в 19:02
поделиться

matplotlib не отображает уравнения; он отображает ряд точек. Вы можете использовать инструмент, подобный scipy​.optimize, для численного расчета y точек из значений 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()
7
ответ дан Mike Graham 23 August 2018 в 19:02
поделиться

Поскольку вы отметили этот вопрос с помощью sympy, я приведу такой пример.

Из документации: http://docs.sympy.org/latest/modules/plotting. html .

from sympy import var, plot_implicit
var('x y')
plot_implicit(x*y**3 - y*x**3)
17
ответ дан Peque 23 August 2018 в 19:02
поделиться

Примеры (с использованием контурного подхода) для всех конических сечений доступны в http://blog.mmast.net/conics-matplotlib

0
ответ дан soap262 23 August 2018 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: