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()