feat(plot): a figure can keep an empty band to the right of its data
`layout_.axes` reached the viewport's right edge, so the rightmost x tick label -- centred on its tick -- had half of itself outside the plot, and the newest sample's ink landed on the frame. `Plot::set_right_gutter()` reserves a band there, out of the same `1 - kMinAxesShare` allowance the label and title strips are served from, so it can no more squeeze `axes` below the half-viewport floor than they can. `Figure` sets one value on every row, the left gutter's reason: the rows' axes have to end on a common column as well as start on one. Nothing is drawn in the band, so unlike the strips it is a want and never a measurement: no measuring pass, and it cannot feed the layout's fixed point. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
58473db384
commit
bee318870f
5 files changed
+93
-1
No files matched your search
@@ -451,6 +451,10 @@ const FigureLayout& Figure::layout() {
|
||||
// not drawn once per row. A figure told to label every row keeps them everywhere,
|
||||
// and then there is no shared axis to speak of: each row has its own.
|
||||
p.set_x_strip_mode(labels_bottom_only_ && row != bottom_row ? XStrip::None : XStrip::Both);
|
||||
// Before either pass below, and the same value for every row: nothing is measured on
|
||||
// the right, so unlike the left gutter this needs no measurement pass -- the rows end
|
||||
// on a common column because they are all told the one width.
|
||||
p.set_right_gutter(right_gutter_);
|
||||
}
|
||||
// After the viewports, so a row's ticks and grid -- built from its axes rect -- and
|
||||
// its transforms describe this frame's rects; and before the rows lay themselves
|
||||
|
||||
+10
-1
@@ -1039,12 +1039,21 @@ const PlotLayout& Plot::layout() {
|
||||
x_height = std::min(x_height, x_budget);
|
||||
const f32 y_title_width = std::min(y_title_w, y_budget - y_width);
|
||||
const f32 x_title_height = std::min(x_title_h, x_budget - x_height);
|
||||
// The right-hand band, out of what is left of the same allowance the two left
|
||||
// strips were served from -- so the three together cannot take more than
|
||||
// `1 - kMinAxesShare` of the width however much each asks for. Nothing is drawn
|
||||
// in it, so unlike the strips above it is a want and never a measurement, and it
|
||||
// cannot feed the fixed point below: the y labels are chosen from the row's range
|
||||
// and height, so a narrower `axes` does not change what they need.
|
||||
const f32 right_gutter =
|
||||
std::min(right_gutter_, y_budget - (y_width + y_title_width));
|
||||
layout_.y_axis_width = y_width;
|
||||
layout_.x_axis_height = x_height;
|
||||
layout_.y_title_width = y_title_width;
|
||||
layout_.x_title_height = x_title_height;
|
||||
layout_.right_gutter = right_gutter;
|
||||
layout_.axes = Rect{viewport_.x + y_width + y_title_width, viewport_.y,
|
||||
vw - (y_width + y_title_width),
|
||||
vw - (y_width + y_title_width + right_gutter),
|
||||
vh - (x_height + x_title_height)};
|
||||
layout_.y_title_area = Rect{viewport_.x, layout_.axes.y, y_title_width, layout_.axes.h};
|
||||
layout_.y_label_area =
|
||||
|
||||
Reference in new issue
Block a user