30

我试图绘制一个散点矩阵。我正在建立在这个线程中给出的示例上是否有在 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(rotation=45) 技巧。但这似乎只为最后一个子图执行旋转。

4

3 回答 3

51

只需遍历与图形绑定的轴,将活动轴设置为迭代对象,然后修改:

for ax in fig.axes:
    matplotlib.pyplot.sca(ax)
    plt.xticks(rotation=90)
于 2015-10-29T17:41:09.203 回答
34

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)
于 2013-10-09T13:48:14.550 回答
18
for ax in fig.axes:
    ax.tick_params(labelrotation=90)

于 2020-04-11T05:14:12.443 回答