【问题标题】:how to plot two-levels of x-ticklabels with multiindex dataframe如何使用多索引数据框绘制两级 x-ticklabels
【发布时间】:2020-11-24 06:42:59
【问题描述】:

请参阅下图以获取测试数据集。我在左侧有数据集,然后我使用以下内容到达 test_df:

test_df1=test_df.groupby(['year','country','won/loss']).sum()
x=test_df1.pivot_table(index='year',columns=['country','won/loss'],values='value')
x=x.fillna(0)

我想绘制一个两层的 x-ticklabels 堆叠条形图,就像这里显示的那样(也显示在下图中): Plot two levels of x_ticklabels on a pandas multi-index dataframe

但我不知道如何将 test_df 数据转换为链接帖子中显示的形式,以及代码

ax.tick_params(axis='both', which='both', length=0)

在那个帖子中似乎不起作用。

有没有办法直接从 test_df 数据中绘制两级 x-ticklabels?或者我确实需要将它转换为上面提到的帖子中的格式?(怎么做?)以及如何设置x标签,所以test_df数据集中的文本“国家”和“年份”不显示。 X轴标签只是2010(3个国家)/2011(3个国家)/2012(3个国家)?

非常感谢您的帮助。

【问题讨论】:

  • 如果您仍然对使用 MultiIndex 获得解决方案感兴趣,请根据我在下面显示的条形图告诉我您想要的 x 轴的两个级别。然后,我可以扩展示例数据以创建类似于您共享的图像和链接的内容。

标签: python-3.x pandas


【解决方案1】:

目前尚不清楚您要使用什么变量来堆叠条形图,但无论如何,我假设您想要并排绘制每个国家/地区的胜负。示例数据不包含足够多的值以使 MultiIndex 数据帧有意义。例如,在 x 轴上使用“国家/地区”和“年份”以及“赢/输”值的并排条形将导致单个条形出现在 value = 0 不存在的条形旁边。

因此,在以下示例中,数据按年份汇总(在绘图之前可以看作是“堆叠数据”),并以并排显示每个国家/地区的输赢值总和。这可以通过以不同于您的方式旋转数据框来完成。另请注意,.groupby([...]).sum() 不是必需的。

import numpy as np   # v 1.19.2
import pandas as pd  # v 1.1.3

# Create sample dataset
rng = np.random.default_rng(seed=1)
country_names = ['Japan', 'Ireland', 'UK']
years_list = [2010, 2011, 2012]
years = np.tile(years_list, len(country_names))
countries = np.repeat(country_names, len(years_list))
won_loss = rng.choice(['won', 'loss'], size=countries.size)
values = rng.integers(1, 5, size=countries.size)

df = pd.DataFrame({'year': years,
                   'country': countries,
                   'won/loss': won_loss,
                   'value': values})
df

#     year  country  won/loss  value
#  0  2010    Japan       won      2
#  1  2011    Japan      loss      4
#  2  2012    Japan      loss      2
#  3  2010  Ireland      loss      2
#  4  2011  Ireland       won      4
#  5  2012  Ireland       won      2
#  6  2010       UK      loss      2
#  7  2011       UK      loss      3
#  8  2012       UK       won      3
df_pivot = df.pivot(index=['country', 'year'], columns='won/loss').fillna(0)
df_pivot

# Aggregate data by summing values of all years together
df_countries = df_pivot.groupby('country').sum()
df_countries.columns = df_countries.columns.droplevel(0)
df_countries

# Create grouped bar chart of won/loss values aggregated by country
ax = df_countries.plot.bar(rot=0, zorder=2)

# Format grid and spines
ax.grid(axis='y', zorder=1, color='black', alpha=0.3)
for spine in ['top', 'left', 'right']:
    ax.spines[spine].set_visible(False)
ax.spines['bottom'].set_alpha(0.3)

# Format x-axis labels
ax.set_xlabel(ax.get_xlabel(), labelpad=10)
ax.tick_params(axis='both', which='major', length=0, pad=10)

# Place legend outside of plot area
ax.legend(*ax.get_legend_handles_labels(), frameon=False,
          bbox_to_anchor=(1, 0.5), loc="center left");

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 2016-02-14
    • 2015-12-02
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    相关资源
    最近更新 更多