You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:08:16