3

Joe Kington によって書かれたコードに基づいて散布図行列をプロットしようとしています: matplotlib で散布図行列を作成する機能はありますか?

何人かはすでに私を助けてくれました: ありがとうございました (特に JK)。

私は最後の問題を抱えています: 数字が重なっている軸の目盛りを回転させることができません (左下):

それらを垂直にしたいのですが、できません....これが私のコードです:

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

私の 2 番目の質問は「楽しみ」のためのものです。どうすればサブプロットを完全に正方形にすることができますか?

ジョー・キングトンに謝罪します。私のコードは彼のコードよりもはるかにエレガントではないことを知っています...私は数週間前に始めたばかりです。たとえば、より動的にするなど、私のものを改善するための提案があれば、私は非常に興味深いです。

4

1 に答える 1

4

xtickを使用してラベルを回転できますsetp

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)

Figure のサイズが正方形でない場合は、それに応じてグリッドの形状を変更する必要があります。または、各サブプロットの軸を で個別に追加することもできますfig.add_axes。これにより、サイズを直接設定できますが、場所も設定する必要があります。

Figure の保存には使用しないでくださいbbox_inches='tight'。これらの設定ではタイトルが失われます。次のように保存できます。

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

結果のグラフは次のようになります。

散布図マトリックス

于 2013-04-27T00:34:29.520 に答える