Um problema com o preenchimento correto para ListPlot e InterpolationOrder 0

Oct 28 2020

Usando ListPlot, posso gerar com

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

um enredo simples.

No entanto, se eu usar agora a opção "Preenchimento", o Mathematica (12.1) exibe o seguinte resultado errado.

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

Pelo que entendi, o problema pode vir dos decimais. Existe uma solução conhecida para isso?

Respostas

3 kglr Oct 28 2020 at 05:39

Duas soluções alternativas:

1. Use ListPlotsem a opção de preenchimento e pós-processe a saída para adicionar os polígonos de preenchimento 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]}]

Como alternativa, use em FilledCurvevez de Polygon:

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

2. Rationalize inserir dados de entrada para alguma escolha do segundo argumento também funciona:

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

Advertência: É necessário automatizar o segundo argumento de comRationalizebase nos dados de entrada.