Compute positioning information for grid lines and ticks, given the axes' data *bbox*.
(self, *args, **kwargs)
| 170 | else fmt(direction, factor, levels)) |
| 171 | |
| 172 | def get_grid_info(self, *args, **kwargs): |
| 173 | """ |
| 174 | Compute positioning information for grid lines and ticks, given the |
| 175 | axes' data *bbox*. |
| 176 | """ |
| 177 | params = _api.select_matching_signature( |
| 178 | [lambda x1, y1, x2, y2: locals(), lambda bbox: locals()], *args, **kwargs) |
| 179 | if "x1" in params: |
| 180 | _api.warn_deprecated("3.11", message=( |
| 181 | "Passing extents as separate arguments to get_grid_info is deprecated " |
| 182 | "since %(since)s and support will be removed %(removal)s; pass a " |
| 183 | "single bbox instead.")) |
| 184 | bbox = Bbox.from_extents( |
| 185 | params["x1"], params["y1"], params["x2"], params["y2"]) |
| 186 | else: |
| 187 | bbox = params["bbox"] |
| 188 | |
| 189 | tbbox = self.extreme_finder._find_transformed_bbox( |
| 190 | self.get_transform().inverted(), bbox) |
| 191 | |
| 192 | lon_levs, lon_n, lon_factor = self.grid_locator1(*tbbox.intervalx) |
| 193 | lat_levs, lat_n, lat_factor = self.grid_locator2(*tbbox.intervaly) |
| 194 | |
| 195 | lon_values = np.asarray(lon_levs[:lon_n]) / lon_factor |
| 196 | lat_values = np.asarray(lat_levs[:lat_n]) / lat_factor |
| 197 | |
| 198 | lon_lines, lat_lines = self._get_raw_grid_lines(lon_values, lat_values, tbbox) |
| 199 | |
| 200 | bbox_expanded = bbox.expanded(1 + 2e-10, 1 + 2e-10) |
| 201 | grid_info = {"extremes": tbbox} # "lon", "lat" keys filled below. |
| 202 | |
| 203 | for idx, lon_or_lat, levs, factor, values, lines in [ |
| 204 | (1, "lon", lon_levs, lon_factor, lon_values, lon_lines), |
| 205 | (2, "lat", lat_levs, lat_factor, lat_values, lat_lines), |
| 206 | ]: |
| 207 | grid_info[lon_or_lat] = gi = { |
| 208 | "lines": lines, |
| 209 | "ticks": {"left": [], "right": [], "bottom": [], "top": []}, |
| 210 | } |
| 211 | for xys, v, level in zip(lines, values, levs): |
| 212 | all_crossings = _find_line_box_crossings(xys, bbox_expanded) |
| 213 | for side, crossings in zip( |
| 214 | ["left", "right", "bottom", "top"], all_crossings): |
| 215 | for crossing in crossings: |
| 216 | gi["ticks"][side].append({"level": level, "loc": crossing}) |
| 217 | for side in gi["ticks"]: |
| 218 | levs = [tick["level"] for tick in gi["ticks"][side]] |
| 219 | labels = self._format_ticks(idx, side, factor, levs) |
| 220 | for tick, label in zip(gi["ticks"][side], labels): |
| 221 | tick["label"] = label |
| 222 | |
| 223 | return grid_info |
| 224 | |
| 225 | def _get_raw_grid_lines(self, lon_values, lat_values, bbox): |
| 226 | trans = self.get_transform() |
no test coverage detected