人们在100米,400米,1600米的赛道比赛,并记录完成时间。我想在平行坐标图中显示每个赛车的数据。一些赛车手可能无法完成赛道。在这种情况下,我想以某种方式标记它,无论是通过无限点还是以某种方式为特定轨道添加颜色。
作为一个例子,我在paint中创建了一个平行坐标图:
Lazyman还没有完成1600米的赛道,而且标有x。
以下“racing.csv”中给出了示例数据集:
RACER,TRACK.100m,TRACK.400m,TRACK.1500m
Superman,0.1,0.5,1
Lazyman,200,900,Inf
我尝试过使用pandas的解决方案:
import pandas
from pandas.tools.plotting import parallel_coordinates
import matplotlib.pyplot as plt
d = pandas.read_csv('racing.csv')
f = plt.figure()
parallel_coordinates(d, 'RACER')
f.axes[0].set_yscale('log')
plt.show()
这给出了一个没有Infzy值的情节,Lazyman在1600米处:
我还为ggplot准备了一个csv(可能有更好的方法可以做到这一点):
RACER,TRACK,TIME
Superman,100m,0.1
Superman,400m,0.5
Superman,1600m,1
Lazyman,100m,200
Lazyman,400m,900
Lazyman,1600m,Inf
使用ggplot:
require(ggplot2)
d <- read.csv('racing2.csv')
g <- ggplot(d) + geom_line(aes(x=TRACK,y=TIME,group=RACER, color=RACER))
g <- g + scale_y_log10()
ggsave('ggplot.png')
我离得更近了:
任何解决方案,无论是Python还是R,都将受到赞赏。此外,赞赏有关标记未完成比赛的建议。
答案 0 :(得分:2)
使用R和ggplot2
:
构建一些虚假数据:
df <- data.frame(ID = factor(c(rep(1, 3), rep(2, 3), rep(3, 3)), labels = c('Realman', 'Lazyman', 'Superman')),
race = factor(rep(seq(1,3,1), 3), labels = c('100m', '400m', '1600m')),
runTime = c(8.9, 20.5, 150.9, 100.1, 300.3, +Inf, 1.2, 5, +Inf))
ID race runTime
# 1 Realman 100m 8.9
# 2 Realman 400m 20.5
# 3 Realman 1600m 150.9
# 4 Lazyman 100m 100.1
# 5 Lazyman 400m 300.3
# 6 Lazyman 1600m Inf
# 7 Superman 100m 1.2
# 8 Superman 400m 5.0
# 9 Superman 1600m Inf
ggplot(filter(df, runTime != +Inf), aes(x = race, y = runTime, group = ID, color = ID)) +
geom_line(size = 2) +
geom_point(size = 4) +
geom_line(data = df, linetype = 'dashed', size = 1) +
geom_point(data = df, shape = 21, size = 1) +
geom_text(aes(label = runTime), position = position_nudge(y = -.1)) +
scale_y_continuous(trans = 'log10', breaks = c(1, 10, 100, 1000)) +
scale_x_discrete('Track') +
scale_color_manual('Racer', values = brewer.pal(length(levels(df$ID)), 'Set1')) +
theme(panel.background = element_blank(),
panel.grid.major.x = element_line(colour = 'lightgrey', size = 25),
legend.position = 'top',
axis.line.y = element_line('black', .5, arrow = arrow()))