【问题标题】:matplotlib scatter plots do not display when populated using for loop使用 for 循环填充时,matplotlib 散点图不显示
【发布时间】:2015-06-07 13:36:22
【问题描述】:

我正在尝试编写一个函数来使用 Python 3.4 中的 matplotlib 生成 Matlab 风格的相关图(例如 here)。但是,我想更改绘图,以便对角线子图显示变量的名称,下三角子图显示 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()

为了确定问题的根源,我使用以下代码手动重建了 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()

由于这行得通,我假设问题与在子图中混合文本和数据无关。我编写了下一个函数来测试使用 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()

接下来,我尝试使用 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()

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

【问题讨论】:

  • 您好,欢迎来到 SO!非常感谢创建 MCVE。它不是 100% 的功能,但是,您需要将名称的定义更改为 names = ['Var' + str(i) for i in range(data.shape[1])](字符串为 'str',而您忘记了 range)。一旦我这样做并添加了对“corrplot”的调用,我实际上得到的结果工作得很好。你用的是什么版本的 matplotlib?
  • 我使用的是 matplotlib 1.4.3。我昨天使用 Anaconda 发行版并更新了所有内容,以确保旧版本不是问题。
  • 你对默认的rcParams有什么改变吗?这是我能想到的唯一可能使这些点消失的另一件事。尝试将plt.rcdefaults() 放在顶部,看看你会得到什么。
  • 我没有对 rcParams 进行任何更改。在顶部添加它并没有改变任何东西。
  • 恐怕我有点不知所措......即使你的'test2'对你来说是空白的,看起来它应该适合我。您使用什么后端,什么操作系统?

标签: python matplotlib


【解决方案1】:

您的代码准确地显示了所需的情节。 我认为您的matplolib 版本无法识别marker = '.'

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

【讨论】:

  • 最终我找到了一个不使用 matplotlib 的不同解决方案。但是,使用更新版本的 matplotlib 重新审视这一点,它可以完美运行。感谢您的回答;它让我重新审视这个并意识到它确实有效。
猜你喜欢
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多