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

如何不修改原始数据为Plotly Candlestick蜡烛图设置Y轴对数刻度

问题背景

Plotly 可视化效果优秀,使用 Plotly Express 接口时传入 log_y=True 即可快速将Y轴切换为对数刻度。现在需要在不改动原始数据的前提下,使用 plotly.graph_objects 下的 Candlestick 类绘制蜡烛图时实现相同的Y轴对数刻度效果,翻查官方文档未找到对应实现方案。

初始复现代码

import pandas as pd
import numpy as np
import plotly.graph_objects as go

ohlc = np.array([[21318.58   , 21333.63   , 21296.43   , 21306.91   ,   198.6474 ],
       [21306.92   , 21310.51   , 21216.49   , 21235.99   ,   216.02765],
       [21235.98   , 21249.64   , 21128.41   , 21204.33   ,   495.20652],
       [21204.33   , 21238.26   , 21169.69   , 21198.37   ,   185.9797 ],
       [21198.36   , 21205.54   , 21154.     , 21165.01   ,   208.91714],
       [21165.     , 21230.     , 21165.     , 21229.99   ,   130.70106],
       [21229.99   , 21280.45   , 21217.32   , 21269.24   ,   162.83325],
       [21269.24   , 21279.51   , 21250.     , 21261.2    ,   143.27844],
       [21261.21   , 21278.19   , 21260.05   , 21260.66   ,    82.78135]])

ohlc = np.reshape(ohlc, (9,5))
df = pd.DataFrame(data=ohlc, columns=['open', 'high', 'low', 'close', 'volume'])

fig = go.Figure(data=[go.Candlestick(x=df.index,
                                     open=df['open'],
                                     high=df['high'],
                                     low=df['low'],
                                     close=df['close'])])
fig.show()

初始线性Y轴效果如下:
普通线性Y轴蜡烛图

错误尝试

尝试直接将 log_y=True 作为参数传入 go.Candlestick() 构造函数:

fig = go.Figure(data=[go.Candlestick(x=df.index,
                                     open=df['open'],
                                     high=df['high'],
                                     low=df['low'],
                                     close=df['close'], log_y=True)])
fig.show()

运行后触发报错:

Did you mean "low"?

ValueError: Invalid property specified for object of type plotly.graph_objs.Candlestick: 'log'
    ...
Bad property path:
log_y
^^^
正确实现方法

报错原因很明确:log_y 是 Plotly Express 封装的上层快捷参数,在 graph_objects 模式下,Candlestick 属于trace(图层)对象,只负责定义图形本身的内容(开高低收数据、涨跌配色等),坐标轴、标题、图例这类配置属于layout(布局)层属性,不能直接传给trace构造函数。

要实现Y轴对数刻度,只需要在图形创建完成后,调用update_yaxes方法将Y轴类型设置为对数即可,完全不需要修改原始数据:

# 前面的导包、数据处理、创建Candlestick图层的代码完全不变
fig = go.Figure(data=[go.Candlestick(x=df.index,
                                     open=df['open'],
                                     high=df['high'],
                                     low=df['low'],
                                     close=df['close'])])

# 核心配置:设置Y轴为对数刻度
fig.update_yaxes(type="log")

fig.show()

额外配置说明

  • 不需要对原始OHLC数据做对数转换,直接修改坐标轴类型的方式不会影响hover提示的数值,显示的还是真实价格
  • 如果需要调整对数刻度的显示间隔,可以传入dtick参数,比如fig.update_yaxes(type="log", dtick=0.1) 就会按照10^0.1的间隔生成刻度线
  • 如果是多子图场景,可以传入row、col参数指定要配置的坐标轴位置,比如fig.update_yaxes(type="log", row=1, col=1) 只会给第一行第一列的子图设置对数Y轴

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:15:44