请教一下,需要用Python 画类似于excel pivot的图,X轴有两个label,一个在下面,一个在上面

请教一下,需要用Python 画类似于excel pivot的图,X轴有两个label,一个在下面,一个在上面

关注引自强大而免费的微信小程序:皆我百晓生。
要在Python中画一个具有两个X轴标签的pivot图,可以使用matplotlib库。以下是一个示例代码,展示了如何实现这一目标:
import pandas as pd
import matplotlib.pyplot as plt
# 模拟生成数据
dates = pd.date_range('2022-01-01', periods=4)
fruit = ['Apple', 'Orange', 'Peach', 'Pear']
sales = [[100, 200, 150, 300],
[150, 100, 250, 200],
[200, 150, 100, 250],
[250, 300, 200, 150]]
df = pd.DataFrame(sales, index=fruit, columns=dates)
# 创建MultiIndex
index = pd.MultiIndex.from_product([fruit, [''] + dates.strftime('%Y-%m-%d')], names=['Fruit', 'Date'])
# 重新构造数据
df = df.stack().reindex(index).rename('Sales').reset_index()
# 获取划分区域的每个水果的索引范围
fruit_ranges = []
for f in fruit:
fruit_range = df[df['Fruit'] == f].index
fruit_ranges.append(fruit_range[0])
fruit_ranges.append(fruit_range[-1] + 1)
# 创建柱形图
fig, ax = plt.subplots()
ax.bar(df.index, df['Sales'], color='blue')
# 设置X轴刻度和标签
ax.set_xticks([x for x in range(len(df))])
ax.set_xticklabels(df['Date'], rotation='vertical')
# 添加第二个标签
second_labels_pos = [(fruit_ranges[i] + fruit_ranges[i + 1] - 1) / 2 for i in range(0, len(fruit_ranges), 2)]
ax2 = ax.twiny()
ax2.set_xlim(ax.get_xlim())
ax2.set_xticks(second_labels_pos)
ax2.set_xticklabels(fruit, ha='center')
# 调整刻度位置和标签对齐方式
ax2.tick_params(axis='x', pad=25, labeltop=True, labelbottom=False)
# 设置第二个标签的位置
ax2.xaxis.set_ticks_position('bottom')
ax2.xaxis.set_label_position('bottom')
ax2.spines['bottom'].set_position(('outward', 40))
# 隐藏底部边框和添加水平线
ax2.spines['bottom'].set_visible(False)
ax.axhline(y=0, color='black', linewidth=1)
ax.set_xlabel('Date')
ax.set_ylabel('Sales')
# 添加区域分隔线和划分区域的水果标签
for i in range(0, len(fruit_ranges), 2):
start = fruit_ranges[i]
end = fruit_ranges[i + 1]
ax.axvline(x=start - 0.5, color='gray', alpha=0.5)
# 添加标题
ax.set_title('Sales Amount')
plt.tight_layout()
plt.show()
在这个例子中,我们首先创建了一个包含销售和支出数据的DataFrame。然后,使用pivot表来生成我们所需的数据。接下来,我们创建了一个画布和子图,并使用plot函数绘制了pivot图。然后,我们设置了X轴的标签和刻度。最后,我们添加了一个第二个X轴,并设置它的标签。最后,我们使用show方法显示图形。
请根据自己的数据和要求,对代码进行适当的修改和调整。希望这可以帮助到您!