1

As mentioned, I wanted to plot a groupedbar using StatsPlots in Julia. Here is my code:

legends = repeat(["myopic baseline", "vfa", "lvfa", "nnvfa", "nnvfa with attention"], outer=2)
training_time_per_step = [0., 9.817792895793914, 6.380393509864807, 15.770121607780457, 31.79437662124634]
eval_time_per_step = [2.756498346328735, 6.823106627861659, 6.184429474310442, 13.286595929535952, 20.297245191227304]
ctg = repeat(["training time per step", "eval time per step"], inner = 5)
bar1 = groupedbar(legends, vcat(training_time_per_step, eval_time_per_step), group=ctg, xlabel="Methods", ylabel="Time", 
title="Time Evaluation", legend=:topleft, reuse=false)
display(bar1)

I want the legends to have the same order as I defined, but I find it is automatically ordered by the name of each legend: enter image description here

How can I solve this problem?

PokeLu
  • 767
  • 8
  • 17

1 Answers1

1

You need your ctg to be a CategoricalArray rather than a Vector of Strings. Categorical Arrays are maintaining the order of classes and are supported by StatsPlots.

using CategoricalArrays
levlabels = ["training time per step", "eval time per step"]
ctg=CategoricalArray(repeat(levlabels, inner = 5))
levels!(ctg, levlabels)

Now your labels will not get auto-sorted alphabetically :) (no change to the actual plotting command that you used so I do not copy paste it here).

enter image description here

Przemyslaw Szufel
  • 40,002
  • 3
  • 32
  • 62
  • Actually, I referred to the labels on the x-axis (sorry for my wording), but your solution works for both cases. Thanks a lot! – PokeLu Apr 06 '23 at 20:55