[英]How to identify graph lines in matplotlib
我有以下格式的路徑的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中的每條路徑。
我不確定這回答了你的問題多少,但這是一種使線條顏色符合色彩圖的方法,這通常可以幫助我更容易地想象出不同的線條及其趨勢,但單挑一條線可能不太方便。
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
的colormaps如:
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)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.