График круга в автоспорте с использованием ListLinePlot

#wolfram-mathematica #plot

#wolfram-mathematica #график

Вопрос:

Я пытаюсь взять таблицу позиций кругов в автоспорте и построить график кругов, подобный этому http://www.fia.com/en-GB/sport/championships/f1/2010/bahrain/Pages/lap_chart.aspx.

Каждая строка соответствует кругу, причем первый круг находится в первой строке. Номера машин указаны в каждой строке в порядке их прохождения линии старта / финиша Таблица может выглядеть следующим образом (гонка на 4 машинах, 6 кругов:

1 3 2 4
1 3 2 4
1 3 4 2
3 1 4 2
3 1 4 2
3 4 1 2

В приведенном выше примере порядок был 1,3,2,4 после первого круга, а к концу гонки из 6 кругов победила машина 3, машина 4 была второй и так далее.

Это легко отобразить неправильно, я сделал это:

 ListLinePlot[Table[Position[data,x],{x,4}]]
  

Графика Mathematica

Это действительно создает график кругов, но у него есть 1-я позиция внизу и 4-я позиция вверху, и что мне действительно нужно, так это ось y для запуска 4-3-2-1, чтобы 1-я позиция была вверху.

Как я могу изменить ось y, чтобы она проходила от 1 (вверху) до n (внизу)?

Комментарии:

1. Гистограмма и гистограмма, начиная с версии 8, имеют новую опцию ScalingFunctions, которая может принимать значение «Reverse». Жаль, что это не работает для обычных графиков.

2. Рон, как это отображается, когда машина выбывает из гонки? Кстати, добро пожаловать в StackOverflow.

3. Рон, добро пожаловать в Stack Overflow. Хороший вопрос, включая ту часть, где говорится о том, что гонщики не финишировали.

4. Рон, пожалуйста, обязательно проголосуй и прими ответы. Смотрите: meta.stackexchange.com/questions/5235 и основной FAQ, из которого это взято: meta.stackexchange.com/questions/7931

Ответ №1:

Просто используйте квадрант 4 для решения проблемы с положением на экране.

Это также работает для DNF! (Гонщики, которые не финишировали).

Первое место отображается при y = -1, второе место отображается при y = -2 и т.д. Обратите внимание, как y заменяется на -y в {{lap_, y_} :> {lap - 1, -y}} приведенном ниже.

lap уменьшен на 1, потому что я включил данные для начальной позиции (круг = ноль).


Небольшая правка для работы с другим количеством пилотов и кругов, а также переформатирование кода для большей разборчивости. — Мистер волшебник


 data = 
  {{1, 3, 2, 4},
   {1, 3, 2, 4},
   {1, 3, 4, 2},
   {3, 1, 4, 2},
   {3, 1, 4, 2},
   {3, 4, 1, 2}};

{p, n} = {Max@data, Length@data};

ticks = {#, #} amp;@Array[{-#, #} amp;, p];
ticks[[All, 1, 2]] = {"Pole", "Winner"};

PrependTo[data, Range@p];  (* add starting position *)

ListLinePlot[
 Replace[
   Array[data~Position~# amp;, p],
   {lap_, y_} :> {lap - 1, -y},
   {2}
 ],
 Frame -> True,
 FrameLabel ->
  {"Laps Completed",
   "Starting Positions",
   "Laps Completed",
   "Final Positions"},
 GridLines -> {Range[0, n   1], None},
 FrameTicks -> {ticks, {All, All}},
 PlotRange -> {Automatic, {-.7, -.3 - p}},
 PlotStyle -> Thickness[.01]
]
  

гоночные автомобили

Вот случай, когда машина № 1 (та, что стартовала с поул-позиции) сошла с дистанции до завершения двух последних кругов. Обратите внимание, что машина № 3 автоматически продвинулась на одну позицию.

DNF

Комментарии:

1. Очень красиво. Пожалуйста, объясните логику расположения.

2. Спасибо всем, это действительно хорошие идеи. Я поиграл с некоторыми решениями, и те, которые я попробовал, работают нормально … до тех пор, пока все машины, стартовавшие в гонке, заканчивают гонку. Теперь я играю с тем, как решить проблему, связанную с использованием DNFS, потому что это нарушает простой «разворот», который я видел.

3. @Mr.Wizard В более ранней версии была ошибка. Я удалил правила замены и использовал более простой способ представления позиций на экране, используя квадрант 4.

4. Дэвид, твой ответ намного приятнее моего. Если у меня будет разрешение внести несколько изменений в ваш, я удалю свой.

5. Дэвид, я внес еще одно изменение, потому что понял, что правило замены нарушает график, когда пилотов всего два. Ограничение замены «уровнем 2» делает ее безопасной.

Ответ №2:

Измените порядок позиций, а затем перемаркируйте тики:

 ListLinePlot[
 Table[Position[data, x] /. {xx_, yy_} :> {xx, 5 - yy}, {x, 4}],
 Ticks -> {Automatic, {{1, 4}, {2, 3}, {3, 2}, {4, 1}}}, 
 PlotStyle -> Thickness[.01]]
  

введите описание изображения здесь

Комментарии:

1. Майкл, поздравляю с 4000 повторениями!

Ответ №3:

Хорошо, кто-то упомянул BarChart и ScalingFunctions , так что поехали….

 BarChart[Ordering /@ data, ChartLayout -> "Overlapped", 
 Joined -> Automatic, BarSpacing -> 0, ChartElementFunction -> ({} amp;),
  ChartStyle -> 1, ScalingFunctions -> "Reverse", Axes -> False, 
 Frame -> {{True, False}, {True, False}}, PlotRange -> {All, All}, 
 BaseStyle -> Thickness[0.01]]
  

Решение на основе гистограмм

(но ListPlot решение, вероятно, проще. Жаль, что он еще не поддерживается ScalingFunctions .)

Комментарии:

1. На самом деле, этот график великолепен, потому что он может обрабатывать случай, когда машины не финишируют. Для меня это сработало прямо из коробки, спасибо!

2. @BrettChampion, ScalingFunctions -> "Reverse" поддерживается обоими, Plot и ListLinePlot уже.

Ответ №4:

Я собираюсь оставить эту «умную» реализацию, потому что она мне нравится, но ответ Дэвида гораздо более надежный.

 laps = 
  {{1, 3, 2, 4},
   {1, 3, 2, 4},
   {1, 3, 4, 2},
   {3, 1, 4, 2},
   {3, 1, 4, 2},
   {3, 4, 1, 2}};

ListLinePlot[
  -Thread[Ordering /@ laps],
  AxesOrigin -> {1, 0}, PlotStyle -> Thick,
  Ticks -> {All, Array[{-#, #} amp;, 4]}
]
  

введите описание изображения здесь

Ответ №5:

Как насчет того, чтобы теперь вообще показывать оси y:

 data = {{1, 3, 2, 4},
   {1, 3, 2, 4},
   {1, 3, 4, 2},
   {3, 1, 4, 2},
   {3, 1, 4, 2},
   {3, 4, 1, 2}};

ListLinePlot[Table[Position[5 - data, x], {x, 4}], 
 Axes -> {True, False}]
  

Графика Mathematica

Ответ №6:

ScalingFunctions теперь, похоже, работает с ListLinePlot

 data = {{1, 3, 2, 4}, {1, 3, 2, 4}, {1, 3, 4, 2}, {3, 1, 4, 2}, {3, 1,
     4, 2}, {3, 4, 1, 2}};
ListLinePlot[Table[Position[data, x], {x, 4}], 
 ScalingFunctions -> {Identity, "Reverse"}, AxesOrigin -> {1, -5}]
  

Я понятия не имею, почему AxesOrigin координата y должна быть отрицательной.

Графика Mathematica