2017-06-20 25 views
3

图表线I具有的x,用于以下列格式路径Y数据(仅出于说明的样品):如何确定在matplotlib

seq p1  p2 
0 20  2  3 
1 20  2  4 
2 20  4  4 
3 22  5  5 
4 22  5  6 
5 23  6  2 
6 23  6  3 
7 23  6  4 

每个路径具有的点数和它们由SEQ识别属于同一个seq的点被认为是一条路径,依此类推。

我使用下面的代码绘制了这些路径(使用与上述相同格式的我的真实数据)并附加了结果:

import matplotlib.pyplot as plt 

fig, ax = plt.subplots(figsize=(12, 8)) 

for (key, grp) in df.groupby("seq"): 
    grp.plot(linestyle = "solid", x="p1", y="p2", ax = ax, label = key) 

box = ax.get_position() 
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height]) 
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5)) 

plt.title("Paths") 
plt.show() 

我绘制了大约40条路径,现在的问题是我应该如何确定哪个路径是用于uid 184,哪个路径是uid-194?它们都在图例中用相同的颜色标记。有没有一种方法能够明确地识别每条路径,也可以在路径上的某处标记(但可能会使图形混乱)。

我的第二个问题是我想标记每个路径/轨迹的起点和终点。像起点可以绿色终点可以红色。例如,在上面的示例df中,对于uid-20,起始点是第0行中的(2,3),第2行中的终点是(4,4)。请建议一种方法将这些起点和终点标记为df中的每个路径。

回答

2

我不确定这个答案有多少能够回答你的问题,但这是一种使线条颜色符合颜色贴图的方法,这通常可以帮助我更容易地看到不同的线条和趋势,但可能不便于单出一条线。

cmap = plt.cm.get_cmap('viridis') 
groups = df.groupby("uid") 
ngroups = len(groups) 

for i, (key, grp) in enumerate(groups): 
    grp.plot(linestyle="solid", x="px", y="py", ax=ax, label=key, color=cmap(i/(ngroups-1)) 

要为第一个和最后一个点添加标记,只需将它们单独添加并为它们分配您喜欢的颜色和标记。所以,重写为上述循环:

for i, (key, grp) in enumerate(df.groupby("uid")): 
    grp.plot(linestyle="solid", x="px", y="py", ax=ax, label=key, color=cmap(i/(ngroups-1))) 
    grp.iloc[[0]].plot(marker="o", x="px", y="py", ax=ax, color='r', legend=False) 
    grp.iloc[[-1]].plot(marker="o", x="px", y="py", ax=ax, color='g', legend=False) 

,如果你想每个标记有不同的色调的红色和绿色,您可以使用RedsGreens的colormaps如:

start_cmap = plt.cm.get_cmap('Reds') 
end_cmap = plt.cm.get_cmap('Greens') 

,并在循环将是

grp.iloc[[0]].plot(marker="o", x="px", y="py", ax=ax, color=start_cmap(i/(ngroups-1)), legend=False) 
grp.iloc[[-1]].plot(marker="o", x="px", y="py", ax=ax, color=end_cmap(i/(ngroups-1)), legend=False) 

编辑

处理传奇

要绘制只有线条,而不是终点标志,我们使用的事实,我们首先绘制的线,然后将两个标志,这也是该地块是如何被推入轴行队列,所以我们跳过标记,并明确地告诉传奇行考虑其中:

ax.legend(ax.lines[::3], groups.groups.keys(), loc='center left', bbox_to_anchor=(1, 0.5)) 

使用彩条

如果使用的线颜色表,它是显示一个有用的彩条,而不是传说,所以我们用这样的:

from matplotlib.colorbar import ColorbarBase 
import matplotlib as mp 

values = list(groups.groups.keys()) 
cax = fig.add_axes([0.92, 0.12, 0.02, 0.75]) 
cbar = ColorbarBase(cax, cmap=cmap, format='%d', ticks=values, drawedges=False, norm=mp.colors.Normalize(vmin=min(values), vmax=max(values))) 
+0

太感谢你了,是的,第一部分是棘手的,我不知道,如果它甚至有可能完全单一的行,太当有大量的轨迹。对于第二部分,线条开始和结束处的标记与线条本身具有相同的颜色,我想特别将开始标记保留为红色,并将结束标记保留为绿色以显示df的路径,我该怎么做那? – Liza

+0

请参阅更新。 –

+0

感谢洛特..只是一点点改变grp.iloc [0]/grp.iloc [-1]应该是这样的双方括号:grp.iloc [[0]] .plot(marker =“o”, x =“px”,y =“py”,ax = ax,color ='r',legend = False)和grp.iloc [[-1]] .plot(marker =“o”,x =“px” ,y =“py”,ax = ax,color ='g',legend = False),否则会改变整个绘图。 – Liza