A.凱 2023-11-28 21:53 采纳率: 85.7%
浏览 13
已结题

Python怎么画pivot chart,x轴有多个标签

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

img

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-11-28 21:54
    关注

    引自强大而免费的微信小程序:皆我百晓生

    要在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方法显示图形。

    请根据自己的数据和要求,对代码进行适当的修改和调整。希望这可以帮助到您!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月6日
  • 已采纳回答 11月28日
  • 赞助了问题酬金20元 11月28日
  • 修改了问题 11月28日
  • 展开全部