Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在matplotlib中识别图形线_Python_Pandas_Matplotlib_Dataframe_Plot - Fatal编程技术网

Python 如何在matplotlib中识别图形线

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"

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