You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在PyQt5结合PyQtGraph绘制的K线图中设置轴间隔?

设置PyQtGraph时间轴间隔的几种方法

看起来你已经在为K线图搭建自定义时间轴了,针对你的TimeAxisItem场景,这里有几种实用的方法来设置轴的刻度间隔:


方法1:手动固定刻度间隔

如果你的K线数据是固定周期(比如日K、1小时K),可以直接在自定义轴类里指定固定的刻度间隔。重写tickValues方法,返回你想要的刻度值列表即可:

from datetime import datetime
import pyqtgraph as pg
import numpy as np

class TimeAxisItem(pg.AxisItem):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 这里设置固定间隔,比如日K就设为86400秒(一天)
        self.fixed_interval = 86400  # 单位:秒

    def tickStrings(self, values, scale, spacing):
        # 把时间戳转成易读的日期格式,比如"%Y-%m-%d"
        return [datetime.fromtimestamp(value).strftime("%Y-%m-%d") for value in values]

    def tickValues(self, minVal, maxVal, size):
        # 生成从minVal到maxVal、间隔为fixed_interval的刻度值
        ticks = np.arange(np.ceil(minVal/self.fixed_interval)*self.fixed_interval, 
                         maxVal, self.fixed_interval)
        return [(self.fixed_interval, ticks.tolist())]

创建PlotWidget时使用这个自定义轴:

def GUI_DRAW_create():
    pg.setConfigOption('background', 'w')
    pg.setConfigOption('foreground', 'k')
    # 绑定自定义时间轴到底部
    plot_widget = pg.PlotWidget(axisItems={'bottom': TimeAxisItem(orientation='bottom')})
    return plot_widget

方法2:动态自适应刻度间隔

如果希望轴间隔能随窗口缩放自动调整(比如放大时切换到小时刻度,缩小时切换到日刻度),可以在tickValues里根据显示的时间范围计算合适的间隔:

class AdaptiveTimeAxisItem(pg.AxisItem):
    def tickStrings(self, values, scale, spacing):
        # 根据间隔大小自动切换日期格式
        if spacing >= 86400:
            fmt = "%Y-%m-%d"
        elif spacing >= 3600:
            fmt = "%H:%M"
        else:
            fmt = "%H:%M:%S"
        return [datetime.fromtimestamp(value).strftime(fmt) for value in values]

    def tickValues(self, minVal, maxVal, size):
        total_seconds = maxVal - minVal
        # 根据时间范围选择对应间隔
        if total_seconds > 7*86400:  # 超过7天,按天显示
            interval = 86400
        elif total_seconds > 24*3600:  # 超过1天,按6小时显示
            interval = 6*3600
        elif total_seconds > 3600:  # 超过1小时,按1小时显示
            interval = 3600
        else:  # 小于1小时,按10分钟显示
            interval = 10*60
        
        ticks = np.arange(np.ceil(minVal/interval)*interval, maxVal, interval)
        return [(interval, ticks.tolist())]

方法3:使用内置刻度配置

如果不需要复杂逻辑,也可以直接调用轴的setTickSpacing方法设置主次刻度间隔:

# 假设已创建plot_widget实例
bottom_axis = plot_widget.getAxis('bottom')
# 设置主刻度间隔为1天,次刻度间隔为6小时
bottom_axis.setTickSpacing(major=86400, minor=6*3600)

这种方法配合你已有的tickStrings方法,就能正常显示格式化后的时间文本。


小提示:如果你的时间戳是毫秒级(比如常见的JS时间戳),记得在转换时除以1000,确保datetime.fromtimestamp能正确解析。

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

火山引擎 最新活动