簡體   English   中英

如何在matplotlib中識別圖形線

[英]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)

如果你想每個標記有不同的色調的紅色和綠色,可以用RedsGreens的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM