Использовать циклы для создания небольших кратных в подзаголовках с groupby.sum? - PullRequest
0 голосов
/ 05 мая 2020

Я хотел бы создать подзаголовки 5 x 7 для размещения 34 линейных диаграмм для каждого Planning Authority с осью a как Permission Financial Year и значением y как sum из Net additional units

I использовали groupby .sum, чтобы узнать сумму net дополнительных единиц каждым органом власти за каждый год, и вручную создали несколько подзаголовков для иллюстрации. Однако я уверен, что должны быть более эффективные способы, такие как использование loop для автоматизации / упрощения создания всех диаграмм.

Надеюсь, кто-нибудь сможет помочь. Большое спасибо.

enter image description here enter image description here

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from numpy.random import randint
from numpy.random import randint

pd.set_option('display.max_colwidth', 0)

df = pd.read_csv('LDD Permissions for Datastore - Final selected updated 19.04.2020 - including checked05.05 -used.csv', encoding='mac_roman')

#Aggregate the sum of net additional units by Permission Fianacial Year and Planning Authority
pd.set_option('display.max_rows', 1000)
total_permitted_unit_per_year = df.groupby(['Permission Financial Year','Planning Authority']).sum()['Net additional units'].unstack(-1)

#Generate subplots of net additional units from 2009 to 2019 for each Planning Authority
plt.rc('xtick',labelsize=10)
plt.rc('ytick',labelsize=10)

fig = plt.figure()
plt.figure(figsize=(200, 800))

ax1 = fig.add_subplot(7,5,1)
ax2 = fig.add_subplot(7,5,2)
ax3 = fig.add_subplot(7,5,3)
ax4 = fig.add_subplot(7,5,4)
ax5 = fig.add_subplot(7,5,5)
ax6 = fig.add_subplot(7,5,6)
ax7 = fig.add_subplot(7,5,7)
ax8 = fig.add_subplot(7,5,8)
ax9 = fig.add_subplot(7,5,9)
ax10 = fig.add_subplot(7,5,10)
ax11 = fig.add_subplot(7,5,11)
ax12 = fig.add_subplot(7,5,12)

total_permitted_unit_per_year.plot(y='Barking and Dagenham', ax=ax1, legend=False, marker='.', markersize=5, figsize=(30,15))
ax1.set_title('Barking and Dagenham')
ax1.set_ylim([0, 350])

total_permitted_unit_per_year.plot(y='Barnet', ax=ax2, legend=False, marker='.', markersize=5, figsize=(30,15))
ax2.set_title('Barnet')
ax2.set_ylim([0, 350])

total_permitted_unit_per_year.plot(y='Bexley', ax=ax3, legend=False, marker='.', markersize=5, figsize=(30,15))
ax3.set_title('Bexley')
ax3.set_ylim([0, 350])

total_permitted_unit_per_year.plot(y='Sutton', ax=ax4, legend=False, marker='.', markersize=5, figsize=(30,15))
ax4.set_title('Sutton')
ax4.set_ylim([0, 350])

total_permitted_unit_per_year.plot(y='Merton', ax=ax5, legend=False, marker='.', markersize=5)
ax5.set_title("Merton")
ax5.set_ylim([0, 350])

1 Ответ

0 голосов
/ 05 мая 2020

Вы можете заменить свой код после строки plt.figure на:

for col_num in range(1, 13):
    ax = fig.add_subplot(7, 5, col_num)
    ax.set_title(total_permitted_unit_per_year.columns[col_num])
    ax.set_ylim([0, 350])
    total_permitted_unit_per_year.plot(y=total_permitted_unit_per_year.columns[col_num], ax=ax, legend=False, marker='.', markersize=5, figsize=(30,15))

Замените 13 количеством столбцов, которые вы хотите построить + 1, что может быть просто len(total_permitted_unit_per_year.columns)+1

Если вы хотите просто построить определенные столбцы в определенном порядке, сделайте что-то вроде этого:

pa = ['Croyden', ... ] # fill it out with the column names
for i in range(len(pa)):
    ax = fig.add_subplot(7, 5, i)
    ax.set_title(pa[i])
    ax.set_ylim([0, 350])
    total_permitted_unit_per_year.plot(y=pa[i], ax=ax, legend=False, marker='.', markersize=5, figsize=(30,15))
...