Python中如何自动生成重复最大值列表以绘制matplotlib水平线?
解决方法
完全不用重复写max(y1),有两种简洁的实现方式:
方法1:用plt.axhline()(最推荐)
matplotlib专门提供了画水平线的函数axhline,无需构造长度匹配的y列表,直接指定最大值即可:
import matplotlib.pyplot as plt x1 = [8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23] y1 = [36.37, 36.18, 36.31, 36.24, 36.31, 36.37, 36.18, 36.43, 36.12, 36.24, 36.06, 36.31, 36.12, 36.49, 36.74, 36.74] plt.plot(x1, y1, color='black', marker='o', markerfacecolor='black', markersize='10', label='line1') # 直接绘制水平线,y值为y1的最大值,默认覆盖整个图表x轴范围 plt.axhline(y=max(y1), color='#30C3BF', linestyle='dashed', label='line2') plt.legend() plt.show()
如果需要手动限制水平线的x范围(比如只在x1的区间内显示),可以添加xmin和xmax参数(按x轴比例设置,0为最左端,1为最右端):
plt.axhline(y=max(y1), color='#30C3BF', linestyle='dashed', label='line2', xmin=x1[0]/max(x1), xmax=x1[-1]/max(x1))
方法2:自动生成匹配长度的y列表
如果仍想用plt.plot,可以用列表乘法快速生成和x1长度一致的y2列表:
import matplotlib.pyplot as plt x1 = [8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23] y1 = [36.37, 36.18, 36.31, 36.24, 36.31, 36.37, 36.18, 36.43, 36.12, 36.24, 36.06, 36.31, 36.12, 36.49, 36.74, 36.74] plt.plot(x1, y1, color='black', marker='o', markerfacecolor='black', markersize='10', label='line1') x2 = x1 # 用列表乘法生成与x1长度相同的y2列表 y2 = [max(y1)] * len(x1) plt.plot(x2, y2, color='#30C3BF', linestyle='dashed', label='line2') plt.legend() plt.show()
第一种方法更简洁,专门针对水平线场景;第二种适合需要保留y2列表做后续处理的情况。
内容的提问来源于stack exchange,提问作者Guilherme Candeias
相关产品推荐
相关产品推荐

