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
相关产品推荐
相关产品推荐

