|
52 | 52 | PolygonMapItem, |
53 | 53 | PolygonShape, |
54 | 54 | ) |
| 55 | +from plotpy.plot.scaledraw import DateTimeScaleDraw |
55 | 56 | from plotpy.styles.axes import AxesParam, AxeStyleParam, AxisParam, ImageAxesParam |
56 | 57 | from plotpy.styles.base import GridParam, ItemParameters |
57 | 58 |
|
58 | 59 | if TYPE_CHECKING: |
| 60 | + from datetime import datetime |
59 | 61 | from typing import IO |
60 | 62 |
|
61 | 63 | from qwt.scale_widget import QwtScaleWidget |
@@ -1114,6 +1116,80 @@ def set_scales(self, xscale: str, yscale: str) -> None: |
1114 | 1116 | self.set_axis_scale(ay, yscale) |
1115 | 1117 | self.replot() |
1116 | 1118 |
|
| 1119 | + def set_axis_datetime( |
| 1120 | + self, |
| 1121 | + axis_id: int | str, |
| 1122 | + format: str = "%Y-%m-%d %H:%M:%S", |
| 1123 | + rotate: float = -45, |
| 1124 | + spacing: int = 20, |
| 1125 | + ) -> None: |
| 1126 | + """Configure an axis to display datetime labels |
| 1127 | +
|
| 1128 | + This method sets up an axis to display Unix timestamps as formatted |
| 1129 | + date/time strings. |
| 1130 | +
|
| 1131 | + Args: |
| 1132 | + axis_id: Axis ID (constants.Y_LEFT, constants.X_BOTTOM, ...) |
| 1133 | + or string: 'bottom', 'left', 'top' or 'right' |
| 1134 | + format: Format string for datetime display (default: "%Y-%m-%d %H:%M:%S"). |
| 1135 | + Uses Python datetime.strftime() format codes. |
| 1136 | + rotate: Rotation angle for labels in degrees (default: -45) |
| 1137 | + spacing: Spacing between labels (default: 20) |
| 1138 | +
|
| 1139 | + Examples: |
| 1140 | + >>> # Enable datetime on x-axis with default format |
| 1141 | + >>> plot.set_axis_datetime("bottom") |
| 1142 | +
|
| 1143 | + >>> # Enable datetime with time only |
| 1144 | + >>> plot.set_axis_datetime("bottom", format="%H:%M:%S") |
| 1145 | +
|
| 1146 | + >>> # Enable datetime with date only, no rotation |
| 1147 | + >>> plot.set_axis_datetime("bottom", format="%Y-%m-%d", rotate=0) |
| 1148 | + """ |
| 1149 | + axis_id = self.get_axis_id(axis_id) |
| 1150 | + scale_draw = DateTimeScaleDraw(format=format, rotate=rotate, spacing=spacing) |
| 1151 | + self.setAxisScaleDraw(axis_id, scale_draw) |
| 1152 | + self.replot() |
| 1153 | + |
| 1154 | + def set_axis_limits_from_datetime( |
| 1155 | + self, |
| 1156 | + axis_id: int | str, |
| 1157 | + dt_min: "datetime", |
| 1158 | + dt_max: "datetime", |
| 1159 | + stepsize: int = 0, |
| 1160 | + ) -> None: |
| 1161 | + """Set axis limits using datetime objects |
| 1162 | +
|
| 1163 | + This is a convenience method to set axis limits for datetime axes without |
| 1164 | + manually converting datetime objects to Unix timestamps. |
| 1165 | +
|
| 1166 | + Args: |
| 1167 | + axis_id: Axis ID (constants.Y_LEFT, constants.X_BOTTOM, ...) |
| 1168 | + or string: 'bottom', 'left', 'top' or 'right' |
| 1169 | + dt_min: Minimum datetime value |
| 1170 | + dt_max: Maximum datetime value |
| 1171 | + stepsize: The step size (optional, default=0) |
| 1172 | +
|
| 1173 | + Examples: |
| 1174 | + >>> from datetime import datetime |
| 1175 | + >>> # Set x-axis limits to a specific date range |
| 1176 | + >>> dt1 = datetime(2025, 10, 7, 10, 0, 0) |
| 1177 | + >>> dt2 = datetime(2025, 10, 7, 18, 0, 0) |
| 1178 | + >>> plot.set_axis_limits_from_datetime("bottom", dt1, dt2) |
| 1179 | + """ |
| 1180 | + from datetime import datetime |
| 1181 | + |
| 1182 | + if not isinstance(dt_min, datetime) or not isinstance(dt_max, datetime): |
| 1183 | + raise TypeError("dt_min and dt_max must be datetime objects") |
| 1184 | + |
| 1185 | + # Convert datetime objects to Unix timestamps |
| 1186 | + epoch = datetime(1970, 1, 1) |
| 1187 | + timestamp_min = (dt_min - epoch).total_seconds() |
| 1188 | + timestamp_max = (dt_max - epoch).total_seconds() |
| 1189 | + |
| 1190 | + # Set the axis limits using the timestamps |
| 1191 | + self.set_axis_limits(axis_id, timestamp_min, timestamp_max, stepsize) |
| 1192 | + |
1117 | 1193 | def get_autoscale_margin_percent(self) -> float: |
1118 | 1194 | """Get autoscale margin percentage |
1119 | 1195 |
|
|
0 commit comments