def doaxispositioner(self, axisname): if self.did(self.doaxispositioner, axisname): return self.doranges() if axisname in ["x", "x2", "y", "y2"]: self.axes[axisname].setpositioner(self.axespositioners[axisname]) else: if axisname[1:] == "3": dependsonaxisname = axisname[0] else: dependsonaxisname = "%s%d" % (axisname[0], int(axisname[1:]) - 2) self.doaxiscreate(dependsonaxisname) sign = 2*(int(axisname[1:]) % 2) - 1 if axisname[0] == "x" and self.flipped: sign = -sign if axisname[0] == "x" and not self.flipped or axisname[0] == "y" and self.flipped: y_pt = self.axes[dependsonaxisname].positioner.y1_pt - sign * (self.axes[dependsonaxisname].canvas.extent_pt + self.axesdist_pt) self.axes[axisname].setpositioner(positioner.lineaxispos_pt(self.xpos_pt, y_pt, self.xpos_pt + self.width_pt, y_pt, (0, sign), self.xvgridpath)) else: x_pt = self.axes[dependsonaxisname].positioner.x1_pt - sign * (self.axes[dependsonaxisname].canvas.extent_pt + self.axesdist_pt) self.axes[axisname].setpositioner(positioner.lineaxispos_pt(x_pt, self.ypos_pt, x_pt, self.ypos_pt + self.height_pt, (sign, 0), self.yvgridpath))
def doaxispositioner(self, axisname): if self.did(self.doaxispositioner, axisname): return self.doranges() if axisname == "x": self.axes["x"].setpositioner( positioner.lineaxispos_pt(self.xpos_pt, self.ypos_pt, self.xpos_pt + self.width_pt, self.ypos_pt, (0, 1), self.xvgridpath)) elif axisname == "x2": self.axes["x2"].setpositioner( positioner.lineaxispos_pt(self.xpos_pt, self.ypos_pt + self.height_pt, self.xpos_pt + self.width_pt, self.ypos_pt + self.height_pt, (0, -1), self.xvgridpath)) elif axisname == "y": self.axes["y"].setpositioner( positioner.lineaxispos_pt(self.xpos_pt, self.ypos_pt, self.xpos_pt, self.ypos_pt + self.height_pt, (1, 0), self.yvgridpath)) elif axisname == "y2": self.axes["y2"].setpositioner( positioner.lineaxispos_pt(self.xpos_pt + self.width_pt, self.ypos_pt, self.xpos_pt + self.width_pt, self.ypos_pt + self.height_pt, (-1, 0), self.yvgridpath)) else: if axisname[1:] == "3": dependsonaxisname = axisname[0] else: dependsonaxisname = "%s%d" % (axisname[0], int(axisname[1:]) - 2) self.doaxiscreate(dependsonaxisname) sign = 2 * (int(axisname[1:]) % 2) - 1 if axisname[0] == "x": y_pt = self.axes[dependsonaxisname].positioner.y1_pt - sign * ( self.axes[dependsonaxisname].canvas.extent_pt + self.axesdist_pt) self.axes[axisname].setpositioner( positioner.lineaxispos_pt(self.xpos_pt, y_pt, self.xpos_pt + self.width_pt, y_pt, (0, sign), self.xvgridpath)) else: x_pt = self.axes[dependsonaxisname].positioner.x1_pt - sign * ( self.axes[dependsonaxisname].canvas.extent_pt + self.axesdist_pt) self.axes[axisname].setpositioner( positioner.lineaxispos_pt(x_pt, self.ypos_pt, x_pt, self.ypos_pt + self.height_pt, (sign, 0), self.yvgridpath))
def __init__(self, xpos=0, ypos=0, width=None, height=None, ratio=goldenmean, key=None, backgroundattrs=None, axesdist=0.8*unit.v_cm, flipped=False, xaxisat=None, yaxisat=None, **axes): graph.__init__(self) self.xpos = xpos self.ypos = ypos self.xpos_pt = unit.topt(self.xpos) self.ypos_pt = unit.topt(self.ypos) self.xaxisat = xaxisat self.yaxisat = yaxisat self.key = key self.backgroundattrs = backgroundattrs self.axesdist_pt = unit.topt(axesdist) self.flipped = flipped self.width = width self.height = height if width is None: if height is None: raise ValueError("specify width and/or height") else: self.width = ratio * self.height elif height is None: self.height = (1.0/ratio) * self.width self.width_pt = unit.topt(self.width) self.height_pt = unit.topt(self.height) for axisname, aaxis in axes.items(): if aaxis is not None: if not isinstance(aaxis, axis.linkedaxis): self.axes[axisname] = axis.anchoredaxis(aaxis, self.texrunner, axisname) else: self.axes[axisname] = aaxis for axisname, axisat in [("x", xaxisat), ("y", yaxisat)]: okey = axisname + "2" if not axes.has_key(axisname): if not axes.has_key(okey) or axes[okey] is None: self.axes[axisname] = axis.anchoredaxis(axis.linear(), self.texrunner, axisname) if not axes.has_key(okey): self.axes[okey] = axis.linkedaxis(self.axes[axisname], okey) else: self.axes[axisname] = axis.linkedaxis(self.axes[okey], axisname) elif not axes.has_key(okey) and axisat is None: self.axes[okey] = axis.linkedaxis(self.axes[axisname], okey) if self.axes.has_key("x"): self.xbasepath = self.axes["x"].basepath self.xvbasepath = self.axes["x"].vbasepath self.xgridpath = self.axes["x"].gridpath self.xtickpoint_pt = self.axes["x"].tickpoint_pt self.xtickpoint = self.axes["x"].tickpoint self.xvtickpoint_pt = self.axes["x"].vtickpoint_pt self.xvtickpoint = self.axes["x"].tickpoint self.xtickdirection = self.axes["x"].tickdirection self.xvtickdirection = self.axes["x"].vtickdirection if self.axes.has_key("y"): self.ybasepath = self.axes["y"].basepath self.yvbasepath = self.axes["y"].vbasepath self.ygridpath = self.axes["y"].gridpath self.ytickpoint_pt = self.axes["y"].tickpoint_pt self.ytickpoint = self.axes["y"].tickpoint self.yvtickpoint_pt = self.axes["y"].vtickpoint_pt self.yvtickpoint = self.axes["y"].vtickpoint self.ytickdirection = self.axes["y"].tickdirection self.yvtickdirection = self.axes["y"].vtickdirection self.axesnames = ([], []) for axisname, aaxis in self.axes.items(): if axisname[0] not in "xy" or (len(axisname) != 1 and (not axisname[1:].isdigit() or axisname[1:] == "1")): raise ValueError("invalid axis name") if axisname[0] == "x": self.axesnames[0].append(axisname) else: self.axesnames[1].append(axisname) aaxis.setcreatecall(self.doaxiscreate, axisname) self.axespositioners = dict(x=positioner.lineaxispos_pt(self.xpos_pt, self.ypos_pt, self.xpos_pt + self.width_pt, self.ypos_pt, (0, 1), self.xvgridpath), x2=positioner.lineaxispos_pt(self.xpos_pt, self.ypos_pt + self.height_pt, self.xpos_pt + self.width_pt, self.ypos_pt + self.height_pt, (0, -1), self.xvgridpath), y=positioner.lineaxispos_pt(self.xpos_pt, self.ypos_pt, self.xpos_pt, self.ypos_pt + self.height_pt, (1, 0), self.yvgridpath), y2=positioner.lineaxispos_pt(self.xpos_pt + self.width_pt, self.ypos_pt, self.xpos_pt + self.width_pt, self.ypos_pt + self.height_pt, (-1, 0), self.yvgridpath)) if self.flipped: self.axespositioners = dict(x=self.axespositioners["y2"], y2=self.axespositioners["x2"], y=self.axespositioners["x"], x2=self.axespositioners["y"])