我不确定这在多大程度上回答了您的问题,但这是一种使线条颜色符合颜色图的方法,这通常可以帮助我更轻松地可视化不同的线条及其趋势,但可能不太方便挑选出单条线条。
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
and 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))
使用颜色条
如果对线条使用颜色图,则显示颜色条而不是图例很有用,因此我们使用如下所示的内容:
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)))