在做股票的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)
根据数据查询最大数据和最小数据,然后获取最大像素作为宽度,然后在更新数据的时候设置最大的宽度即可。
具体结果如下: