如何在同一柱状图中绘制多组数据(qtd与monetary)?
解决方案:将两组数据合并到同一柱状图
你当前代码调用了两次df.plot(),每次都会生成独立的图表,所以出现两个分开的柱状图。要合并只需调用一次绘图方法,并指定要展示的两个y轴列。考虑到qtd和monetary两组数据量级差异极大(前者0-20,后者最高近10000),直接单y轴展示会导致qtd的柱子几乎不可见,因此推荐使用双y轴方案:
双y轴合并柱状图(推荐)
import pandas as pd import matplotlib.pyplot as plt import random plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True df = pd.DataFrame(dict( year=range(2010,2021), qtd=[int(random.random() * 20) for x in range(2010,2021)], monetary=[int(random.random() * int(random.random() * 10000)) for x in range(2010,2021)]) ) fig, ax1 = plt.subplots() # 左侧y轴绘制qtd color = 'tab:blue' ax1.set_xlabel('年份') ax1.set_ylabel('数量(Qtd)', color=color) df.plot(x="year", y='qtd', kind='bar', ax=ax1, color=color, position=0, width=0.4) ax1.tick_params(axis='y', labelcolor=color) # 右侧y轴绘制monetary ax2 = ax1.twinx() color = 'tab:orange' ax2.set_ylabel('金额(Monetary)', color=color) df.plot(x="year", y='monetary', kind='bar', ax=ax2, color=color, position=1, width=0.4) ax2.tick_params(axis='y', labelcolor=color) plt.title('年度数量与金额对比') plt.legend(['数量(Qtd)', '金额(Monetary)'], loc='upper left') plt.show()
单y轴合并柱状图(仅作参考)
如果不需要双y轴,仅需合并到同一图表,可直接调用一次df.plot()并指定两个y列,但qtd的柱子会因量级差异几乎被覆盖:
import pandas as pd import matplotlib.pyplot as plt import random plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True df = pd.DataFrame(dict( year=range(2010,2021), qtd=[int(random.random() * 20) for x in range(2010,2021)], monetary=[int(random.random() * int(random.random() * 10000)) for x in range(2010,2021)]) ) # 一次调用plot生成合并柱状图 df.plot(x="year", y=['qtd', "monetary"], kind='bar', figsize=(8, 4)) plt.title('年度数量与金额对比') plt.xlabel('年份') plt.ylabel('数值') plt.legend() plt.show()
关键说明
- 双y轴方案通过
twinx()创建共享x轴的第二个坐标轴,分别适配两组数据的量级; - 设置
position和width参数让两组柱子并排显示,避免重叠; - 不同颜色区分两组数据,提升可读性。
内容的提问来源于stack exchange,提问作者LucasBorges-Santos
相关产品推荐
相关产品推荐

