PyQt绘制股票K线多图Y坐标对齐

在做股票的K线图与成交量图的时候,成交量数字宽度与K线数字宽度不一致,会导致Y坐标位置bu不在同一个位置上, 如下图:
在这里插入图片描述pyqtgraph没有直接调整的Y轴位置。但是pyqtgraph本身就是使用QGrapics框架实现的,因此直接查看pyqtgraph源代码。

在这里插入图片描述
负责处理坐标轴的为AxisItem类, 再查看内部实现,发现存在两个接口setHeight和setWidth两个接口, 如下图:
在这里插入图片描述意思是设置这两个接口则可以改变坐标宽度。因此可以使用此方法改变宽度来对齐Y轴。

    def y_axis_max_width(self) -> int:
        font = self.font()
        fm = QFontMetrics(font)
        y_max = self._data['high'].max()
        y_min = self._data['low'].min()
        y_max_len = fm.width("%.02f" % y_max)
        y_min_len = fm.width("%.02f" % y_min)
        max_len = max(y_max_len, y_min_len)
        return max_len

    def set_y_axis_width(self, width):
        self.y_axis.setWidth(width)
        self._pw.setAxisItems({'left': self.y_axis})
        self.update()

    def update_data(self, data):
        self._k_widget.update_data(data)
        self._line_widget.update_data(data)
        self._vol_widget.update_data(data)
        self._k_widget.view_box().setXLink(self._vol_widget.view_box())
        self._line_widget.view_box().setXLink(self._vol_widget.view_box())

        k_y_width = self._k_widget.y_axis_max_width()
        l_y_width = self._line_widget.y_axis_max_width()
        v_y_width = self._vol_widget.y_axis_max_width()
        max_width = max([k_y_width, l_y_width, v_y_width])
        if k_y_width <= max_width:
            self._k_widget.set_y_axis_width(max_width)

        if l_y_width <= max_width:
            self._line_widget.set_y_axis_width(max_width)

        if v_y_width <= max_width:
            self._vol_widget.set_y_axis_width(max_width)

根据数据查询最大数据和最小数据,然后获取最大像素作为宽度,然后在更新数据的时候设置最大的宽度即可。
具体结果如下:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值