epezent / epezent/implot

[Bug] PlotBars baseline=0 breaks on log-scaled axes

Open
#669 2 comments 0 reactions 1 assignee Claimed by @brenocq View on GitHub
prio:high status:todo type:fix
Dominant language
C++
Stars
6.2k
Forks
693
PR merge metrics
No merged PRs in 30d

Description

### Bug: PlotBars baseline=0 breaks on log-scaled axes

When using ImPlot::PlotBars(...) with a log-scaled value axis (ImPlotScale_Log10), the bars are drawn with a baseline of 0. Since 0 is invalid on logarithmic axes, this can cause bar geometry to explode and appear to draw outside the plot boundaries / clip rect.

Image
---

### Minimal Repro

static double values[] = { 1, 10, 100, 1000 };

if (ImPlot::BeginPlot("Bars + Log Axis")) {
ImPlot::SetupAxisScale(ImAxis_Y1, ImPlotScale_Log10);
ImPlot::SetupAxisLimits(ImAxis_Y1, 1e-1, 1e9);
ImPlot::PlotBars("bars", values, 4, 0.8);
ImPlot::EndPlot();
}

---

### Observed

Bars may extend far beyond the plot area (or appear to draw outside plot boundaries) when the value axis uses ImPlotScale_Log10.

---

### Expected

Bars should start at a log-safe baseline (e.g. the current axis minimum), not at 0, when the value axis is logarithmic.

Image

---

### Proposed Fix (small, localized)

Clamp the baseline used by PlotBars from 0 to a log-safe value when the value axis is log-scaled:
- If the relevant axis scale is ImPlotScale_Log10, use axis.Range.Min if > 0, otherwise fall back to a small epsilon (e.g. 1e-12).
- Keep the baseline behavior unchanged for linear axes.

This preserves existing rendering/legend/toggle behavior and only replaces an invalid baseline on log scales.

---

### Patch Summary (implot_items.cpp)

The issue comes from getter2 always using IndexerConst(0) as the baseline. The fix is to replace that 0 with a log-safe baseline when the value axis is log-scaled.

Example (conceptually):

// before (vertical bars)
GetterXY getter2(IndexerLin(1.0,shift), IndexerConst(0), count);

// after (vertical bars)
const double base = GetLogSafeBaseline(ImAxis_Y1, 0.0);
GetterXY getter2(IndexerLin(1.0,shift), IndexerConst(base), count);

Same idea applies to:
- horizontal bars (value axis is X1)
- PlotBars(xs, ys, ...)
- PlotBarsG(...)

I have a working patch applied locally and can provide the full diff if desired.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.