2016-10-25 40 views
2

繪製點我試圖與兩個顏色和標籤積點。這不是一個經典問題:實際上,通常python用戶將「標籤」設置爲類別。在這種情況下,我希望顏色代表一個特徵,而標籤是該點本身的標識符。 它遵循的玩具,例如:pylab:顏色和標籤(標識,不分類)

x = [-0.01611772, 1.51755901, -0.64869352, -1.80850313, -0.11505037] 
y = [ 0.04845168, -0.45576903, 0.62703651, -0.24415787, -0.41307092] 

colors = ['b', 'g', 'r', 'b', 'r'] 
labels = ['Gioele', 'Felix', 'Elpi', 'Roro', 'Cacara'] 

我想使用的功能分散。繼 「快」 的文件:

def scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs) Inferred type: (x: Any, y: Any, s: int, c: Any, marker: unicode, cmap: Any, norm: Any, vmin: Any, vmax: Any, alpha: Any, linewidths: Any, verts: Any, edgecolors: Any, hold: Any, data: Any, kwargs: dict) -> Any 

所以,我的嘗試是:

import pylab 
pylab.scatter(x, y, c=colors, data=labels) 
pylab.show() 

但似乎忽略了data=labels部分。

此外:假設我們可以繪製標籤,有沒有辦法來繪製他們在一個「聰明」的方式,即,使得標籤不隱瞞對方?我需要類似於R功能ggrepel的東西。

回答

3

我想用plt.annotate是一個不錯的選擇。把你的例子:

import matplotlib.pyplot as plt 

x = [-0.01611772, 1.51755901, -0.64869352, -1.80850313, -0.11505037] 
y = [ 0.04845168, -0.45576903, 0.62703651, -0.24415787, -0.41307092] 
colors = ['b', 'g', 'r', 'b', 'r'] 
labels = ['Gioele', 'Felix', 'Elpi', 'Roro', 'Cacara'] 

plt.scatter(x,y,c=colors) 
for label,xi,yi in zip(labels,x,y): 
    plt.annotate(label,xy=(xi,yi),textcoords='offset points', 
    ha='left',va='bottom') 

這給出了以下的輸出:

enter image description here

編輯:我剛剛發現,你還問到標籤重疊了。 This question似乎有一個很好的解決方案。顯然還有一段代碼on github,用於模擬ggrepel

+0

「UserWarning:你已經使用了'textcoords' kwarg,但不是'xytext' kwarg這可能會導致意想不到的結果」 ......儘管它....它的工作原理。我希望我能避免Cicle,但......至少我有一個解決方案。謝謝! :) –

+0

剛剛編輯包括一些有關防止重疊標籤的東西,對不起,我沒有發現第一次。有趣的是,我沒有得到你所指的'UserWarning'。你是否通過執行我在上面發佈的代碼來得到這個警告? –