python matplotlib "merge"用于多索引的x轴标签

标签 python matplotlib

我想“合并”多索引的第一级,即有一个居中的“USA”和“EU”而不是元组。

最小示例

df = pd.DataFrame(data={"region":["USA","USA","EU","EU"], "sctr":["HH","NFC","HH","NFC"], "values":[1,2,3,4]})
df = df.set_index(["region","sctr"])

fig, ax = plt.subplots(1,figsize=(8,6))
df.plot(kind="bar")
plt.xticks(rotation = 0)
plt.show()

输出 enter image description here

所需输出 使用 Excel,默认情况下(几乎)可以获得所需的输出:

enter image description here

理想的解决方案是简单、简短,并且在添加更多区域/扇区时不需要任何手动调整。

最佳答案

还有其他方法可以将x轴刻度分成两行:第一行从多索引中取出并制成列表;第二行由文本函数从多索引列表中放置。隐藏现有标签由绘图参数处理。

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame(data={"region":["USA","USA","EU","EU"], "sctr":["HH","NFC","HH","NFC"], "values":[1,2,3,4]})
df = df.set_index(["region","sctr"])

fig, ax = plt.subplots(1,figsize=(8,6))
df.plot(kind='bar', xlabel='', ax=ax)
ax.set_xticklabels(df.index.get_level_values(level=1).tolist(), rotation=0)

 for container in ax.containers:
    for i,child in enumerate(container.get_children()):
        if i == 0:
            ax.text(child.xy[0]+child.get_width(), -0.08, df.index.get_level_values(level=0)[0], ha='center', transform=ax.transAxes)
        elif i == 2:
            ax.text(child.xy[0]-(child.get_width()*2), -0.08, df.index.get_level_values(level=0)[2], ha='center', transform=ax.transAxes)

plt.show()

enter image description here

关于python matplotlib "merge"用于多索引的x轴标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66268828/

相关文章:

python - 如何从python中的字符串中提取 token ?

php - 提供从 Python 脚本到 PHP 的反馈

Python Matplotlib - 保存的图像在使用 for 循环时被覆盖

python - 使用 ord() 将字符串转换为 ascii

python - Ubuntu 和 Django,没有名为 'django' 的模块

python - 当泡沫工作完成时如何向自己发送电子邮件通知?

matplotlib - 更改 matplotlib quiver 函数的箭头样式

python - 使用对数刻度绘制 mplot3d/axes3D xyz 曲面图?

python - 使用实际数据在图上添加回归线

python - cm = plt.cm.RdBu 是什么意思?