Python中使用matplotlib.pyplot并排显示两个图表的问题求助
Python中使用matplotlib.pyplot并排显示两个图表的问题求助
嗨,我看了你遇到的问题啦!咱们先拆解一下你碰到的两个核心问题:第二个图表为空,以及没法让两个图并排显示。我帮你分析下原因,再给出修改后的代码方案~
问题分析
- 第二个图表为空:
- 你第二个绘图里的标题用了
plt.title(file),但file变量是第一个图表的文件名,这里应该换成第二个加载的dft才对,变量不匹配可能导致绘图逻辑异常;另外你原来的异常处理里,print("No record Found for {}")没有传入参数,会掩盖数据加载失败的问题,也会让你无法明确知道哪里出了错。
- 你第二个绘图里的标题用了
- 无法并排显示:
- 你用了两个独立的
plt.figure(),matplotlib默认会为每个figure打开单独的窗口,分开调用show()还会导致图表逐个弹出。要实现并排显示,应该用plt.subplots()创建子图布局,把两个图表放在同一个窗口的不同子区域里。
- 你用了两个独立的
修改后的完整代码
import matplotlib.pyplot as plt import pandas as pd # 假设DayTimeMonth是你自己实现的模块,已提前导入 # 创建1行2列的并排子图,设置合适的窗口大小避免图表拥挤 fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(18, 7)) # --- 第一个图表绘制逻辑 --- # 这里假设df是你已加载好的第一个数据文件 df.set_index("Date", inplace=True) # 直接指定在ax1子图上绘图 df[["inflow", "outflow"]].plot(kind='bar', color=['Green','Red'], ax=ax1) ax1.set_xlabel("Date") ax1.set_ylabel("Amount") ax1.set_title(file) # 确保file是第一个数据文件的文件名变量 ax1.tick_params(axis='x', rotation=45) # 可选:旋转x轴标签避免重叠遮挡 fig.subplots_adjust(bottom=0.25) # --- 第二个图表绘制逻辑 --- Year = int(input("Which Years Data You Want to Visualise (YYYY): ")) Month = int(input("Enter Which month of above mentioned Year (MM): ")) # 转换月份数字为对应名称 MN = DayTimeMonth.Month_Name_oprational(Month) dft = "{}-{}.csv".format(MN, Year) try: df2 = pd.read_csv(dft) except FileNotFoundError: print(f"No record Found for {MN} {Year}") except pd.errors.EmptyDataError: print("Operations Cannot be performed on empty CSV file") else: # 只有数据加载成功才执行绘图逻辑 df2.set_index("Date", inplace=True) # 指定在ax2子图上绘图 df2[["inflow", "outflow"]].plot(kind='bar', color=['Green','Red'], ax=ax2) ax2.set_xlabel("Date") ax2.set_ylabel("Amount") ax2.set_title(dft) # 这里换成第二个数据文件的名称 ax2.tick_params(axis='x', rotation=45) fig.subplots_adjust(bottom=0.25) # 最后只需要调用一次plt.show(),就能同时显示两个并排的图表 plt.show() input()
关键改动说明
- 用
plt.subplots(nrows=1, ncols=2)创建了1行2列的子图布局,ax1和ax2分别对应左右两个图表的绘图区域,替代原来的独立figure。 - 绘图时通过
ax=ax1/ax=ax2指定子图,确保两个图表在同一个窗口内排列。 - 修复了第二个图表的标题变量,让它显示对应的数据文件名,同时完善了异常提示信息。
- 把异常处理后的绘图逻辑放到
else块里,只有数据加载成功才会绘图,避免出现空图。 - 最后统一调用
plt.show(),一次性显示所有子图,实现你想要的并排效果。
备注:内容来源于stack exchange,提问作者Weapon AS
相关产品推荐
相关产品推荐

