From ba4b6482639272c2f530f3c03cf4aced00f7d48a Mon Sep 17 00:00:00 2001 From: lesauxvi Date: Tue, 16 Feb 2016 06:48:59 +0100 Subject: [PATCH] addition of a convenient method for handling the label position --- examples/plottingItems.py | 5 ++-- pyqtgraph/graphicsItems/InfiniteLine.py | 34 ++++++++++++++++--------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/examples/plottingItems.py b/examples/plottingItems.py index 6a2445bc..5bf14b62 100644 --- a/examples/plottingItems.py +++ b/examples/plottingItems.py @@ -17,11 +17,12 @@ win.resize(1000,600) pg.setConfigOptions(antialias=True) p1 = win.addPlot(title="Plot Items example", y=np.random.normal(size=100)) -inf1 = pg.InfiniteLine(movable=True, angle=90, label=True, textShift=0.2, textColor=(200,200,100), textFill=(200,200,200,50)) +inf1 = pg.InfiniteLine(movable=True, angle=90, label=True, textPosition=[0.5, 0.2], textColor=(200,200,100), textFill=(200,200,200,50)) inf2 = pg.InfiniteLine(movable=True, angle=0, label=True, pen=(0, 0, 200), textColor=(200,0,0), bounds = [-2, 2], suffix="mm", hoverPen=(0,200,0)) inf3 = pg.InfiniteLine(movable=True, angle=45) inf1.setPos([2,2]) -##inf1.setTextLocation([0.25, 0.9]) +inf1.setTextLocation(position=0.75) +inf2.setTextLocation(shift=0.8) p1.addItem(inf1) p1.addItem(inf2) p1.addItem(inf3) diff --git a/pyqtgraph/graphicsItems/InfiniteLine.py b/pyqtgraph/graphicsItems/InfiniteLine.py index e8bcc639..70f8f60f 100644 --- a/pyqtgraph/graphicsItems/InfiniteLine.py +++ b/pyqtgraph/graphicsItems/InfiniteLine.py @@ -32,7 +32,7 @@ class InfiniteLine(GraphicsObject): def __init__(self, pos=None, angle=90, pen=None, movable=False, bounds=None, hoverPen=None, label=False, textColor=None, textFill=None, - textShift=0.5, textFormat="{:.3f}", + textPosition=[0.05, 0.5], textFormat="{:.3f}", suffix=None, name='InfiniteLine'): """ =============== ================================================================== @@ -53,8 +53,11 @@ class InfiniteLine(GraphicsObject): location in data coordinates textColor color of the label. Can be any argument fn.mkColor can understand. textFill A brush to use when filling within the border of the text. - textShift float (0-1) that defines when the text shifts from one side to - the other side of the line. + textPosition list of float (0-1) that defines when the precise location of the + label. The first float governs the location of the label in the + direction of the line, whereas the second one governs the shift + of the label from one side of the line to the other in the + orthogonal direction. textFormat Any new python 3 str.format() format. suffix If not None, corresponds to the unit to show next to the label name name of the item @@ -77,7 +80,7 @@ class InfiniteLine(GraphicsObject): textColor = (200, 200, 100) self.textColor = textColor self.textFill = textFill - self.textShift = textShift + self.textPosition = textPosition self.suffix = suffix if (self.angle == 0 or self.angle == 90) and label: @@ -202,9 +205,10 @@ class InfiniteLine(GraphicsObject): rangeX, rangeY = self.getViewBox().viewRange() xmin, xmax = rangeX ymin, ymax = rangeY + pos, shift = self.textPosition if self.angle == 90: # vertical line diffMin = self.value()-xmin - limInf = self.textShift*(xmax-xmin) + limInf = shift*(xmax-xmin) if diffMin < limInf: self.textItem.anchor = Point(self.anchorRight) else: @@ -213,11 +217,11 @@ class InfiniteLine(GraphicsObject): if self.suffix is not None: fmt = fmt + self.suffix self.textItem.setText(fmt.format(self.value()), color=self.textColor) - posY = ymin+0.05*(ymax-ymin) + posY = ymin+pos*(ymax-ymin) GraphicsObject.setPos(self, Point(self.value(), posY)) elif self.angle == 0: # horizontal line diffMin = self.value()-ymin - limInf = self.textShift*(ymax-ymin) + limInf = shift*(ymax-ymin) if diffMin < limInf: self.textItem.anchor = Point(self.anchorUp) else: @@ -226,7 +230,7 @@ class InfiniteLine(GraphicsObject): if self.suffix is not None: fmt = fmt + self.suffix self.textItem.setText(fmt.format(self.value()), color=self.textColor) - posX = xmin+0.05*(xmax-xmin) + posX = xmin+pos*(xmax-xmin) GraphicsObject.setPos(self, Point(posX, self.value())) def getXPos(self): @@ -364,17 +368,23 @@ class InfiniteLine(GraphicsObject): else: self.textItem = None - def setTextShift(self, shift): + def setTextLocation(self, position=0.05, shift=0.5): """ - Set the parameter that defines the location when the label shifts from - one side of the infiniteLine to the other. + Set the parameters that defines the location of the label on the axis. + The position *parameter* governs the location of the label in the + direction of the line, whereas the *shift* governs the shift of the + label from one side of the line to the other in the orthogonal + direction. ============== ====================================================== **Arguments:** + position float (range of value = [0-1]) shift float (range of value = [0-1]). ============== ====================================================== """ - self.textShift = np.clip(shift, 0, 1) + pos = np.clip(position, 0, 1) + shift = np.clip(shift, 0, 1) + self.textPosition = [pos, shift] self.update() def setName(self, name):