使用 for 循环填充时不显示 matplotlib 散点图
matplotlib scatter plots do not display when populated using for loop
我正在尝试使用 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 循环以及如何创建散点图相关的错误,但我还没有找到错误。
您的代码准确地显示了所需的情节。
我认为您的 matplolib
版本无法识别 marker = '.'
您可以尝试使用默认标记(没有 marker = '.'
)或将其替换为 marker = 'o'
我正在尝试使用 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 循环以及如何创建散点图相关的错误,但我还没有找到错误。
您的代码准确地显示了所需的情节。
我认为您的 matplolib
版本无法识别 marker = '.'
您可以尝试使用默认标记(没有 marker = '.'
)或将其替换为 marker = 'o'