Как вывести 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, с легендой разобрался.

вариант1

Адаптировал ещё решение 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()

вариант2

→ Ссылка
Автор решения: 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('Для синего графика')

Результат: введите сюда описание изображения

→ Ссылка