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

matplotlib子图绘制异源缩放数据时ConnectionPatch坐标报错如何解决

报错原因

你传入ConnectionPatch的xyA、xyB参数是切片得到的Index对象和Series对象,属于长度为1的序列而非标量值,matplotlib无法直接将序列转换为坐标计算所需的浮点数,才触发了类型转换报错。
不需要把整个df转为数组,只要提取出单个坐标标量即可正常运行,修改方案如下:

具体修改点

  • 取坐标值时通过.iloc提取单个标量,而非传入切片后的序列
  • 修正子图赋值逻辑,避免Axes对象被覆盖
  • 注意下方子图绘制的是涨跌幅数据,y轴单位为百分比,xyB的y值要取对应位置的涨跌幅而非收盘价,避免连线位置错位

修正后的代码示例

import pandas as pd
import matplotlib.pyplot as plt
from pandas_datareader import data as web
from matplotlib.patches import ConnectionPatch

# 获取日线数据
df = web.DataReader('goog', 'yahoo')
df['Close'] = pd.to_numeric(df['Close'], errors='coerce')
# 计算涨跌幅
df['pct_change'] = df['Close'].pct_change()

fig = plt.figure(figsize=(6, 5))
plt.subplots_adjust(bottom=0.1, left=0.1, top=0.9, right=0.9)
# 上方子图绘制收盘价
sub1 = fig.add_subplot(2,1,1)
df.Close.plot(ax=sub1)
# 下方子图绘制涨跌幅
sub2 = fig.add_subplot(2,1,2)
df.pct_change.plot(ax=sub2)

# 提取单个坐标值,这里示例取第20个交易日的点作为连线两端
# 上方子图坐标:x为对应日期,y为当日收盘价
xyA = (df.iloc[20].name, df.iloc[20].Close)
# 下方子图坐标:x为相同日期,y为当日涨跌幅
xyB = (df.iloc[20].name, df.iloc[20].pct_change)

# 创建连线
con1 = ConnectionPatch(xyA=xyA, coordsA=sub1.transData, 
                       xyB=xyB, coordsB=sub2.transData, color='green')
fig.add_artist(con1)

plt.show()

如果你要实现跨数据源连线,只要把xyA换成日内数据的对应坐标值、xyB换成日线数据的对应坐标值即可,不需要两个数据源的坐标范围匹配,ConnectionPatch会自动根据两个子图的坐标系做位置转换。

内容的提问来源于stack exchange,提问作者Slartibartfast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:12:03