2017-10-06 104 views
0

目前,我有以下代碼Matplotlib疊加柱狀圖使用`對大熊貓據幀scatter_matrix`

import matplotlib.pyplot as plt 
import pandas as pd 
from pandas.plotting import scatter_matrix 

df= pd.read_csv(file, sep=',') 
colors = list('r' if i==1 else 'b' for i in df['class']) # class is either 1 or 0 
plt.figure() 
scatter_matrix(df, color=colors) 
plt.show() 

這說明,而不是簡單的輸出如下

enter image description here

但在對角線這個情節,直方圖我想顯示堆疊直方圖,如下所示,對於類「1」它是紅色的,對於「0」它是藍色的

enter image description here

請指導我該怎麼做?

+0

有包稱爲'seaborn' – Wen

回答

1

使用seaborn的可能是用於繪製散佈矩陣樣的情節是非常有益的。但是,我不知道如何繪製一個堆積的直方圖很容易地進入seaborn的PairGrid的對角線。
正如問題無論如何要求matplotlib,以下是使用熊貓和matplotlib的解決方案。不幸的是,它需要手工做很多事情。以下是一個例子(請注意,由於問題沒有提供,因此seaborn只能導入以獲取一些數據)。

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

# seaborn import just needed to get some data 
import seaborn as sns 
df = sns.load_dataset("iris") 


n_hist = 10 
category = "species" 
columns = ["sepal_length","sepal_width","petal_length","petal_width"] 
mi = df[columns].values.min() 
ma = df[columns].values.max() 
hist_bins = np.linspace(mi, ma, n_hist) 


fig, axes = plt.subplots(nrows=len(columns), ncols=len(columns), 
         sharex="col") 

for i,row in enumerate(columns): 
    for j,col in enumerate(columns): 
     ax= axes[i,j] 
     if i == j: 
      # diagonal 
      mi = df[col].values.min() 
      ma = df[col].values.max() 
      hist_bins = np.linspace(mi, ma, n_hist) 
      def hist(x): 
       h, e = np.histogram(x.dropna()[col], bins=hist_bins) 
       return pd.Series(h, e[:-1]) 
      b = df[[col,category]].groupby(category).apply(hist).T 
      values = np.cumsum(b.values, axis=1) 
      for k in range(len(b.columns)): 
       if k == 0: 
        ax.bar(b.index, values[:,k], width=np.diff(hist_bins)[0]) 
       else: 
        ax.bar(b.index, values[:,k], width=np.diff(hist_bins)[0], 
          bottom=values[:,k-1]) 
     else: 
      # offdiagonal 
      for (n,cat) in df.groupby(category): 
       ax.scatter(cat[col],cat[row], s = 5,label=n,) 
     ax.set_xlabel(col) 
     ax.set_ylabel(row) 
     #ax.legend() 
plt.tight_layout() 
plt.show() 

enter image description here

1

示例代碼

import seaborn as sns 
sns.set(style="ticks") 
df = sns.load_dataset("iris") 
sns.pairplot(df, hue="species") 

enter image description here

+0

有seaborn和背景虛化也能做到這一點,但我想以某種方式與matplotlib工作。在matplotlib中可能嗎?謝謝各位 – muazfaiz

+0

不幸的是,這個答案不會繪製**堆積的直方圖。如果有人有一個很好的解決方案來繪製堆疊直方圖,我很樂意看到它。 – ImportanceOfBeingErnest