子图循环
Loop for subplot
这几天我一直在处理这个问题。我有一个按月获取信息的循环。我尝试将它们放在一个图中(子图 1 = 第 1 个月,子图 2 = 第 2 个月,依此类推),但是我在每个子图中都得到了最后一个月。我错过了什么?
我的代码是:
import warnings
import matplotlib.cbook
warnings.filterwarnings("ignore",category=matplotlib.cbook.mplDeprecation)
plt.figure(0)
for m in range(1,13):
for i in range(4):
for j in range(3):
ax = plt.subplot2grid((4,3), (i,j))
DF_sub = DF[DF['months'] == m]
out = pd.cut(DF_sub['trip'], bins=[0, 0.25, 0.5, 0.75, 1], include_lowest=True)
out_norm = out.value_counts(sort=False, normalize=True)
ax = out_norm.plot.bar(rot=0, color="b", figsize=(6,4))
plt.xticks([])
plt.title('Month-' + str(m))
plt.show()
您遍历了几个月(1 到 12),但在每个月内,您再次遍历 i 和 j,这意味着您在重复一遍又一遍地策划某事。
你可以做的是从 0 到 11 迭代,定义月份和每次迭代中绘图的位置。首先是一些数据:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123)
DF = pd.DataFrame({"months":np.random.choice(np.arange(1,13),100),
"trip": np.random.uniform(size=100)
})
然后是定义的情节,很可能你不需要标签:
fig, axs = plt.subplots(4, 3)
fig.tight_layout()
months = np.arange(1,13)
labels= ['bin1','bin2','bin3','bin4']
bins = [0, 0.25, 0.5, 0.75, 1]
for m in range(len(months)):
i = m % 4
j = int(m/4)
DF_sub = DF[DF['months'] == months[m]]
out = pd.cut(DF_sub['trip'], bins=bins,
labels=labels,include_lowest=True)
out_norm = out.value_counts(sort=False, normalize=True)
ax = axs[i,j]
ax.bar(x=labels,height=np.array(out_norm))
ax.title.set_text('Month-' + str(months[m]))
ax.set_xticks([])
plt.show()
一个快速的替代方法是使用 seaborn:
import seaborn as sns
DF['bins'] = pd.cut(DF['trip'], bins=bins,labels=labels,include_lowest=True)
counts = pd.crosstab(DF.months,DF.bins,normalize='index')
counts = counts.unstack().reset_index().rename(columns={0:"value"})
g = sns.FacetGrid(counts, col="months",aspect=.7,col_wrap=3)
g.map(sns.barplot, "bins", "value")
这几天我一直在处理这个问题。我有一个按月获取信息的循环。我尝试将它们放在一个图中(子图 1 = 第 1 个月,子图 2 = 第 2 个月,依此类推),但是我在每个子图中都得到了最后一个月。我错过了什么?
我的代码是:
import warnings
import matplotlib.cbook
warnings.filterwarnings("ignore",category=matplotlib.cbook.mplDeprecation)
plt.figure(0)
for m in range(1,13):
for i in range(4):
for j in range(3):
ax = plt.subplot2grid((4,3), (i,j))
DF_sub = DF[DF['months'] == m]
out = pd.cut(DF_sub['trip'], bins=[0, 0.25, 0.5, 0.75, 1], include_lowest=True)
out_norm = out.value_counts(sort=False, normalize=True)
ax = out_norm.plot.bar(rot=0, color="b", figsize=(6,4))
plt.xticks([])
plt.title('Month-' + str(m))
plt.show()
您遍历了几个月(1 到 12),但在每个月内,您再次遍历 i 和 j,这意味着您在重复一遍又一遍地策划某事。
你可以做的是从 0 到 11 迭代,定义月份和每次迭代中绘图的位置。首先是一些数据:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123)
DF = pd.DataFrame({"months":np.random.choice(np.arange(1,13),100),
"trip": np.random.uniform(size=100)
})
然后是定义的情节,很可能你不需要标签:
fig, axs = plt.subplots(4, 3)
fig.tight_layout()
months = np.arange(1,13)
labels= ['bin1','bin2','bin3','bin4']
bins = [0, 0.25, 0.5, 0.75, 1]
for m in range(len(months)):
i = m % 4
j = int(m/4)
DF_sub = DF[DF['months'] == months[m]]
out = pd.cut(DF_sub['trip'], bins=bins,
labels=labels,include_lowest=True)
out_norm = out.value_counts(sort=False, normalize=True)
ax = axs[i,j]
ax.bar(x=labels,height=np.array(out_norm))
ax.title.set_text('Month-' + str(months[m]))
ax.set_xticks([])
plt.show()
一个快速的替代方法是使用 seaborn:
import seaborn as sns
DF['bins'] = pd.cut(DF['trip'], bins=bins,labels=labels,include_lowest=True)
counts = pd.crosstab(DF.months,DF.bins,normalize='index')
counts = counts.unstack().reset_index().rename(columns={0:"value"})
g = sns.FacetGrid(counts, col="months",aspect=.7,col_wrap=3)
g.map(sns.barplot, "bins", "value")