import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MultipleLocator
import matplotlib.dates as mdates
from datetime import datetime
Настройка стиля графиков
plt.style.use('ggplot')
plt.rcParams.update({'font.family': 'Arial', 'font.size': 10})
Создаем фигуру с тремя субграфиками
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 12))
fig.suptitle('Мониторинг Поля 1 (01.01.2025 - 21.05.2025)', fontsize=14, fontweight='bold')
1. График NDVI и влажности почвы
months = ['Янв', 'Фев', 'Мар', 'Апр', 'Май']
ndvi = [0.0, 0.05, 0.15, 0.22, 0.28]
moisture = [95, 85, 70, 60, 54]
Создаем двойные оси
ax1b = ax1.twinx()
ax1.plot(months, moisture, 'o-', color='#1f77b4', linewidth=2, markersize=8, label='Влажность почвы')
ax1b.plot(months, ndvi, 's-', color='#2ca02c', linewidth=2, markersize=8, label='NDVI')
Заливка для NDVI
ax1b.fill_between(months, ndvi, color='#2ca02c', alpha=0.1)
Настройка осей и меток
ax1.set_ylabel('Влажность почвы (%)', color='#1f77b4')
ax1b.set_ylabel('NDVI', color='#2ca02c')
ax1.tick_params(axis='y', colors='#1f77b4')
ax1b.tick_params(axis='y', colors='#2ca02c')
ax1.set_title('Динамика NDVI и влажности почвы', pad=15)
Горизонтальные линии для индикации уровней
ax1.axhline(y=70, color='#1f77b4', linestyle='--', alpha=0.3)
ax1.text(4.5, 72, 'Переувлажнение', color='#1f77b4', ha='right')
ax1.axhline(y=40, color='#1f77b4', linestyle='--', alpha=0.3)
ax1.text(4.5, 42, 'Оптимум', color='#1f77b4', ha='right')
ax1b.axhline(y=0.2, color='#2ca02c', linestyle='--', alpha=0.3)
ax1b.text(4.5, 0.21, 'Начало вегетации', color='#2ca02c', ha='right')
2. График температуры с зонами заморозков
min_temps = [-32, -25, -10, -2, 5]
ax2.plot(months, min_temps, 'o-', color='#d62728', linewidth=2, markersize=8)
ax2.set_ylabel('Температура (°C)')
ax2.set_title('Минимальная температура воздуха', pad=15)
Заливка зоны заморозков
ax2.fill_between(months, min_temps, [0]*5,
where=np.array(min_temps) < 0,
color='#8c8c8c', alpha=0.3, label='Зона заморозков')
Отметка критической точки
ax2.plot('Апр', -2, 'rx', markersize=12, markeredgewidth=2, label='Критическая точка заморозков')
ax2.axvline(x=2.7, color='r', linestyle='--', alpha=0.5) # Март-Апрель
ax2.text(2.8, -20, 'Середина апреля\n(конец заморозков)', color='r', va='center')
3. График продуктивной влаги
april_may = ['Апр', 'Май']
productive_moisture = [80, 61.1]
ax3.bar(april_may, productive_moisture, color='#ff7f0e', alpha=0.7)
ax3.set_ylabel('Продуктивная влага (мм)')
ax3.set_title('Доступная растениям влага', pad=15)
ax3.set_ylim(0, 100)
Порог полива
ax3.axhline(y=70, color='r', linestyle='--')
ax3.text(1.7, 72, 'Порог полива (70 мм)', color='r', ha='right')
ax3.text(0, 85, '80 мм', ha='center', va='bottom', fontweight='bold')
ax3.text(1, 65, '61.1 мм', ha='center', va='bottom', fontweight='bold')
Общие настройки
for ax in (ax1, ax2, ax3):
ax.grid(True, linestyle='--', alpha=0.7)
ax.set_xlabel('Месяцы')
Добавление легенд
ax1.legend(loc='upper left', frameon=True)
ax1b.legend(loc='upper right', frameon=True)
ax2.legend(loc='lower right', frameon=True)
plt.tight_layout()
plt.subplots_adjust(top=0.93, hspace=0.3)
plt.savefig('crop_monitoring_field1.png', dpi=300, bbox_inches='tight')
plt.show()