Контурный график Matplotlib с условиями на кривой - PullRequest
0 голосов
/ 05 февраля 2020

Предположим, я хочу построить контур z=0, где z=(19*y^3-6*x*y-1). Я могу использовать следующий код:

x = np.linspace(-2,2,1000)
y = np.linspace(-1,1,1000)
X,Y = np.meshgrid(x,y)
z = (19)*Y**3-6*X*Y-1
plt.figure()
plt.contour(z,0)
plt.show()

Теперь я хочу отобразить часть кривой, где 3*19*y^2-6*x<0 в solid строке, и часть, где 3*19*y^2-6*x>0 в пунктирной линии. По сути, я делаю какой-то анализ устойчивости системы и хочу показать разные области кривой z=0 по-разному в зависимости от того, положительный или отрицательный dz/dy.

Что я могу придумать состоит в том, чтобы найти координаты двух частей самостоятельно и использовать график scatter, чтобы показать две части кривой, используя разные цвета (или стиль линий). Я также знаю, как это легко сделать в Mathematica. Мне просто интересно, есть ли в matplotlib более элегантное решение для этой работы.

1 Ответ

1 голос
/ 05 февраля 2020

Может быть, следующий подход интересен, хотя и не идеален?

Для условия 3*19*y^2-6*x>0 создается переменная z2. z2 стирается везде, кроме случаев, когда оно близко к z. Затем он окрашивается в красно-синюю карту цветов, красный для положительной части, синий для отрицательной и белый вокруг 0.

Фон установлен на черный, а цвет контура - на белый, чтобы было достаточно контрастность.

Обратите внимание, что для получения информативных осей как для графика contour, так и для imshow необходимо установить параметр extent.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2, 2, 1000)
y = np.linspace(-1, 1, 1000)
X, Y = np.meshgrid(x, y)
z = (19) * Y ** 3 - 6 * X * Y - 1
z2 = 3 * 19 * Y ** 2 - 6 * X
z2 = np.where(np.abs(z) < 0.2, z2, np.NaN)
plt.gca().set_facecolor('black')
plt.imshow(z2, cmap='coolwarm', vmin=-1, vmax=+1, alpha=1, extent=[-2, 2, -1, 1], origin='lower')
plt.contour(z, 0, extent=[-2, 2, -1, 1], zorder=3, colors='white')
plt.show()

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...