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

