#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}]]
Это действительно создает график кругов, но у него есть 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 автоматически продвинулась на одну позицию.
Комментарии:
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}]
Ответ №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 должна быть отрицательной.