Python 如何在matplotlib中识别图形线
我有以下格式的路径的x,y数据(示例仅用于说明): 每条路径都有若干个点,它们由一个序列标识,属于同一序列的点被视为一条路径,依此类推 我使用以下代码绘制了这些路径(使用与上述格式相同的真实数据),并附上了结果:Python 如何在matplotlib中识别图形线,python,pandas,matplotlib,dataframe,plot,Python,Pandas,Matplotlib,Dataframe,Plot,我有以下格式的路径的x,y数据(示例仅用于说明): 每条路径都有若干个点,它们由一个序列标识,属于同一序列的点被视为一条路径,依此类推 我使用以下代码绘制了这些路径(使用与上述格式相同的真实数据),并附上了结果: import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(12, 8)) for (key, grp) in df.groupby("seq"): grp.plot(linestyle = "solid"
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的?它们在图例中都标有相同的颜色。有没有一种方法可以让我区分每一条路径,也许在路径上的某个地方加上标签(但这可能会让图表变得杂乱无章)
我的第二个问题是我想标记每条路径/轨迹的起点和终点。Like起点可以是绿色,终点可以是红色。例如,在上面的示例df中,对于uid-20,第0行的起点是(2,3),第2行的终点是(4,4)。请建议一种方法来标记df中每条路径的起点和终点 我不确定这在多大程度上回答了您的问题,但这是一种使线条颜色与颜色贴图一致的方法,它通常可以帮助我更容易地可视化不同的线条及其趋势,但可能不太方便地挑出一条线条
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)
如果希望每个标记具有不同的红色和绿色色调,可以使用红色
和绿色
颜色贴图,例如:
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)))
非常感谢,是的,第一部分很棘手,我不确定是否有可能完全挑出线条,当有大量的轨迹时也是如此。对于第二部分,线条起点和终点的标记在线条本身具有相同的颜色,我想特别将df路径的起点标记保持为红色,终点标记保持为绿色,我该如何做?非常感谢。。只需稍作修改,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)我正试图用这段代码将图例移到图表的右侧:box=ax.get_position()ax.set_position([box.x0,box.y0,box.width*0.8,box.height])ax图例(loc='中左',bbox_to_anchor=(1,0.5))这是可行的,但在图例中,它还分别包括所有红色和绿色标记,即使在为grp.iloc[[0]]和grp.iloc[-1]]创建图例“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)))