Как вывести 2 графика с разными масштабами по вертикальной оси на одной плоскости в Matplotlib python?
Дорогие форумчане! Я в ступоре, подскажите пожалуйста.
Пока выводится так:
Видимо проблема в разности значений по оси Oy. Как решить эту проблему?
Вот код:
from matplotlib import pyplot as plt
import numpy as np
a=3
c=2
b=10**(-3)
M=5*(10**(5))
B=2*(10**(-5))
#первая функция системы уравнений
def F_x_t(x,y):
return a*x*(1-x/M) - b*x*y
#вторая функция системы уравнений
def F_y_t(x,y):
return -c*y + B*x*y
def Runge_Kutta(h):
len_t = int(10/h)
for i in range(0 , len_t):
t_h.append(t_h[i]+h)
for i in range(1, len_t + 1):
prognoz_x_t.insert(i, x_t[i-1] + h * F_x_t(t_h[i-1], x_t[i-1]) ) # Считаем прогноз для х
x_t.insert(i, x_t[i-1] + h/2 * ( F_x_t(t_h[i-1], x_t[i-1]) + F_x_t(t_h[i], prognoz_x_t[i]) ) ) # считаем коррекцию для х
prognoz_y_t.insert(i, y_t[i-1] + h * F_y_t(t_h[i-1], y_t[i-1]) ) # Считаем прогноз для y
y_t.insert(i, y_t[i-1] + h/2 * ( F_y_t(t_h[i-1], y_t[i-1]) + F_y_t(t_h[i], prognoz_y_t[i]) ) ) # считаем коррекцию для y
h=h/2
prognoz_x_t_2.insert(i, x_t[i-1] + h * F_x_t(t_h[i-1], x_t[i-1]) ) # Считаем прогноз для х
x_t_2.insert(i, x_t[i-1] + h/2 * ( F_x_t(t_h[i-1], x_t[i-1]) + F_x_t(t_h[i], prognoz_x_t_2[i]) ) ) # считаем коррекцию для х
prognoz_y_t_2.insert(i, y_t[i-1] + h * F_y_t(t_h[i-1], y_t[i-1]) ) # Считаем прогноз для y
y_t_2.insert(i, y_t[i-1] + h/2 * ( F_y_t(t_h[i-1], y_t[i-1]) + F_y_t(t_h[i], prognoz_y_t_2[i]) ) ) # считаем коррекцию для y
prognoz_x_t = ['null']
prognoz_y_t = ['null']
prognoz_x_t_2 = ['null']
prognoz_y_t_2 = ['null']
x_t = [10**5]
y_t = [10**3]
x_t_2 = [10**5]
y_t_2 = [10**3]
t_h = [0]
h = 1
count = 0
while True:
Runge_Kutta(h)
count+=1
pogreshnost_x = (abs(x_t[-1] - x_t_2[-1]))/3
pogreshnost_y = (abs(y_t[-1] - y_t_2[-1]))/3
if(pogreshnost_x <= 5 and pogreshnost_y <= 5 ):
break
else:
h = h/2
print(f'Прогноз x: {prognoz_x_t}')
print(f'x(t): {x_t}')
print(f'Прогноз y: {prognoz_y_t}')
print(f'y(t): {y_t}')
print('-------------------------------------- h/2 ------------------------------------------------------------------------------------------------------------------------')
print(f'Прогноз x_2: {prognoz_x_t_2}')
print(f'x(t)_2: {x_t_2}')
print(f'Прогноз y_2: {prognoz_y_t_2}')
print(f'y(t)_2: {y_t_2}')
print(f'count = {count}')
plt.plot(t_h, y_t_2, label = 'y(t)')
plt.plot(t_h, x_t_2, label='x(t)')
plt.legend()
plt.show()
Ответы (2 шт):
Автор решения: CrazyElf
→ Ссылка
Примерно так можно через subplots:
fig, (ax1,ax2) = plt.subplots(2, 1, sharex=True)
ax1.plot(t_h, x_t_2, label= 'x(t)')
ax2.plot(t_h, y_t_2, label = 'y(t)')
ax1.legend()
ax2.legend()
plt.show()
Спасибо strawdog, с легендой разобрался.
Адаптировал ещё решение passant для вашего случая:
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(t_h, x_t_2, label= 'x(t)')
ax2.plot(t_h, y_t_2, label = 'y(t)', color='darkred')
ax1.set_ylabel('x(t)')
ax2.set_ylabel('y(t)', color='darkred')
plt.show()
Автор решения: passant
→ Ссылка
Если вам надо именно два разномасштабных графика на одном поле, то примерно вот так:
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(0, 100)
a=x*0.01
b=np.sqrt(x)
fig, ax = plt.subplots()
ax1 = ax.twinx()
ax.plot(x,a,color='r')
ax1.plot(x,b,color='b')
ax.set_ylabel('Для красного графика')
ax1.set_ylabel('Для синего графика')



