使用for循环填充时,不显示matplotlib散点图

A-K*_*A-K 7 python matplotlib

我正在尝试编写一个函数来使用Python 3.4中的matplotlib(此处的示例)生成Matlab样式相关图.但是,我想更改绘图,以便对角线子图显示变量的名称,下三角形子图显示Pearson相关系数,上三角形子图显示散点图.下面是一些生成示例数据的代码和我编写的函数.它在正确的位置显示具有可变名称和相关系数的相应4x4子图,但散点图不会显示.

import numpy as np
import matplotlib.pyplot as plt

means = [0, 1, 0, 2]
sig = [[1, 0.5, 0, -0.1], [0.5, 3, 0, 0.2], [0, -0.1, 1, -0.3], [-0.1, 0.2, -0.3, 1]]
data = np.random.multivariate_normal(means, sig, 50)
names = ['Var' + str(i) for i in range(data.shape[1])]

def corrplot(data, names):
    corrMat = np.corrcoef(data, rowvar = 0)
    numVars = data.shape[1]

    fig, ax = plt.subplots(numVars, numVars, sharex = "col", sharey = "row")
    fig.subplots_adjust(wspace = 0, hspace = 0)

    for i in range(numVars):
        for j in range(numVars):
            if i == j: # On the diagonal
                ax[i, j].text(0.5, 0.5, names[i], transform = ax[i, j].transAxes)
            elif i < j: # In the upper triangle
                ax[i, j].scatter(data[:, i], data[:, j], marker = '.')
            elif i > j: # In the lower triangle
                ax[i, j].text(0.5, 0.5, str(round(corrMat[i, j], 3)), transform = ax[i, j].transAxes)
    plt.show()
Run Code Online (Sandbox Code Playgroud)

为了找出问题的根源,我使用以下代码手动重建了2个变量的情节,产生了所需的图:

fig, ax = plt.subplots(2, 2, sharex = "col", sharey = "row")
fig.subplots_adjust(wspace = 0, hspace = 0)
ax[0, 0].text(0.5, 0.5, 'Var0', transform = ax[0, 0].transAxes)
ax[0, 1].scatter(data[:, i], data[:, j], marker = '.')
ax[1, 0].text(0.5, 0.5, '0.5', transform = ax[1, 0].transAxes)
ax[1, 1].text(0.5, 0.5, 'Var1', transform = ax[1, 1].transAxes)
plt.show()
Run Code Online (Sandbox Code Playgroud)

由于这是有效的,我假设问题与在子图中混合文本和数据无关.我编写了下一个函数来测试使用for循环填充子图,并按预期在每个子图中生成散点图.

def test1(data):
    numVars = data.shape[1]
    fig, ax = plt.subplots(numVars, numVars, sharex = "col", sharey = "row")
    fig.subplots_adjust(wspace = 0, hspace = 0)

    for i in range(numVars):
        for j in range(numVars):
            ax[i, j].scatter(data[:, i], data[:, j], marker = '.')
    plt.show()
Run Code Online (Sandbox Code Playgroud)

接下来,我尝试使用for循环仅填充子图的子集.这产生如下的空白网格.

def test2(data):
    numVars = data.shape[1]
    fig, ax = plt.subplots(numVars, numVars, sharex = "col", sharey = "row")
    fig.subplots_adjust(wspace = 0, hspace = 0)

    for i in range(numVars):
        for j in range(i + 1, numVars):
            ax[i, j].scatter(data[:, i], data[:, j], marker = '.')
    plt.show()
Run Code Online (Sandbox Code Playgroud)

这让我相信有一些与for循环有关的错误以及如何创建散点图,但我还没有找到错误.

nin*_*701 1

你的代码准确地显示了所需的情节。\n我认为你的版本matplolib没有\xe2\x80\x99无法识别marker = '.'

\n\n

您可以尝试使用默认标记(不带marker = '.')进行绘图或将其替换为marker = 'o'

\n