使用matplotlib绘制三角形状的多子图

3

我有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")

我想使用subplot将所有这些图保存在一个图中,其中第一行将有组合(0,1) (0,2) (0,3) (0,4) (0,5),第二行为(1,2) (1,3) (1,4) (1,5),第三行为(2,3) (2,4) (2,5),以此类推。
因此,最终的结果将是一个包含三角形子图的图。
更新:
如果我使用subplots(如下所示的代码),我可以得到某种程度上的结果,但它并不是最优的,因为我创建了一个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
你有考虑过使用 plt.subplots 或者 gridspec 吗? - tacaswell
我基于子图添加了新代码,但是我不喜欢结果。我还会检查 gridspec。 - fgypas
1个回答

0

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

Not-redundant plots of combinations from a 6-element list

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

N.b.: 从做显然的事情(使用您原始代码中的add_subplot(5,5,cnt)))导致的错误是一个很好的提示:

...User/lib/python2.7/site-packages/matplotlib/axes.pyc in init(self, fig, *args, **kwargs)

9249 self._subplotspec = GridSpec(rows, cols)[num[0] - 1:num1]

9250 else:

-> 9251 self._subplotspec = GridSpec(rows, cols)[int(num) - 1]

9252 # num - 1 for converting from MATLAB to python indexing


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接