我有以下格式的路径的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中的每条路径。
答案 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)
如果您希望每个标记具有不同的红色和绿色色调,则可以使用Reds
和Greens
色标,例如:
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)))