Un problema con el llenado correcto de ListPlot e InterpolationOrder 0

Oct 28 2020

Usando ListPlot puedo generar con

ListPlot[{{344.41, 272.2, 280}, {345, 223, 278}}, InterpolationOrder -> 0, PlotRange -> {200, 400}, Joined -> True]

una trama simple.

Sin embargo, si ahora uso la opción "Relleno", Mathematica (12.1) muestra el siguiente resultado incorrecto.

ListPlot[{{344.41, 272.2, 280}, {345, 223, 278}}, InterpolationOrder -> 0, PlotRange -> {200, 400}, Joined -> True, Filling -> {1 -> {{2}, {Blue}}} ]

Por lo que entiendo, el problema podría surgir de los decimales. ¿Existe una solución conocida para eso?

Respuestas

3 kglr Oct 28 2020 at 05:39

Dos soluciones alternativas:

1. Use ListPlotsin la opción de relleno y postprocese la salida para agregar los polígonos de relleno como Epilog:

lp = ListPlot[{{344.41, 272.2, 280}, {345, 223, 278}}, 
  InterpolationOrder -> 0, PlotRange -> {200, 400}, Joined -> True]; 

Show[lp, 
  Epilog -> {Opacity[.5, LightBlue], 
    Polygon @ Join[#, Reverse @ #2] & @@ Cases[lp, Line[x_, ___] :> x, All]}]

Alternativamente, use en FilledCurvelugar de Polygon:

Show[lp, 
   Epilog -> {Opacity[.5, LightBlue], 
      FilledCurve @ ({#, Reverse /@ #2} & @@ Cases[lp, _Line, All])}]

2. La Rationalize obtención de datos de entrada para alguna elección del segundo argumento también funciona:

ListPlot[Rationalize[{{344.41, 272.2, 280}, {345, 223, 278}}, 10^-2], 
 InterpolationOrder -> 0, PlotRange -> {200, 400}, Joined -> True, 
 Filling -> {1 -> {2}}]

Advertencia: es necesario automatizar el segundo argumento deRationalizebasado en datos de entrada.