使用循环在子图中使用groupby.sum创建小倍数?

问题描述 投票:0回答:1

我想为每个子图创建5×7的子图,以容纳34张线图。Planning Authority 以a轴为 Permission Financial Year 和y值为 sumNet additional units

我已经使用了 groupby.sum来计算每年各部门净增单位的总和,并手动创建了几个子图来说明。然而,我相信一定有一些更有效的方法,例如使用 loop 来自动简化所有图表的生成。

希望有人能帮忙。非常感谢。

enter image description hereenter 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])
python matplotlib pandas-groupby
1个回答
0
投票

你可以把你的代码替换在 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))
© www.soinside.com 2019 - 2024. All rights reserved.