使用matplotlib在同一轴上绘制多条图

时间:2020-06-18 16:18:51

标签: python matplotlib

我正在使用matplotlib和python 3.7绘制费用报告,并将其分为几类。

目标是绘制多条图以逐年比较数据。

我找到了一种使用折线图的方法,但没有使用更合适的条形图,因为条形线彼此重叠。 enter image description here

这是用于生成该图的代码:

data = {'category 1': 120.50,
        'category 2': 135.59,
        'category 3': 130.71,
        'category 4': 150.71}
group_data = list(data.values())
group_names = list(data.keys())

fig, axs = plt.subplots(2)
axs[0].plot(group_names, group_data, label="2020")
axs[0].plot(group_names, [v * 1.1 for v in group_data], label="2019")

axs[1].bar(group_names, group_data, label="2020")
axs[1].bar(group_names, [v * 1.1 for v in group_data], label="2019")


axs[0].legend()

查看了官方文档(https://matplotlib.org/3.2.1/gallery/lines_bars_and_markers/categorical_variables.html),但找不到合适的解决方案。

2 个答案:

答案 0 :(得分:1)

您可以考虑使用熊猫来实现简单的绘图功能:

import pandas as pd

# 2020 data
df = pd.DataFrame({'2020':data})

# 2019 data
df['2019'] = df['2020'] * 1.1

# plot bar
df.plot.bar()

输出:

enter image description here

答案 1 :(得分:0)

您可以使用参数zorder来确定钢筋的堆叠顺序。高度较小的 条形图应具有较高的z顺序 ,以便它们显示在前面。

axs[1].bar(group_names, group_data, label="2020", zorder=1)
axs[1].bar(group_names, [v * 1.1 for v in group_data], label="2019", zorder=0)

enter image description here