如何在python中为具有多个索引的数据框制作堆叠图?

Posted

技术标签:

【中文标题】如何在python中为具有多个索引的数据框制作堆叠图?【英文标题】:how to make stacked plots for dataframe with multiple index in python? 【发布时间】:2021-04-24 03:39:45 【问题描述】:

我有每周收集的贸易出口数据。我打算用matplotlib 制作堆积条形图,但管理具有多个索引的熊猫数据框几乎没有困难。我查看了this post,但无法得到我所期望的。任何人都可以建议在 python 中执行此操作的可能方法吗?似乎我进行了错误的数据聚合,我想我可能会使用for loop 来迭代年份,然后在每周的基础上制作堆积条形图。有谁知道如何在matplotlib 中使这更容易?有什么想法吗?

可重现的数据和我的尝试

import pandas as pd
import matplotlib.pyplot as plt

# load the data
url = 'https://gist.githubusercontent.com/adamFlyn/0eb9d60374c8a0c17449eef4583705d7/raw/edea1777466284f2958ffac6cafb86683e08a65e/mydata.csv'
df = pd.read_csv(url, parse_dates=['weekly'])
df.drop('Unnamed: 0', axis=1, inplace=True)

nn = df.set_index(['year','week'])
nn.drop("weekly", axis=1, inplace=True)

f, a = plt.subplots(3,1)
nn.xs('2018').plot(kind='bar',ax=a[0])
nn.xs('2019').plot(kind='bar',ax=a[1])
nn.xs('2020').plot(kind='bar',ax=a[2])
plt.show()
plt.close()

这个尝试对我不起作用。而不是像20182019,...这样明确选择年份,是否有更有效的方式为具有多个索引的数据框制作堆积条形图?有什么想法吗?

期望的输出

这是desired stacked bar plot for year of 2018 as an example

我应该如何获得我想要的堆积条形图?有更好的想法吗?

【问题讨论】:

【参考方案1】:

试试这个:

nn.groupby(level=0).plot.bar(stacked=True)

或防止年份作为 x 轴的元组:

for n, g in nn.groupby(level=0):
    g.loc[n].plot.bar(stacked=True)

在 cmets 中根据请求更新

for n, g in nn.groupby(level=0):
    ax = g.loc[n].plot.bar(stacked=True, title=f'n Year', figsize=(8,5))
    ax.legend(loc='lower center')

改变布局位置

fig, ax = plt.subplots(1,3)
axi = iter(ax)
for n, g in nn.groupby(level=0):
    axs = next(axi)
    g.loc[n].plot.bar(stacked=True, title=f'n', figsize=(15,8), ax=axs)
    axs.legend(loc='lower center')

【讨论】:

这也会将2018 传递给x-ticks。所以标签会写成(2018,1),... 有没有直接的方法可以去掉它? @ScottBoston 感谢更新的尝试。我们应该如何控制figsize,图例位置,并添加每年+一些字符串作为标题? 不应该将figsize 传递给subplots @QuangHoang 我认为你可以做到这一点。不过我不太确定。【参考方案2】:

尝试使用loc 而不是xs

f, a = plt.subplots(3,1)
for x, ax in zip(nn.index.unique('year'),a.ravel()):
    nn.loc[x].plot.bar(stacked=True, ax=ax)

【讨论】:

这太棒了!我应该如何控制图例位置(在每个堆叠图的顶部添加一个)并添加每个不同的年份 + 一些字符串作为标题?另外,我们如何保持每个子图之间的距离? 查看document 的subplots。您可以在 for 循环内为每个子图添加标题,例如ax.set_title('some title'). @Adam 你可以使用...plot.bar(stacked=True, ax=ax, title=f'n Year')

以上是关于如何在python中为具有多个索引的数据框制作堆叠图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在堆叠栏中为每个日期范围显示多个堆叠列

如何将单行与它自己的索引与未堆叠的多索引数据框结合起来?

在 ggplot 中为多个类别制作配对点

如何在ggplot lineplot中为具有相似颜色的多个子类着色?

python中的水平堆叠条形图在Jupyter Notebook中提供多个图表

Tableau 图表大全2.0之堆叠条形图制作