如何在matplotlib中识别图形线

时间:2017-06-20 23:23:41

标签: python pandas matplotlib dataframe plot

我有以下格式的路径的x,y数据(样本仅用于说明):

   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中的每条路径。

1 个答案:

答案 0 :(得分: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循环:

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色标,例如:

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)

<强> EDITS

处理传奇

为了仅绘制线而不是终点标记,我们使用的事实是我们首先绘制了线然后绘制了两个标记,这就是将图绘制到轴线队列中的方式,因此我们跳过标记并明确告诉图例要考虑哪些行:

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

使用Colorbar

如果对线条使用色彩映射,则显示颜色条而不是图例是很有用的,所以我们使用以下内容:

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