Skip to content

[graph] TScatter / TScatter2D stops drawing remaining points if a non-positive value is encountered in log scale #23833

Closed

Description

@muntasir-396

Check duplicate issues

  • Checked for duplicates

Description

When plotting a TScatter or TScatter2D on a pad with logarithmic scale enabled (gPad->SetLogx(), SetLogy(), or SetLogz()), encountering any non-positive coordinate (x <= 0, y <= 0, or z <= 0) causes the painter to prematurely terminate the entire rendering loop via else break; instead of skipping the invalid point via else continue;.

As a consequence, if an early point in the array happens to be non-positive, all subsequent valid positive points are omitted from the canvas.

Expected behavior:
Points with non-positive values should simply not be drawn on a log-scale axis, while all other valid positive points in the scatter plot should continue to be rendered.

Observed behavior:
All points appearing after the first non-positive point in the dataset are dropped and never painted.

Reproducer

Save the following self-contained macro as test_scatter_log.C:

void test_scatter_log() {
   auto c = new TCanvas("c", "Scatter Log Test", 800, 600);
   c->SetLogy();

   // 5 points, where index 2 has non-positive y = 0
   const int n = 5;
   double x[n] = {1.0, 2.0, 3.0, 4.0, 5.0};
   double y[n] = {10.0, 20.0, 0.0, 40.0, 50.0};
   double col[n] = {1.0, 2.0, 3.0, 4.0, 5.0};
   double size[n] = {2.0, 2.0, 2.0, 2.0, 2.0};

   auto scatter = new TScatter(n, x, y, col, size);
   scatter->SetMarkerStyle(20);
   scatter->Draw("A");

   c->Update();
   // Only points 0 and 1 are drawn; points 3 and 4 are missing because of 'else break;'
}

Run with:

root -l test_scatter_log.C

ROOT version

ROOT 6.34/00 (or current master)

Installation method

Build from source

Operating system

macOS / Ubuntu Linux

Additional context

The issue is located in hist/histpainter/src/TGraphPainter.cxx:

  • In TGraphPainter::PaintScatter (lines ~4500 and ~4506)
  • In TGraphPainter::PaintScatter2D (lines ~4734, ~4740, and ~4746)

In all these loops, replacing else break; with else continue; prevents aborting the marker loop when an unrenderable point is reached. This makes a great good first issue for new contributors.

Activity

  1. muntasir-396 commented on Oct 25, 2026

    @muntasir-396
    ContributorAuthor

    Hi @ferdymercury @linev,

    I have identified the root cause in TGraphPainter.cxx and have a working fix ready with tests. Could you please assign this issue to me? I would be happy to submit a PR for it. Thanks!

  2. added a commit that references this issue on Oct 29, 2026
    378d40b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions