3
$\begingroup$

I'm using the following dataset: https://drive.google.com/file/d/17-4oxD1czHAfwsz_svXVyjBrS5wMvmYc/view?usp=sharing

It consists of tiles defined by xmin, xmax, ymin, ymax and weight.

What I want to plot is ListDensityPlot of these tiles, so I first prep it (and scale it):

symlog[x_, thresh_] := 
  If[x >= 0, 
   Log10[x + thresh] - Log10[thresh], -Log10[-x + thresh] + 
    Log10[thresh]];
threshold = 0.3;
xmin = -0.0355323;
xmax = 0.0432868;
ymin = -5.72074;
ymax = -1.33862;
min = 4.25438;
max = 7.61142;
contours2 = 
  Select[Import[
    "mach1.txt", 
    "Table"], ((symlog[#[[2]], threshold] < 
        xmax) && (symlog[#[[1]], threshold] > 
        xmin) && (Log10[#[[4]]] < ymax) && (Log10[#[[3]]] > ymin)) &];
contours2 = 
  Table[{(symlog[contours2[[j, 1]], threshold] + 
       symlog[contours2[[j, 2]], threshold])/
     2, (Log10[contours2[[j, 3]]] + Log10[contours2[[j, 4]]])/2, 
    Log[contours2[[j, 
        5]]/((contours2[[j, 2]] - 
          contours2[[j, 1]]) (contours2[[j, 4]] - 
          contours2[[j, 3]]))]}, {j, 1, Length@contours2}];

And now I plot it

ListDensityPlot[contours2, 
 PlotRange -> {{xmin - 0.01 (xmax - xmin), 
    xmax + 0.05 (xmax - xmin)}, {ymin - 0.05 (ymax - ymin), 
    ymax + 0.05 (ymax - ymin)}, {min, max}}, ImageSize -> 1000, 
 ColorFunction -> "Rainbow"]

And get a very weird, spiky plot (to be clear, I'm talking about the spikes in the red region. Some noise is expected in the lower region due to the natural lack of definition) enter image description here

I know for sure those spikes are a bug. To discover why, we plot it with zero interpolation order (that way we force Mathematica to plot the original tiles):

ListDensityPlot[contours2, 
 PlotRange -> {{xmin - 0.01 (xmax - xmin), 
    xmax + 0.05 (xmax - xmin)}, {ymin - 0.05 (ymax - ymin), 
    ymax + 0.05 (ymax - ymin)}, {min, max}}, ImageSize -> 1000, 
 ColorFunction -> "Rainbow", InterpolationOrder -> 0]

enter image description here

Apart from the strange white spot, it is obvious something is going on here. To verify that the data is not to blame for the spikes, we plot these tiles via a different method. We get the original dataset, but this time manually draw the rectangles corresponding to the individual tiles (I know my way to display those individual tiles via dummy plot with epilog is silly, I don't know of any better way)

symlog[x_, thresh_] := 
  If[x >= 0, 
   Log10[x + thresh] - Log10[thresh], -Log10[-x + thresh] + 
    Log10[thresh]];
threshold = 0.3;
xmin = -0.0355323;
xmax = 0.0432868;
ymin = -5.72074;
ymax = -1.33862;
min = 4.25438;
max = 7.61142;
contours2 = 
  Select[Import[
    "mach1.txt", 
    "Table"], ((symlog[#[[2]], threshold] < 
        xmax) && (symlog[#[[1]], threshold] > 
        xmin) && (Log10[#[[4]]] < ymax) && (Log10[#[[3]]] > ymin)) &];
epilog = Table[{ColorData[
      "Rainbow"][(1/(max - min)) (Log[
         contours2[[j, 
           5]]/((contours2[[j, 2]] - 
              contours2[[j, 1]]) (contours2[[j, 4]] - 
              contours2[[j, 3]]))] - min)], 
    Rectangle[{symlog[contours2[[j, 1]], threshold], 
      Log10[contours2[[j, 3]]]}, {symlog[contours2[[j, 2]], 
       threshold], Log10[contours2[[j, 4]]]}]}, {j, 1, 
    Length@contours2}];
Plot[-100, {x, 0, 1}, 
 PlotRange -> {{xmin - 0.01 (xmax - xmin), 
    xmax + 0.05 (xmax - xmin)}, {ymin - 0.05 (ymax - ymin), 
    ymax + 0.05 (ymax - ymin)}}, Axes -> None, Frame -> True, 
 AspectRatio -> 1, ImageSize -> 1000, Epilog -> epilog]

Now this produces the actual picture we should have obtained with ListDensityPlot with InterpolationOrder set to 0

enter image description here

There are no weird spikes in the actual data.

I could be using this plot as a density plot (I don't mind the roughness of the individual tiles), but I need Mathematica's internal routines to do it correctly, as I also want to extract the ListContourPlot of my data, which shows a similar bug

enter image description here

It's obvious that the dataset has smooth contours, so these spiky contours are caused by the same bug that makes the ListDensityPlot so spiky.

What is behind this bug and how do I fix it?

$\endgroup$
4
  • 1
    $\begingroup$ Try rescaling the data so that the height and width of the domain are approximately the same. $\endgroup$
    – Michael E2
    Commented Nov 4, 2021 at 14:12
  • $\begingroup$ @MichaelE2 hey, thanks, that fixed it! Want to make it into an answer so I can upvote it? Is there a way to do it without rescaling? $\endgroup$
    – user16320
    Commented Nov 4, 2021 at 14:22
  • $\begingroup$ You could post your answer. I don't mind. I don't have time to write it up, really. As for other workarounds, the problem is that the mesher assumes length is isotropic (the same in all directions). When the plot is stretched a lot more in one direction (by around a factor of 100 in your case), the jitter/interpolation error gets exaggerated. I don't know how set different scaling factors in the mesher. It may not be possible. Thus I don't have an alternative to suggest. $\endgroup$
    – Michael E2
    Commented Nov 4, 2021 at 15:31
  • 2
    $\begingroup$ Try adding the option ScalingFunctions -> {{100 # &, #/100 &}, None} to ListDensityPlot. The scaling factor 100 may be adjusted if necessary. $\endgroup$
    – Michael E2
    Commented Nov 4, 2021 at 15:47

1 Answer 1

3
$\begingroup$

The culprit seems to be the number of "PlotPoints". With too many points you will see the above mentioned effect. It would be interesting if you report this to "[email protected]" and post their answer here.

If you reduce "MaxPlotPoints" the effect disappears:

ListDensityPlot[contours2, 
 PlotRange -> {{xmin - 0.01 (xmax - xmin), 
    xmax + 0.05 (xmax - xmin)}, {ymin - 0.05 (ymax - ymin), 
    ymax + 0.05 (ymax - ymin)}, {min, max}}, ImageSize -> 1000, 
 ColorFunction -> "Rainbow", MaxPlotPoints -> 50]

enter image description here

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.