2013-04-26 51 views
3

散點圖矩陣蜱性能我試圖根據由喬金頓編寫的代碼繪製的散點圖矩陣:Is there a function to make scatterplot matrices in matplotlib?與Matplotlib

有些人已經幫我:再次感謝你(尤其是J.K.)。

我有最後一個問題:我不能旋轉某些軸用於哪些號碼不重複(左下)蜱:

我想嘗試讓他們垂直的,但我不能這樣做這....這是我的代碼:

import itertools 
import numpy as np 
import pylab as plot 
import scipy 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib import axis 
import math 
from matplotlib import rc 
import os 
import platform 


def main(): 
    FigSize=8.89 
    FontSize=8 
    np.random.seed(1977) 
    numvars, numdata = 4, 10 
    data = 10 * np.random.random((numvars, numdata)) 
    fig = scatterplot_matrix(data, ['mpg', 'disp', 'drat', 'wt'], FigSize, FontSize, 
     linestyle='none', marker='o', color='black', mfc='none', markersize=3,) 
    fig.suptitle('Simple Scatterplot Matrix') 
    plt.savefig('Plots/ScatterplotMatrix/ScatterplotMatrix2.pdf',format='pdf', dpi=1000, transparent=True, bbox_inches='tight') 
    plt.show() 


def scatterplot_matrix(data, names, FigSize, FontSize, **kwargs): 
    """Plots a scatterplot matrix of subplots. Each row of "data" is plotted 
    against other rows, resulting in a nrows by nrows grid of subplots with the 
    diagonal subplots labeled with "names". Additional keyword arguments are 
    passed on to matplotlib's "plot" command. Returns the matplotlib figure 
    object containg the subplot grid.""" 

    legend=['(kPa)','\%','\%','\%'] 
    numvars, numdata = data.shape 
    fig, axes = plt.subplots(nrows=numvars, ncols=numvars, figsize=(FigSize/2.54,FigSize/2.54)) 
    fig.subplots_adjust(hspace=0.05, wspace=0.05) 

    sub_labelx_top=[2,4] 
    sub_labelx_bottom=[13,15] 
    sub_labely_left=[5,13] 
    sub_labely_right=[4,12] 

    for i, ax in enumerate(axes.flat, start=1): 
     # Hide all ticks and labels 
     ax.xaxis.set_visible(False) 
     ax.yaxis.set_visible(False) 
     ax.xaxis.set_major_locator(MaxNLocator(prune='both',nbins=4)) 
     ax.yaxis.set_major_locator(MaxNLocator(prune='both',nbins=4)) #http://matplotlib.org/api/ticker_api.html#matplotlib.ticker.MaxNLocator 


     # Set up ticks only on one side for the "edge" subplots... 
     if ax.is_first_col(): 
      ax.yaxis.set_ticks_position('left') 
      ax.tick_params(direction='out') 
      ax.yaxis.set_tick_params(labelsize=0.75*FontSize) 
      if i in sub_labely_left: 
     ax.yaxis.set_label_position('left') 
      ax.set_ylabel('(\%)',fontsize=0.75*FontSize) 

     if ax.is_last_col(): 
      ax.yaxis.set_ticks_position('right') 
      ax.tick_params(direction='out') 
      ax.yaxis.set_tick_params(labelsize=0.75*FontSize) 
      if i in sub_labely_right: 
       ax.yaxis.set_label_position('right') 
       if i==4: 
       ax.set_ylabel('(kPa)',fontsize=0.75*FontSize) 
       else: 
       ax.set_ylabel('(\%)',fontsize=0.75*FontSize) 

     if ax.is_first_row(): 
      ax.xaxis.set_ticks_position('top') 
      ax.tick_params(direction='out') 
      ax.xaxis.set_tick_params(labelsize=0.75*FontSize) 
      if i in sub_labelx_top: 
       ax.xaxis.set_label_position('top') 
       ax.set_xlabel('(\%)',fontsize=0.75*FontSize) 

     if ax.is_last_row(): 
      ax.xaxis.set_ticks_position('bottom') 
      ax.tick_params(direction='out') 
      ax.xaxis.set_tick_params(labelsize=0.75*FontSize) 

      if i in sub_labelx_bottom: 
       ax.xaxis.set_label_position('bottom') 

       if i==13: 
       ax.set_xlabel('(kPa)',fontsize=0.75*FontSize) 
       else: 
       ax.set_xlabel('(\%)',fontsize=0.75*FontSize) 

      # Plot the data. 
    for i, j in zip(*np.triu_indices_from(axes, k=1)): 
     for x, y in [(i,j), (j,i)]: 
      axes[x,y].plot(data[y], data[x], **kwargs) 



    # Label the diagonal subplots... 
    for i, label in enumerate(names): 
     axes[i,i].annotate(label, (0.5, 0.5), xycoords='axes fraction', 
      ha='center', va='center',fontsize=FontSize) 

    # Turn on the proper x or y axes ticks. 
    for i, j in zip(range(numvars), itertools.cycle((-1, 0))): 
     axes[j,i].xaxis.set_visible(True) 
     axes[i,j].yaxis.set_visible(True) 

    return fig 

main() 

我的第二個問題是更多的「樂趣」:我怎樣才能使次要情節完美的正方形?

我向Joe Kington道歉;我知道我的代碼不如他的優雅......我剛剛在幾周前開始。如果您有任何改進我的建議,例如讓它更具活力,我非常有趣。

回答

4

您可以使用setp旋轉xtick標籤。

from matplotlib.artist import setp 

然後在設置了頂行的X刻度位置和插曲通話的左欄:

setp(ax.get_xticklabels(), rotation=90) 

爲了使次要情節的大小相等,那麼可以fig.subplots_adjust設置的區域所有的小塊到一個正方形。例如:

gridSize = 0.6 
leftBound = 0.5 - gridSize/2 
bottomBound = 0.1 
rightBound = leftBound + gridSize 
topBound = bottomBound + gridSize 
fig.subplots_adjust(hspace=0.05, wspace=0.05, left=leftBound, 
         bottom=bottomBound, right=rightBound, top=topBound) 

如果數字大小不是正方形,則需要相應地更改網格的形狀。或者,您可以使用fig.add_axes分別添加每個子圖軸。這將允許您直接設置尺寸,但您還必須設置位置。

請勿使用bbox_inches='tight'來保存該數字,否則您將失去使用這些設置的標題。您可以保存這樣的:

plt.savefig('ScatterplotMatrix.pdf',format='pdf', dpi=1000, transparent=True) 

結果圖如下所示:

scatter plot matrix

+0

非常感謝您!這正是我所期待的! – Viktor 2013-04-28 00:31:00