matplotlib 如何识别图形线

b91juud3  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(176)

我有以下格式的路径的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。

gjmwrych

gjmwrych1#

我不确定这在多大程度上回答了你的问题,但这是一种使线条颜色符合色彩Map表的方法,它通常可以帮助我更容易地可视化不同的线条及其趋势,但可能不太方便挑出一条线条。

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颜色Map表,例如:

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

使用颜色栏

如果对线条使用颜色Map表,显示颜色条而不是图例会很有用,因此我们使用如下内容:

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

相关问题