2013-10-09 14 views
12

Próbuję wykreślić matrycę rozproszoną. Buduję na przykładzie podanym w tym wątku Is there a function to make scatterplot matrices in matplotlib?. Właśnie zmodyfikowałem kod, aby oś była widoczna dla wszystkich podpikseli. Zmodyfikowany kod jest podany poniżej:Obracanie tekstu osi dla każdego subplota

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

Nie mogę wydawać się zdolny do obracania tekstu na osi X wszystkich podpikseli. Jak widać, próbowałem sztuczki plt.xticks (rotation = 45). Ale wydaje się, że wykonuje on obrót tylko dla ostatniego wątku.

Odpowiedz

20

plt działa tylko na bieżących aktywnych osiach. Należy przynieść go wewnątrz ostatniej pętli, gdzie można ustawić jedne z widocznością etykiet na 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 Na marginesie, znacznie łatwiej jest po prostu powtórzyć nad 'axes.flat' zamiast przejść przez wszystkie pary i, j. Można również użyć polecenia 'plt.setp (ax.get_xticklabels(), rotation = 45)' zamiast powtarzania każdej etykiety. To tylko kwestia stylu. –

+0

Zgadzam się, ale iteracja j i j już tam istniała i wykorzystuje tylko podzbiór wszystkich osi, więc nie ma potrzeby obracania ukrytych etykiet. "Setp" jest naprawdę dobrym dodatkiem, nie mogłem myśleć o "siekierkowym" sposobie robienia tego od razu, to robi sztuczkę! –

13

Wystarczy iterację osi przywiązane do rysunku, ustaw aktywnych osi do potwierdzili obiektu i modyfikować:

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