使用数组

时间:2016-12-26 10:24:42

标签: python pandas seaborn

att_sales 表有3个字段 item qty yr_mon 存储桶(i) 函数返回20个SKU列表(项目值列表)。按功能分组用于查找每个SKU的月销售额 然后制作一个小提琴图。到目前为止,这项运动一直很好。

我试图想象出10个子图中大约200个SKU的月销售量。为此,我打算从1到10运行迭代器并填充每个子图。下面的代码填充10个空的最后一个子图那些。我该如何实现这一目标?

fig, (axis1) = plt.subplots(5,2,figsize=(15,30))
plt.xticks(rotation=45)
s=att_sales[['item','qty','yr_mon']]
s=s[s.item.isin(buckets(i))]
s=s.groupby(['item','yr_mon'], as_index=False).qty.sum()
sns.violinplot(x="item", y="qty", data=s)

Edit1 :关于@Ted的解决方案,当for循环从0运行到n时,我收到错误min() arg is an empty sequence。将for循环更改为在1和n之间运行,提供了大部分解决方案但不完全。enter image description here

我需要知道如何增加整个绘图和各个子图的大小,还要将xticks的方向更改为45度。

1 个答案:

答案 0 :(得分:1)

这是一个简化的示例,我认为您可以调整以使其适合您。我在seaborn中使用tips数据集,并根据它的日期绘制了4个不同的小提琴图。我还创建了一个桶函数,它返回一天的单个元素列表。

当使用fig, axes = plt.subplots(2,2,figsize=(10,10))创建图形时,它将返回存储在fig中的matplotlib图形对象和存储在axes中的2维numpy数组matplotlib轴对象。要获得左上图,您可以axes[0, 0]。如果你想要右下角的情节,你会做axes[1, 1]。如果你创建了一个5行2列的数字axes[3,0],那就是第4行和第1列的图。

# create function that will return a list of items
# this particular example returns just a list of one element
def buckets(i):
    return [tips.day.unique()[i]]

# load dataset and create figure
tips = sns.load_dataset("tips")
num_plots = 4
fig, axes = plt.subplots(2,2,figsize=(10,10))

# iterate through all axes and create a violin plot
for i in range(num_plots):
    df = tips[tips.day.isin(buckets(i))]
    row = i // 2
    col = i % 2
    ax_curr = axes[row, col]
    sns.violinplot(x="sex", y="tip", data=df, ax=ax_curr)
    ax_curr.set_title(buckets(i))

enter image description here

请注意,在此特定示例中,您可以使用构面网格,它将与我在单独的绘图中绘制每一天所做的完全相同。如果您将每个SKU桶标记为唯一ID,则可以利用构面网格。请参阅very last example on this page