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

Seaborn:旋转左侧子图并匹配右侧子图对应坐标轴

实现方案

核心修改逻辑

  • 交换左侧深度图所有绘图函数的x/y参数映射,将price字段绑定到纵轴,quantity字段绑定到横轴,实现原图90度旋转效果
  • 提取右侧K线图的收盘价波动区间,添加小幅padding后同步设置为两个子图的纵轴范围,保证价格维度完全对齐
  • 优化轴标签、刻度的显示逻辑,减少冗余信息

修改后完整代码

import pandas as pd
import requests
import datetime
import matplotlib.pyplot as plt
import seaborn as sns

def spread(tick):
    # 左侧子图(深度图)数据
    r = requests.get("https://api.binance.com/api/v3/depth",
                    params=dict(symbol=tick))
    results = r.json()
    frames = {side: pd.DataFrame(data=results[side], columns=["price", "quantity"],
                                dtype=float)
            for side in ["bids", "asks"]}
    frames_list = [frames[side].assign(side=side) for side in frames]
    df = pd.concat(frames_list, axis="index", 
                    ignore_index=True, sort=True)
    
    # 右侧子图(K线图)数据
    url = 'https://api.binance.com/api/v3/klines'
    params = {
        'symbol': tick,
        'interval': '1m'
    }
    r = requests.get(url, params=params)
    results = r.json()
    prices = pd.DataFrame.from_records(results)
    prices.columns = ['Open time', 'Open','High','Low','Close','Volume','Close time','Quote asset volume','Number of trades','Taker buy base asset volume','Taker buy quote asset volume','Ignore.']
    prices['Open time'] = pd.to_datetime(prices['Open time'], unit='ms', errors='coerce')
    prices = prices.set_index('Open time')
    prices['Close'] = pd.to_numeric(prices['Close'])
    

    # 绘图布局初始化
    sns.set_style("whitegrid")
    plt.style.use('seaborn-dark-palette')
    f, (ax1, ax2) = plt.subplots(1, 2,figsize=(20,5),gridspec_kw={'width_ratios': [1, 2.5]}, dpi= 300, 
                                facecolor='w', edgecolor='k')

    # 左侧旋转后深度图
    ax1.set_title(f"{tick} SPREAD at {datetime.datetime.now()}")
    # ecdfplot参数xy互换
    sns.ecdfplot(y="price", weights="quantity", stat="count", complementary=True, data=frames["bids"], ax=ax1)
    sns.ecdfplot(y="price", weights="quantity", stat="count", data=frames["asks"], ax=ax1)
    # histplot参数xy互换,binwidth对应纵轴价格间隔
    sns.histplot(y="price", weights="quantity", hue="side", binwidth=0.02, bins=20, data=df, ax=ax1)
    # scatterplot参数xy互换
    sns.scatterplot(x="quantity", y="price", hue="side", data=df, ax=ax1)
    ax1.set_xlabel("Quantity")
    ax1.set_ylabel("Price")

    # 右侧K线图
    ax2.plot(prices.index, prices['Close'], alpha = 1)
    ax2.set_title(f'{tick} Price')
    ax2.set_xlabel('Date')
    ax2.set_ylabel('Price')

    # 同步两个子图纵轴范围,添加0.05%的padding避免数据贴边
    price_min = prices['Close'].min() * 0.9995
    price_max = prices['Close'].max() * 1.0005
    ax1.set_ylim(price_min, price_max)
    ax2.set_ylim(price_min, price_max)

    # 可选:隐藏左侧子图Y轴刻度标签,和右侧共用价格轴,进一步优化显示
    # ax1.set_yticklabels([])
    # ax1.set_ylabel('')

    plt.tight_layout()
    return plt.show()

调用方式

spread('BTCUSDT')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:45:04