Несколько сюжетов в треугольной форме с использованием matplotlib
У меня есть 6 списков, и я хочу создать диаграммы рассеяния для всех возможных комбинаций. Это означает, что я хочу создать n(n-1)/2 комбинаций, так что 15 участков. Я сделал это правильно на основе следующего сценария.
for i in d:
for j in d:
if(j>i):
plt.cla() # Clear axis
plt.clf() # Clear figure
correlation_coefficient = str(np.corrcoef(d[i], d[j])[0][1])
plt.scatter(d[i],d[j])
plt.xlabel(names[i])
plt.ylabel(names[j])
plt.title('Correlation Coefficient: '+correlation_coefficient)
plt.grid()
plt.savefig(names[i]+"_"+names[j]+".png")
Я хочу сохранить все эти графики на одной фигуре, используя подплот, где в первом ряду будут комбинации (0,1) (0,2) (0,3) (0,4) (0,5) во втором ряду (1,2) (1,3) (1,4) (1,5) третий ряд (2,3) (2,4) (2,5) и т. Д.
Таким образом, окончательным результатом будет фигура, содержащая участки в треугольной форме.
Обновление:
Если я использую вспомогательные сюжеты (код ниже), я смог каким-то образом получить результат, но он не оптимален, поскольку я создаю кадр 6x6, тогда как вы можете сделать это с 5x5.
fig = plt.figure()
cnt = 0
# Create scatterplots for all pairs
for i in d:
for j in d:
if(i>=j):
cnt=cnt+1
if(j>i):
cnt += 1
fig.add_subplot(6,6,cnt) #top left
correlation_coefficient = str(np.corrcoef(d[i], d[j])[0][1])
plt.scatter(np.log(d[i]),np.log(d[j]))
fig.savefig('test.png')
1 ответ
С gridspec:
from matplotlib import pyplot as plt
fig = plt.figure()
data = [(1,2,3),(8,2,3),(0,5,2),(4,7,1),(9,5,2),(8,8,8)]
plotz = len(data)
for i in range(plotz-1):
for j in range(plotz):
if(j>i) :
print(i,j)
ax = plt.subplot2grid((plotz-1, plotz-1), (i,j-1))
ax.xaxis.set_ticklabels([])
ax.yaxis.set_ticklabels([])
plt.scatter(data[i],data[j]) # might be nice with shared axis limits
fig.show()
С add_subplot вы столкнулись со странностью, унаследованной от MATLAB, которая 1 индексирует количество подзаговоров. (Также у вас есть некоторые ошибки подсчета.) Вот пример, который просто отслеживает различные индексы:
from matplotlib import pyplot as plt
fig = plt.figure()
count = 0
data = [(1,2,3),(8,2,3),(0,5,2),(4,7,1),(9,5,2),(8,8,8)]
plotz = len(data)
for i in range(plotz-1):
for j in range(plotz):
if(j>i):
print(count, i,j, count -i)
ax = fig.add_subplot(plotz-1, plotz-1, count-i)
ax.xaxis.set_ticklabels([])
ax.yaxis.set_ticklabels([])
plt.text(.15, .5,'i %d, j %d, c %d'%(i,j,count))
count += 1
fig.show()
Nb: ошибка при выполнении очевидного (ваш оригинальный код с add_subplot(5,5,cnt))
был хороший намек:
... Пользователь /lib/python2.7/site-packages/matplotlib/axes.pyc в init(self, fig, * args, ** kwargs)
9249 self._subplotspec = GridSpec (строки, столбцы) [num [0] - 1: num 1]
9250 остальное:
-> 9251 self._subplotspec = GridSpec (строки, столбцы) [int (num) - 1]
9252 # num - 1 для преобразования из MATLAB в индексацию Python