Matplotlib同图绘制多条折线时后续线条起始位置异常问题求解
问题解决方法
核心原因
- 你代码中
Epoch、Scaled两个列表存储的都是字符串格式数据,Python3中matplotlib处理字符串类型的x轴输入时,会默认将其作为分类变量按传入顺序依次排列,不会自动识别为数值型时间戳坐标。 - 每次循环往图中追加新折线时,新的字符串x值会被判定为新的分类,直接接在原有x轴分类的末尾,因此后续折线的起点就会承接前一条折线的结束位置,无法对齐到正确的时间坐标。
修复方案
- 绘图前先将
Epoch和Scaled转换为浮点型数值,让matplotlib可以按照实际数值大小匹配x轴坐标 - 可以将全局样式、坐标轴参数设置移到循环外,避免重复执行冗余代码
修正后参考代码
import matplotlib from matplotlib import pyplot # 提前转换数据类型为数值型,解决x轴错位问题 Epoch = [float(x) for x in Epoch] Scaled = [float(x) for x in Scaled] Top = float(Top) Btm = float(Btm) BtmLimit = float(BtmLimit) TopLimit = float(TopLimit) # 全局样式设置放循环外 pyplot.rcParams['axes.facecolor'] = 'black' # 图表背景 pyplot.rcParams['axes.edgecolor'] = 'red' fig = pyplot.figure() fig.patch.set_facecolor('black') # 外边框 k = 0 while k < len(Stations): if Error == 'False': pyplot.plot(Epoch, Scaled, color = Color, linewidth=1.9) k = k + 1 # 坐标轴、标题设置放循环外 pyplot.tick_params(axis='x', colors='yellow') pyplot.tick_params(axis='y', colors='yellow') pyplot.ylim(BtmLimit, TopLimit) pyplot.ylabel("Percent of normal range.", size=10, color = "yellow") pyplot.xticks([]) # 隐藏X轴 pyplot.title("Plotted at %sGMT, %s %s %s" % (thour, tday, tdate, tmonth), color = "yellow") pyplot.plot(Epoch, [Top]*len(Epoch), color = [0,0.5,0]) # 绿色参考线 pyplot.plot(Epoch, [Btm]*len(Epoch), color = [0,0.5,0]) pyplot.savefig(SD+'RiverLevels.png', facecolor='black', bbox_inches='tight') pyplot.show() pyplot.close()
内容的提问来源于stack exchange,提问作者user17576419
相关产品推荐
相关产品推荐

