Plotly: 如何更改子图y轴的范围?

8
我有以下代码:
from plotly.subplots import make_subplots
import requests 
import json
import datetime as dt
import pandas as pd
import plotly.graph_objects as go




def get_candles(symbol, window, interval='1h'):
    url = "https://api.binance.com/api/v1/klines"
    end_time = dt.datetime.utcnow()
    delta = dt.timedelta(hours = window)
    start_time = end_time - delta
    start_date = str(int(start_time.timestamp() * 1000))
    end_date = str(int(end_time.timestamp() * 1000))
    limit = '1000'
    market = symbol + 'BUSD'

    req_param = {"symbol": market, "interval": interval, "startTime": start_date, "endTime": end_date, "limit": limit}

    text = requests.get(url, params = req_param).text
    data = json.loads(text)
    df = pd.DataFrame(data)
    df.columns = ['open_time',
                    'o', 'h', 'l', 'c', 'v',
                    'close_time', 'qav', 'num_trades',
                    'taker_base_vol', 'taker_quote_vol', 'ignore']

    df.index = [dt.datetime.fromtimestamp(x/1000.0) for x in df.close_time]

    return df


def chart(symbol, interval='1h'):
    windows = {'1m': 1, '5m': 5, '15m': 15, '30m': 30, '1h': 60, '2h': 120, '4h': 240, '6h': 360, '12h': 720, '1d': 1440}
    chart = get_candles(symbol.upper(), windows[interval], interval)
    fig = make_subplots(specs=[[{"secondary_y": True}]])
    print(chart['v'].max())
    fig.add_trace(go.Candlestick(x=chart.index,
            open=chart['o'],
            high=chart['h'],
            low=chart['l'],
            close=chart['c'],
            name="yaxis1 data",
            yaxis='y1'), secondary_y=True)
    fig.add_trace(go.Bar(x=chart.index, y=chart['v'], name="yaxis2 data", yaxis="y2"), secondary_y=False)
    fig.layout.yaxis2.showgrid=False
    fig.update_yaxes(type="linear")
    fig.update_layout(xaxis_rangeslider_visible=False)
    
    # fig.show()

    fig.write_image("figure.png", engine="kaleido")
    
chart('bnb')

它生成以下图像: Chart this code generates

现在我想让音量条只到图表总高度的1/3,我尝试这样做:

fig.update_layout(yaxis1=dict(title="bars", domain=[0, int(2* chart['v'].max()/3)]))

但这没有任何效果。

如何为某个y轴指定名称并更改其范围?

3个回答

13

这就是方法:

fig.update_layout(yaxis2 = dict(range=[<from_value>, <to_value>]))

你的代码样例在我的环境下无法工作。但是在这个例子中,以下设置:

fig.update_layout(yaxis2 = dict(range=[0, 300*10**6]))

...会将这个:

输入图片说明

...变成这个:

输入图片说明

完整代码:

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import pandas as pd

# data
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# include candlestick with rangeselector
fig.add_trace(go.Candlestick(x=df['Date'],
                open=df['AAPL.Open'], high=df['AAPL.High'],
                low=df['AAPL.Low'], close=df['AAPL.Close']),
               secondary_y=False)

# include a go.Bar trace for volumes
fig.add_trace(go.Bar(x=df['Date'], y=df['AAPL.Volume']),
               secondary_y=True)
f = fig.full_figure_for_development(warn=False)

fig.layout.yaxis2.showgrid=False
fig.update_layout(yaxis2 = dict(range=[0, 300*10**6]))
fig.show()

0

我遇到了类似的问题,但是上面的答案并没有帮助,因为我的图表是动态的。根据时间范围,最大交易量可以从300到1000万不等,所以固定范围不好用。

看起来最好的解决方案是使用max()函数在我的数据框架(也是动态的)的交易量列中找到最高值:

maxVol = max(df['Volume'], key=float)
ymax = float(maxVol)
print(ymax)

然后只需使用以下方法将最大范围按3倍比例缩放

fig.update_layout(yaxis=dict(range=[0, ymax*3]))

-1

1
我知道这个,我也读了文档。但我无法弄清如何更改一个 y 轴(我有两个)。 - Mathijs van den Doel
你试过使用 secondary_y = FalseTrue 吗?详情请见:https://plotly.com/python/multiple-axes/ - astrochun
1
fig contains both axes, so when updating, you still need to be explicit. Much like how you use add_trace, you need to specify secondary_y in your fig.update_yaxes - astrochun
谢谢,就这些。 - Mathijs van den Doel
@MathijsvandenDoel,等我有机会的时候,我会修改我的答案,使其成为一个可接受的答案。 - astrochun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接