如何不修改原始数据为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轴效果如下:
错误尝试
尝试直接将 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
相关产品推荐
相关产品推荐

