Edit
This is the workaround I've found :
data = RandomReal[100, {10000, 10}];
Manipulate[
Block[{$PerformanceGoal = "Quality", a}, a = Log[i];
Grid[{{RandomReal[100]}, {ListPlot[a data[[;; , i]],
PlotLabel -> RandomReal[100], ImageSize -> 400,
PlotStyle -> Hue[RandomReal[1]],
PerformanceGoal -> "Quality"]}}]], {i, 2, 10, 1}]
a
(which is a function of i
) must be defined as a local value inside the Block
and then set to its value.
It seems everything works as it should be (click and dragging the slider, click on buttons +/-)
Previous
As indicated the problem can be solved with the option $PerformanceGoal
, but as the OP showed it is not enough here just to set the option inside ListPlot
.
Let's take a simpler example :
Manipulate[i + 1;
ListPlot[RandomReal[10, 100], PlotStyle -> {Hue[RandomReal[]]},
PlotLabel -> $PerformanceGoal, PerformanceGoal -> "Quality"], {i, 1, 10, 1}]
As a label, i just display the $PerformanceGoal
and it is clear that when you click the + button, the plot is displayed : the first time with $PerformanceGoal
set to "Speed"
and the second time set to "Quality"
. Setting the option inside ListPlot
seems to have no effect.

The problem is solved if you set $PerformanceGoal
inside a Block
. Here:
Manipulate[i + 1;
Block[{$PerformanceGoal = "Quality"},
ListPlot[RandomReal[10, 100], PlotStyle -> {Hue[RandomReal[]]},
PlotLabel -> $PerformanceGoal]], {i, 1, 10, 1}]

Update
HOWEVER, this is not the end of the story, because as commented the OP, the previous solution won't work for the particular case at the end of his post. My example was too simple : there is no variable i
inside the ListPlot
.
Let's make something more complicated, just multiply the RandomReal
list by i
(inside ListPlot
):
Manipulate[i + 1;
Block[{$PerformanceGoal = "Quality"},
ListPlot[i*RandomReal[10, 10000], PlotStyle -> {Hue[RandomReal[]]},
PlotLabel -> $PerformanceGoal]], {i, 1, 10, 1}]
You can check that will work too.
BUT if you set a=i
then multiply RandomReal
by a
, now it won't work:
(note that I added a Pause
inside the Block
in order to see better the evaluations, it does not modify the problem)
Manipulate[i + 1; a = i;
Block[{$PerformanceGoal = "Quality"}, Pause[0.5];
ListPlot[a*RandomReal[10, 20000], PlotStyle -> {Hue[RandomReal[]]},
PlotLabel -> $PerformanceGoal]], {i, 1, 10, 1}]

Note also that, though the $PerformanceGoal
changes no more, you can clearly see that the code is evaluated twice, whether the slide is moved by clicking (not dragging), or the + or - buttons are clicked.
unless you do:
Manipulate[i + 1;
Block[{$PerformanceGoal = "Quality", a}, Pause[0.5];
a = i; ListPlot[a*RandomReal[10, 20000],
PlotStyle -> {Hue[RandomReal[]]},
PlotLabel -> $PerformanceGoal]], {i, 1, 10, 1}]

Other strange behaviours
I have played a little bit with all this, and I also observed some other strange behaviours :
You can even have three evaluations if you do that :
Manipulate[a = i; Pause[0.5];
Grid[{{RandomReal[100]}, {ListPlot[a*RandomReal[10, 100],
PlotLabel -> RandomReal[100], ImageSize -> 400,
PlotStyle -> Hue[RandomReal[1]]]}}], {i, 1, 10, 1}]

or if you put the same code into two separate cells, just one beneath the over, and then if you change the position of one slider, this is what happens :
Manipulate[i + 1; a = i;
ListPlot[a*RandomReal[10, 100], PlotStyle -> {Hue[RandomReal[]]},
PlotLabel -> $PerformanceGoal, PerformanceGoal -> "Quality"], {i, 1,
10, 1}]
and the same
Manipulate[i + 1; a = i;
ListPlot[a*RandomReal[10, 100], PlotStyle -> {Hue[RandomReal[]]},
PlotLabel -> $PerformanceGoal, PerformanceGoal -> "Quality"], {i, 1,
10, 1}]
gives
