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