2013-10-09 21 views
12

散乱行列をプロットしようとしています。私はこのスレッドIs there a function to make scatterplot matrices in matplotlib?で与えられた例を構築しています。ここでは、コードを少し変更して、すべてのサブプロットで軸を表示できるようにしました。変更されたコードは以下の通りです。各サブプロットの回転軸テキスト

import itertools 
import numpy as np 
import matplotlib.pyplot as plt 

def main(): 
    np.random.seed(1977) 
    numvars, numdata = 4, 10 
    data = 10 * np.random.random((numvars, numdata)) 
    fig = scatterplot_matrix(data, ['mpg', 'disp', 'drat', 'wt'], 
      linestyle='none', marker='o', color='black', mfc='none') 
    fig.suptitle('Simple Scatterplot Matrix') 
    plt.show() 

def scatterplot_matrix(data, names, **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.""" 
    numvars, numdata = data.shape 
    fig, axes = plt.subplots(nrows=numvars, ncols=numvars, figsize=(8,8)) 
    fig.subplots_adjust(hspace=0.05, wspace=0.05) 

    for ax in axes.flat: 
     # Hide all ticks and labels 
     ax.xaxis.set_visible(True) 
     ax.yaxis.set_visible(True) 

#  # Set up ticks only on one side for the "edge" subplots... 
#  if ax.is_first_col(): 
#   ax.yaxis.set_ticks_position('left') 
#  if ax.is_last_col(): 
#   ax.yaxis.set_ticks_position('right') 
#  if ax.is_first_row(): 
#   ax.xaxis.set_ticks_position('top') 
#  if ax.is_last_row(): 
#   ax.xaxis.set_ticks_position('bottom') 

    # 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[x], data[y], **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') 

    # 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) 
    fig.tight_layout() 
    plt.xticks(rotation=45) 
    fig.show() 
    return fig 

main() 

すべてのサブプロットのx軸テキストを回転させることができないようです。それが見られるように、私はplt.xticks(回転= 45)トリックを試してみました。しかし、これは最後のサブプロットのみのローテーションを実行しているようです。

答えて

20

pltは、現在のアクティブな軸にのみ作用します。あなたがTrueに、ラベルの可視性のいくつかを設定し、あなたの最後のループ内にそれを持参してください:

# 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) 

    for tick in axes[i,j].get_xticklabels(): 
     tick.set_rotation(45) 
    for tick in axes[j,i].get_xticklabels(): 
     tick.set_rotation(45) 
+8

+1サイドノートでは、すべてのi、jペアをサイクリングするのではなく、 'axes.flat'を反復するほうがはるかに簡単です。また、各目盛ラベルを反復するのではなく、 'plt.setp(ax.get_xticklabels()、rotation = 45)'を使うこともできます。しかしそれはスタイルの問題です。 –

+0

合意しましたが、i、j反復は既に存在し、すべての軸のサブセットのみを使用するため、隠れたラベルを回転させる必要はありません。 'setp'は本当に良い追加です、私は一度にそれをやって' ax.'の方法を考えることができなかった、これはトリックです! –

13

だけで、数字に縛ら軸を反復反復オブジェクトにアクティブな軸を設定し、変更します。

for ax in fig.axes: 
    matplotlib.pyplot.sca(ax) 
    plt.xticks(rotation=90)