【问题标题】:Problems with unpacking Matplotlib hist2d outputs解包 Matplotlib hist2d 输出的问题
【发布时间】:2018-01-29 20:13:35
【问题描述】:

我正在使用 Matplotlib 的函数 hist2d() 并且我想解压缩输出以便进一步使用它。这就是我所做的:我只需使用 numpy 加载一个包含我的数据的 2 列文件并使用以下代码

import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import numpy as np

traj = np.loadtxt('trajectory.txt')
x = traj[:,0]
y = traj[:,1]
M, xe, ye, img = plt.hist2d(x, y, bins = 80, norm = LogNorm())
plt.imshow(M)
plt.show()

我得到的结果如下:

相反,如果我尝试直接绘制 hist2d 结果而不解包:

import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import numpy as np

traj = np.loadtxt('trajectory.txt')
x = traj[:,0]
y = traj[:,1]
plt.hist2d(x, y, bins = 80, norm = LogNorm())
plt.show()

我得到了没有奇怪的蓝色框的整个情节。我做错了什么?

【问题讨论】:

  • plt.imshow(M)M 绘制在与您的二维历史相同的图上。尝试在plt.imshow(M) 之前添加plt.figure() 看看会发生什么
  • 我猜蓝色框中的值可能高于颜色图的限制,因此可能大于 255。尝试将 M 的值标准化为介于 010255 之间的整数
  • @DavidG 谢谢!这解决了问题。

标签: python matplotlib


【解决方案1】:

您可以直接使用plt.hist2d 创建直方图。这将计算直方图并将其绘制到当前轴上。无需再次使用imshow 显示它。

import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import numpy as np; np.random.seed(9)

x = np.random.rayleigh(size=9900)
y = np.random.rayleigh(size=9900)

M, xe, ye, img = plt.hist2d(x, y, bins = 80, norm = LogNorm())

plt.show()

或者,您可以先计算直方图,然后将结果作为图像绘制到当前坐标区。请注意,numpy 生成的直方图是转置的,参见Matplotlib 2D histogram seems transposed,因此需要调用imshow(M.T)。另请注意,为了获得正确的轴标记,您需要将imshowextent 设置为xeye 边数组的极值。

import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
import numpy as np; np.random.seed(9)

x = np.random.rayleigh(size=9900)
y = np.random.rayleigh(size=9900)

M, xe, ye = np.histogram2d(x, y, bins = 80)

extent = [xe[0], xe[-1], ye[0], ye[-1]]
plt.imshow(M.T, extent=extent, norm = LogNorm(), origin="lower")

plt.show()

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多