2016-12-13 97 views
3

我想創建一個散點圖,其中顯示了在熊貓中彼此映射的兩列,大小的三分之一以及基於標籤點的顏色(在下面的情況,姓氏)。熊貓散點圖使用數據幀字段導出顏色和圖例

然後,我希望有一個傳說,顯示的顏色,然後

每個姓氏應該用不同的顏色和圖例顯示關聯的姓氏值點,例如,一個綠點和米勒,一個紅點和雅各布森等

%matplotlib inline 
import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np 


raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
    'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'], 
    'female': [0, 1, 1, 0, 1], 
    'age': [42, 52, 36, 24, 73], 
    'preTestScore': [4, 24, 31, 2, 3], 
    'postTestScore': [25, 94, 57, 62, 70]} 
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'female', 'preTestScore', 'postTestScore']) 

plt.scatter(df.preTestScore, df.postTestScore, s=df.age, label=df.last_name) 
plt.legend(loc='upper left', prop={'size':6}, bbox_to_anchor=(1,1),ncol=1) 

這一點讓我這樣的事情:

enter image description here

我不知道如何獲得顏色(理想情況下,我喜歡使用調色板)或如何讓圖例顯示姓氏和點

任何幫助將很多讚賞..謝謝!

注 - 我從這裏以Chris Albon爲例。

+0

可以分配每一個點不同的顏色與顏色的列表:'[ 'R', 'B', 'G', 'K', 'Y']'。我不知道如何安排圖例,以便每個人都有自己的排名,但是不會通過一系列的標籤。你可以做一個循環,並調用散佈圖5次不同的時間,這將得到你想要的情節。 –

+0

這裏實際上有一個類似的問題:http:// stackoverflow。com/questions/16614558/legend-using-pathcollections-in-matplotlib – ImportanceOfBeingErnest

回答

1

scatter的調用只會生成圖例條目。如果你想爲每個點打印一個圖例,最簡單的方法就是爲每個點調用打印方法。這不應該成爲性能方面的問題,因爲您不需要圖例中的數千個條目。我將使用plot,因爲它適用於一個點,但如果您需要更好的效果,您也可以使用scatter

for _, row in df.iterrows(): 
    plt.plot(row.preTestScore, row.postTestScore, 'o', ms=np.sqrt(row.age), 
      label=row.last_name) 
plt.legend(loc='upper left', bbox_to_anchor=(1,1)) 

enter image description here

我也沒弄明白(還)如何使點圖例相同的大小 - 並且我不知道這是你想要的。我認爲不同的尺寸看起來不錯,可以幫助找到情節中的人。

或者,您只能使用一個呼叫scatter,然後檢查返回的PathCollection的屬性並手動創建圖例,但我認爲我的方法更清晰。

+1

爲了讓圖例中的點大小相同,您可以調整圖例中手柄的大小,如下所示:handles = plt.gca()。get_legend_handles_labels ()[0]; [handle.set_markersize(10)for handle in handles]; plt.legend(handles = handles)' – ImportanceOfBeingErnest

3

首先,爲了產生顏色,您可以添加一個包含顏色的列到數據框中。然後可以將這些顏色傳遞給scatterc關鍵字參數。

創建帶有不易訪問條目的圖例的常用解決方案是generate proxy artists。在這種情況下,可以創建一組不同顏色的標記並將其提供給legend的參數handles。圖例標籤就是數據框中的最後一個名稱。

import pandas as pd 
import matplotlib.pyplot as plt 
import matplotlib.lines 

raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'], 
    'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'], 
    'female': [0, 1, 1, 0, 1], 
    'age': [42, 52, 36, 24, 73], 
    'preTestScore': [4, 24, 31, 2, 3], 
    'postTestScore': [25, 94, 57, 62, 70], 
    'colors' : ["r", "g", "b", "k", "cyan"]} # add a column for colors 
df = pd.DataFrame(raw_data, 
    columns = ['first_name', 'last_name', 'age', 'female', 'preTestScore', 'postTestScore', "colors"]) 

#supply colors as argument for c 
plt.scatter(df.preTestScore, df.postTestScore, s=df.age, c=df.colors) 
# generate proxy artists for legend 
handles = [matplotlib.lines.Line2D([],[], marker="o", color=c, linestyle="none") for c in df.colors.values] 
# supply proxy artists to handles and last names to labels 
plt.legend(handles=handles, labels=list(df.last_name.values), 
      loc='upper left', prop={'size':6}, bbox_to_anchor=(1,1),ncol=1, numpoints=1) 
plt.subplots_adjust(right=0.8) 
plt.show() 

enter image description here