2014-09-29 50 views
5

我正在用Pandas繪製一個散點圖矩陣,但第一個繪圖的刻度標籤有時會被正確繪製,有時會被錯誤地繪製。我無法弄清楚什麼是錯的!散點圖中的刻度線標籤與熊貓的繪製不正確

下面是一個例子:

enter image description here

代碼:

from pandas.tools.plotting import scatter_matrix 
import pylab 
import numpy as np 
import pandas as pd 

def create_scatterplot_matix(X, name):  
    """ 
    Outputs a scatterplot matrix for a design matrix. 

    Parameters: 
    ----------- 
    X:a design matrix where each column is a feature and each row is an observation. 
    name: the name of the plot. 
    """ 
    pylab.figure() 
    df = pd.DataFrame(X) 
    axs = scatter_matrix(df, alpha=0.2, diagonal='kde') 

    for ax in axs[:,0]: # the left boundary 
     ax.grid('off', axis='both') 
     ax.set_yticks([0, .5]) 

    for ax in axs[-1,:]: # the lower boundary 
     ax.grid('off', axis='both') 
     ax.set_xticks([0, .5]) 

    pylab.savefig(name + ".png") 

傢伙,任何人!

編輯(X的例子):

X = np.random.randn(1000000, 10) 
+2

你有一個設計矩陣'X'的例子嗎?例如,可以使用一組隨機值輕鬆創建一個。這樣可以更容易在本地嘗試。 – Evert 2014-10-07 15:31:16

+0

@Evert請參閱編輯。 – 2014-10-13 15:45:40

回答

2

這是預期的行爲。 y軸值顯示第0列的y軸值。第0行第0列包含概率密度圖。第0行,第1至第3列包含用於在對角線上創建圖形的數據。

在Pandas Plotting文檔中的example看起來類似。

示範:

from pandas.tools.plotting import scatter_matrix 
import pylab 
import numpy as np 
import pandas as pd 

def create_scatterplot_matix(X, name):  
    pylab.figure() 

    df = pd.DataFrame(X) 
    axs = scatter_matrix(df, alpha=0.2, diagonal='kde') 

    pylab.savefig(name + ".png") 

create_scatterplot_matix([[0,0,0,0] 
         ,[1,1,1,1] 
         ,[1,1,1,1] 
         ,[2,2,2,2]],'test') 

在這個例子中的代碼,我已經用於演示一個非常簡單的數據集。我也刪除了設置y和x滴答的代碼段。

這是所得到的曲線圖:

enter image description here

在每個對角線的是概率密度曲線圖。在每個非對角線中用於創建對角線圖的數據。第0行的y軸顯示位於第0,0位置的概率密度圖的y軸。第1行,第2行和第3行的y軸顯示了用於在對角線上創建概率密度圖的0,1,0,2和0,3位置的數據的y軸。

您可以在我們的示例中看到以下繪製點:[0,0] [1,1] [2,2]。 [1,1]處的點較暗,因爲此處的點數多於其他點的點數。

發生了什麼是你的數據集,所有的值都在0和1之間,這就是爲什麼0.5在兩個軸上完全顯示在行/列的中心。然而,數據嚴重傾向於0值,這就是爲什麼概率密度圖峯值越接近0就越好。第0行的概率密度圖的最大值看起來像是(眼球測試)大約8 -10。

我會親自做的是編輯您的左邊界的代碼是這樣的:

autoscale = True # We want the 0,0th item's y-axis to autoscale 
for ax in axs[:,0]: # the left boundary 
    ax.grid('off', axis='both') 
    if autoscale == True:  
     ax.set_autoscale_on(True) 
     autoscale = False 
    else: 
     ax.set_yticks([0, 0.5]) 

在本例中的數據集,使用這種技術產生這樣的圖表:

enter image description here

0

這似乎是熊貓中的一個錯誤。請參閱https://github.com/pydata/pandas/issues/5662

與此同時,您可以手動調整標籤。首先,根據內核密度圖中的範圍設置標籤的數量和所需的間隔。

axs[0,0].set_yticks([0.24,0.33,0.42]) 

然後手動更改標籤中的文字。

axs[0,0].set_yticklabels([0.0, 1.0, 2.0])