Un problema con el llenado correcto de ListPlot e InterpolationOrder 0
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
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.