2014-05-11 23 views
1

我有一個奇怪的問題,在圖例中的標籤順序。我正在製作一個散點圖,我在那裏預先排列數據列表,以便在頂部繪製更小的點(在此問題中向我提出的完成方法:Plot larger points on bottom and smaller on top傳奇中的標籤

問題我是因爲圖例中標籤的順序顯然是分散的。這裏有一個MWE來說明我的意思:

import matplotlib.pyplot as plt 
import numpy as np 

def rand_data(): 
    return np.random.uniform(low=0., high=1., size=(100,)) 

# Generate data. 
x, y, x2, x3 = [rand_data() for i in range(4)] 
# This data defines the markes and labels used. 
x1 = np.random.random_integers(7, 9, size=(100,)) 

# Order all lists so smaller points are on top. 
order = np.argsort(-np.array(x2)) 
# Order x and y. 
x_o, y_o = np.take(x, order), np.take(y, order) 
# Order list related to markers and labels. 
z1 = np.take(x1, order) 
# Order list related to sizes. 
z2 = np.take(x2, order) 
# Order list related to colors. 
z3 = np.take(x3, order) 

plt.figure() 
cm = plt.cm.get_cmap('RdYlBu') 

# Scatter plot where each value in z1 has a different marker and label 
# assigned. 
mrk = {7: ('o', '7'), 8: ('s', '8'), 9: ('D', '9')} 
for key, value in mrk.items(): 

    s1 = (z1 == key) 
    plt.scatter(x_o[s1], y_o[s1], marker=value[0], label=value[1], 
     s=z2[s1] * 100., c=z3[s1], cmap=cm, lw=0.2) 

# Plot colorbar 
plt.colorbar() 

# Plot legend. 
plt.legend(loc="lower left", markerscale=0.7, scatterpoints=1, fontsize=10) 

plt.show() 

產生的圖像看起來像這樣:

enter image description here

可以看出圖例顯示如8, 9, 7的標籤時,它應該是7, 8, 9

奇怪的是,如果我不是設置定義x1名單和持有的標記和標籤,像這樣mrk字典中的臺詞:

x1 = np.random.random_integers(1, 3, size=(100,)) 
mrk = {1: ('o', '1'), 2: ('s', '2'), 3: ('D', '3')} 

產生的傳說下令爲1, 2, 3

因此,這裏發生了什麼,以及我如何強制圖例被訂購,無論我在x1中使用哪些數字來定義標記和標籤?

回答

1

那麼,這是因爲字典.items()方法返回未排序的列表。但你可以這麼做:

for key, value in sorted(mrk.items()): 
    <..> 

它會得到(key, value)元組對中要求的順序:7 8 9

+0

嗯,這是既簡單又有效。非常感謝你方面! – Gabriel