Um problema com o preenchimento correto para ListPlot e InterpolationOrder 0
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
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.