如何基于起止日期数据在时间趋势图中绘制药物水平参考线
实现思路
你需要的是限定在指定日期区间内的分段水平参考线,不要用贯穿全轴的axhline,直接用matplotlib的hlines接口实现即可,整体分3步走:
- 先把DataFrame里的字符串格式日期转成标准datetime格式,匹配现有图表的时间轴坐标
- 给每条药物参考线匹配和对应趋势线对齐的y轴垂直位置
- 传入起止日期、y位置参数批量绘制3条分段水平线
具体代码实现
首先做数据预处理:
import pandas as pd import matplotlib.pyplot as plt # 转换日期列为时间格式,解决字符串无法匹配时间轴坐标的问题 data['Start Date'] = pd.to_datetime(data['Start Date']) data['End Date'] = pd.to_datetime(data['End Date']) # 给每个药物匹配对应y轴位置,数值和你现有趋势线的垂直位置保持一致即可 # 示例是按药物顺序分配y=1/2/3,你可以根据自己的图表实际y值调整 drug_y_position = {'Katrex': 1, 'Acyloir': 2, 'Zelorix': 3} data['y'] = data['Drug Name'].map(drug_y_position)
然后在你已经绘制完趋势线的坐标轴对象上直接加参考线:
# ax是你现有图表的matplotlib坐标轴对象,如果你是用plt直接绘图也可以不传ax,直接调用plt.hlines ax.hlines( y = data['y'], xmin = data['Start Date'], xmax = data['End Date'], colors = ['tab:blue', 'tab:orange', 'tab:green'], # 颜色和对应药物趋势线保持一致即可 linestyles = '--', # 参考线用虚线区分主趋势线,可自行调整为实线/点线 linewidth = 2.5, alpha = 0.7 # 加透明度避免遮挡原有趋势线 ) # 调整完后如果需要刷新图例可以重新调用ax.legend()
注意事项
- 如果你的三种药物趋势线是绘制在同一个y轴数值区间(不是分面、不是按分类分配固定y位置),只需要把
drug_y_position里的数值改成你想要放参考线的y值即可,比如想把三条参考线都放在y=0.8的位置,就把三个映射值都改成0.8 - 如果你用的是seaborn、pandas内置plot等基于matplotlib的绘图库,这个方法完全通用,只要拿到当前绘图的ax对象即可
内容的提问来源于stack exchange,提问作者user18708380
相关产品推荐
相关产品推荐

