使用Matplotlib绘制带X轴偏移的航天任务水平条形图问题
解决航天任务水平条形图的X轴起始偏移问题
你需要绘制水平条形图,以航天任务的**时长(年)**为条形长度、任务成本为Y轴,同时让条形的X轴起始位置对应任务的开始年份。现有代码虽计算出了任务时长,但参数使用错误且未设置起始偏移,导致图表不符合需求。
问题代码分析
原代码存在两个核心问题:
plt.barh参数顺序错误:barh(y, width)的第一个参数是Y轴位置值,第二个是条形的X方向长度,你把时长(宽度)和成本(Y轴)搞反了- 未设置
left参数,无法指定条形的X轴起始位置(即任务开始年份)
原代码:
import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv('mission_lifetime.dat') length_of_mission = data['Mission_End_Year']-data['Mission_Start_Year'] cost = data['Cost_in_millions'] plt.barh(length_of_mission, cost)
数据样例(mission_lifetime.dat):
Mission,Mission_Start_Year,Mission_End_Year,Cost_in_millions ISO,1995,1998,615. Herschel,2009,2013,1100. Planck,2009,2013,700.
修正后的代码
调整plt.barh参数逻辑,用left参数指定任务开始年份作为条形起始点,同时优化Y轴标签可读性:
import pandas as pd import matplotlib.pyplot as plt # 读取数据 data = pd.read_csv('mission_lifetime.dat') # 计算任务时长 data['Mission_Length'] = data['Mission_End_Year'] - data['Mission_Start_Year'] # 定义Y轴位置与标签(用任务名称更直观) y_positions = range(len(data['Mission'])) y_labels = data['Mission'] # 绘制水平条形图:Y轴为任务,宽度为时长,起始点为任务开始年份 plt.barh(y_positions, data['Mission_Length'], left=data['Mission_Start_Year']) # 配置坐标轴与标题 plt.yticks(y_positions, y_labels) plt.xlabel('年份') plt.ylabel('航天任务') plt.title('航天任务时长与成本分布') # 优化布局并显示 plt.tight_layout() plt.show()
关键说明
- 通过
left=data['Mission_Start_Year']让每个条形从对应任务的开始年份起画,长度为任务时长,X轴直接显示实际年份范围 - 若需将成本作为Y轴,只需把
y_positions替换为data['Cost_in_millions'],但此时Y轴为连续数值,任务会按成本高低排列
内容的提问来源于stack exchange,提问作者npross
相关产品推荐
相关产品推荐

