2017-06-20 24 views
3

圖表線I具有的x,用於以下列格式路徑Y數據(僅出於說明的樣品):如何確定在matplotlib

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中的每個路徑。

回答

2

我不確定這個答案有多少能夠回答你的問題,但這是一種使線條顏色符合顏色貼圖的方法,這通常可以幫助我更容易地看到不同的線條和趨勢,但可能不便於單出一條線。

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 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) 

編輯

處理傳奇

要繪製只有線條,而不是終點標誌,我們使用的事實,我們首先繪製的線,然後將兩個標誌,這也是該地塊是如何被推入軸行隊列,所以我們跳過標記,並明確地告訴傳奇行考慮其中:

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))) 
+0

太感謝你了,是的,第一部分是棘手的,我不知道,如果它甚至有可能完全單一的行,太當有大量的軌跡。對於第二部分,線條開始和結束處的標記與線條本身具有相同的顏色,我想特別將開始標記保留爲紅色,並將結束標記保留爲綠色以顯示df的路徑,我該怎麼做那? – Liza

+0

請參閱更新。 –

+0

感謝洛特..只是一點點改變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),否則會改變整個繪圖。 – Liza