使用ListLinePlot的Motorsport Lap Chart

时间:2011-04-13 20:30:19

标签: wolfram-mathematica plot

我正试图拿出一个赛车圈位置表并绘制一张类似于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 graphics

这确实产生了一个膝部图,但它在底部有第一个位置,在顶部有第四个位置,我真正需要的是y轴运行4-3-2-1所以第一个位置在顶部。

如何反转y轴使其从1(顶部)到n(底部)?

6 个答案:

答案 0 :(得分:8)

只需使用Quadrant 4解决屏幕位置问题。

这也适用于DNF! (未完成的司机)。

第一个位置绘制在y = -1,第二个位置绘制在y = -2等。 请注意y如何被-y替换为{{lap_, y_} :> {lap - 1, -y}}

lap减1,因为我包含起始位置的数据(圈数=零)。


轻微重写,使用不同数量的驱动程序和圈数,并重新格式化代码以提高可读性。 - Mr.Wizard


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 = {#, #} &@Array[{-#, #} &, p];
ticks[[All, 1, 2]] = {"Pole", "Winner"};

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

ListLinePlot[
 Replace[
   Array[data~Position~# &, 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]
]

race cars

在完成最后两圈之前,汽车#1(从杆位开始的那个)掉线的情况就是这样。请注意,#3车自动前进一个位置。

DNF

答案 1 :(得分:7)

反转位置的顺序,然后重新标记刻度:

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]]

enter image description here

答案 2 :(得分:4)

好的,有人带来了BarChartScalingFunctions,所以我们走了......

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

BarChart-based solution

(但ListPlot解决方案可能更容易。太糟糕了,它还不支持ScalingFunctions。)

答案 3 :(得分:3)

现在如何显示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 graphics

答案 4 :(得分:3)

我要放弃这个“聪明”的实施,因为我喜欢它,但大卫的答案要强得多。

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[{-#, #} &, 4]}
]

enter image description here

答案 5 :(得分:1)

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 graphics