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.
+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. –
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ę! –