基于Pandas与Matplotlib的ADSL速率双Y轴折线图轴角色解析
ADSL速率日志绘图代码:轴对象作用详解
我来帮你拆解这段Matplotlib绘图代码里ax、y1、y2三个对象的具体作用,顺便补全你提到的X轴刻度倾斜和右轴数值范围的优化细节:
核心对象的作用拆解
1. fig, ax = plt.subplots() 中的 ax
这是你的**主坐标轴(左Y轴)**的核心控制器,是Matplotlib负责管理绘图区域的基础对象。它掌控着左Y轴(下载速率)、X轴(时间刻度)的所有属性:包括网格显示、刻度范围、轴标签、绘图风格等。所有后续指定ax=ax的绘图操作,都是在这个主坐标轴的区域上进行渲染。
2. y1 = speeds_df.plot(ax=ax, ...) 中的 y1
这个变量本质是绑定了下载速率曲线的主坐标轴引用——它和ax是同一个对象的不同名字。因为你通过speeds_df.plot(ax=ax)把下载速率数据绘制在了主坐标轴上,返回的y1就是已经添加了DL曲线的ax对象。你可以用它进一步修改主坐标轴的属性,比如调整左Y轴的标签文字、刻度颜色等。
3. y2 = speeds_df.plot(ax=ax, secondary_y=True, ...) 中的 y2
这是**次坐标轴(右Y轴)**的专属控制器。当你设置secondary_y=True时,Matplotlib会在主坐标轴的右侧生成一个独立的Y轴,专门用来展示数值范围更小的上传速率(避免和下载速率共用左轴导致上传曲线被压缩得看不清)。y2就是这个右轴的管理对象,你可以通过它修改右Y轴的刻度范围、标签、颜色等属性。
匹配需求的代码优化
你提到需要X轴刻度倾斜45度,并且上传速率的数值范围更小,目前代码里右轴的ylim=(100,225)明显不合理,这里给你调整后的完整代码:
"""Plots the adsl-log generated log.""" import matplotlib.pyplot as plt import pandas as pd # 读取日志文件,指定分隔符和列名 data = pd.read_csv("test.log", sep=';', names=[ 'datetime', 'severity', 'down', 'up', 'loss', 'server']) # 过滤掉ERROR记录(速率为0的无效数据) indexNames = data[data['severity'] == 'ERROR'].index data.drop(indexNames, inplace=True) # 将datetime列转换为datetime64类型 data['datetime'] = pd.to_datetime(data['datetime']) # 提取需要的列,简化数据结构 speeds_df = data[['datetime', 'down', 'up']] speeds_df.info() # 验证datetime列类型 # 开始绘图 fig, ax = plt.subplots(figsize=(12,6)) # 绘制下载速率(左轴) y1 = speeds_df.plot(ax=ax, x='datetime', y='down', grid=True, label="DL", legend=True, linewidth=2, ylim=(100,225)) # 绘制上传速率(右轴,调整到合理的数值范围) y2 = speeds_df.plot(ax=ax, x='datetime', y='up', secondary_y=True, label="UL", legend=True, linewidth=2, ylim=(0,35)) # 设置X轴刻度倾斜45度,避免重叠 plt.xticks(rotation=45) # 给两个Y轴添加明确的标签 ax.set_ylabel('下载速率 (Mbps)') y2.set_ylabel('上传速率 (Mbps)') # 自动调整布局,防止轴标签被截断 plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

