import matplotlib.pyplot as plt
import numpy as np
# Данные (пример)
categories = ['Лесной фонд', 'Третьи лица', 'Госсобственность']
objects = ['Центральная часть', 'Вход в СПб', 'Вход в Москву']
# Данные по отводам (временный и постоянный) для каждого объекта
# Формат: [передано_временный, не_передано_временный, передано_постоянный, не_передано_постоянный]
data = {
'Центральная часть': [[70, 30, 80, 20], [50, 50, 60, 40], [80, 20, 90, 10]],
'Вход в СПб': [[60, 40, 70, 30], [40, 60, 50, 50], [70, 30, 80, 20]],
'Вход в Москву': [[50, 50, 60, 40], [30, 70, 40, 60], [60, 40, 70, 30]]
}
# Данные для центральной круговой диаграммы (Этап 1)
labels_center = ['Участок A', 'Участок B', 'Участок C']
sizes = [40, 30, 30] # Проценты
# Настройка стиля
plt.style.use('seaborn')
# Создание фигуры
fig = plt.figure(figsize=(12, 10))
ax = fig.add_subplot(111, polar=True)
# Углы для осей (3 категории ЗУ)
angles = np.linspace(0, 2*np.pi, len(categories), endpoint=False).tolist()
angles += angles[:1] # Замыкаем круг
# Цвета
colors_temp = ['#4CAF50', '#FFC107', '#2196F3'] # Зеленый, желтый, синий (временный)
colors_perm = ['#81C784', '#FFD54F', '#64B5F6'] # Светлые версии (постоянный)
# Рисуем данные для каждого объекта (3 оси)
for idx, obj in enumerate(objects):
# Смещение угла для каждой оси (120 градусов между объектами)
offset = np.pi / 3 * idx
adjusted_angles = [angle + offset for angle in angles[:-1]] + [angles[-1] + offset]
# Временный отвод (внутреннее кольцо)
for i, category in enumerate(categories):
values = data[obj][i]
ax.bar([adjusted_angles[i]], [values[0]], width=0.5, color=colors_temp[i], alpha=0.7, label='Передано' if idx == 0 and i == 0 else "")
ax.bar([adjusted_angles[i]], [values[1]], width=0.5, bottom=[values[0]], color='#FF5252', alpha=0.7, label='Не передано' if idx == 0 and i == 0 else "")
# Постоянный отвод (внешнее кольцо)
for i, category in enumerate(categories):
values = data[obj][i]
ax.bar([adjusted_angles[i]], [values[2]], width=0.5, color=colors_perm[i], alpha=0.7, label='_nolegend_')
ax.bar([adjusted_angles[i]], [values[3]], width=0.5, bottom=[values[2]], color='#FF5252', alpha=0.7, label='_nolegend_')
# Центральная круговая диаграмма
ax_pie = fig.add_axes([0.45, 0.45, 0.2, 0.2], polar=False)
ax_pie.pie(sizes, labels=labels_center, autopct='%1.1f%%', startangle=90, colors=['#FF9AA2', '#FFB7B2', '#FFDAC1'])
ax_pie.set_title('Общее количество участков', fontsize=10)
# Легенда и заголовок
handles, labels = ax.get_legend_handles_labels()
fig.legend(handles[:2], ['Передано', 'Не передано'], loc='upper right')
plt.title('Многослойная диаграмма статусов земельных участков', pad=20)
# Настройка осей
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
ax.set_yticklabels([]) # Убираем радиальные подписи
plt.tight_layout()
plt.show()