Matplotlib绘图X轴被多条深色线条覆盖问题排查求助
解决Matplotlib绘制SMA图表时X轴被覆盖的问题
我来帮你搞定这个X轴被深色线条覆盖的问题,仔细看了你的代码和数据类型输出,主要有几个核心问题需要修正:
问题根源分析
- 时间列未转为datetime类型:你的
close_time列是object(字符串)类型,plot_date处理字符串时间时无法正确解析,导致X轴刻度异常重叠,出现你看到的深色覆盖线条。 - 价格列仍为字符串类型:
close等价格列都是object类型,虽然计算SMA时自动转成了float,但这会埋下潜在的类型错误隐患,也可能影响绘图时的数据匹配。 plot_date的使用方式:plot_date默认会绘制数据点标记,即使指定了fmt="r-",也可能因为时间格式不规范导致额外的渲染问题。
修正后的代码
import datetime import matplotlib.pyplot as plt import pandas as pd from binance.client import Client BASE = "ETH" QUOTE = "USDT" MARKET = BASE + QUOTE client = Client("vitalik", "buterin") klines = client.get_historical_klines(MARKET, Client.KLINE_INTERVAL_15MINUTE, "31 Dec, 2017", "13 Jan, 2018") # 直接用原始数据创建DataFrame,后续统一处理类型 df = pd.DataFrame(klines, columns=["open_time", "open", "high", "low", "close", "volume", "close_time", "quote_asset_volume", "trades", "base_volume", "quote_volume", "ignore"]) # 将毫秒级时间戳转为datetime类型,比手动转字符串更可靠 df['open_time'] = pd.to_datetime(df['open_time'], unit='ms') df['close_time'] = pd.to_datetime(df['close_time'], unit='ms') # 把所有价格、成交量相关列转为数值类型 numeric_cols = ["open", "high", "low", "close", "volume", "quote_asset_volume", "base_volume", "quote_volume"] df[numeric_cols] = df[numeric_cols].apply(pd.to_numeric) # 计算3期SMA df['sma_3'] = df["close"].rolling(window=3).mean() print(df.dtypes) fig, ax = plt.subplots(figsize=(10, 6)) # 时间列已是标准datetime,直接用plot替代plot_date,避免多余渲染 plt.plot(df["close_time"], df["sma_3"], "r-") plt.xticks(rotation=90) plt.xlabel("Date") plt.ylabel("Price") plt.title(MARKET) # 自动优化X轴刻度布局,防止重叠 fig.autofmt_xdate() plt.show()
关键修正点说明
- 时间列标准化:用
pd.to_datetime直接处理Binance返回的毫秒时间戳,生成Matplotlib能正确识别的datetime对象,从根源解决X轴解析问题。 - 数值列统一转换:确保所有价格、成交量数据为数值类型,避免计算和绘图时的类型不匹配问题。
- 替换绘图函数:改用
plt.plot替代plot_date,因为datetime类型已被正确识别,无需依赖plot_date的特殊处理,同时避免默认的点标记干扰。 - 自动调整刻度:
fig.autofmt_xdate()让Matplotlib自动优化X轴刻度的显示角度和间距,彻底解决刻度重叠问题。
这样修改后,X轴的覆盖问题应该就能解决,图表也能正常显示SMA曲线了。
内容的提问来源于stack exchange,提问作者user3137329
相关产品推荐
相关产品推荐

