我有69台机器,每台机器都有12个月的生产数据。
我使用groupby.plot()将它们全部绘制出来,并获得了一长串视图。想知道如何进行紧凑的布局以便我可以一次查看它们吗?想要的结果是每行有7列和69/7行。请帮忙!
c1.groupby('System ID').plot(x='Month', y='Monthly Production',kind='bar',legend=True)
答案 0 :(得分:1)
这是我的最终答案。
# We can ask for ALL THE AXES and put them into axes
fig, axes = plt.subplots(nrows=10, ncols=7, sharex=True, sharey=False, figsize=(20,15))
axes_list = [item for sublist in axes for item in sublist]
ordered_systems = grouped['Monthly Production'].last().sort_values(ascending=False).index
# Now instead of looping through the groupby
# you CREATE the groupby
# you LOOP through the ordered names
# and you use .get_group to get the right group
grouped = c1.groupby("System ID")
first_month = c1['Month'].min()
last_month = c1['Month'].max()
for system in ordered_systems:
selection = grouped.get_group(system)
ax = axes_list.pop(0)
selection.plot(x='Month', y='Monthly Production', label=system, ax=ax, legend=False)
selection.plot(x='Month', y='Monthly Usage',secondary_y=True, ax=ax, legend=False)
ax.set_title(system)
ax.tick_params(
which='both',
bottom='off',
left='off',
right='off',
top='off'
)
ax.grid(linewidth=0.25)
ax.set_xlim((first_month, last_month))
ax.set_xlabel("")
ax.set_xticks((first_month, last_month))
ax.spines['left'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
# Now use the matplotlib .remove() method to
# delete anything we didn't use
for ax in axes_list:
ax.remove()
plt.subplots_adjust(hspace=1)
plt.tight_layout()
答案 1 :(得分:1)
我想我会添加一个使用seaborn的示例,因为在这种情况下它可能很有用,因为用它来按列包装内容非常容易。我希望有人可以提供更好的答案,也许可以使用熊猫,我希望他们能提供更好的答案。
import seaborn as sns
import pandas as pd
import numpy as np
np.random.seed(1)
N = 2000
df = pd.DataFrame(np.random.randint(0,4, (N,7)))
df['system'] = np.random.randint(0, 69, N )
其中df
为;
0 1 2 3 4 5 6 system
674 1 2 3 1 0 0 0 15
1699 0 0 1 3 0 0 1 9
1282 0 0 0 0 1 0 2 47
1315 0 3 1 3 1 1 1 37
1210 1 1 0 3 1 3 1 11
在绘制之前将数据融化:
df_plot = df.melt(id_vars='system')
看起来像
system variable value
8756 23 4 2
5474 24 2 2
11242 12 5 2
7820 56 3 3
然后
sns.catplot(x = 'variable', y = 'value', col = 'system',
hue = 'variable', dodge = False,
col_wrap = 6, data = df_plot, kind = 'bar', ci = False)