我有两个数组(长度相等),用于定义x轴和y轴的长度。
例如:
x_array = np.arange(xmin, xmax, xbins)
y_array = np.arange(ymin, ymax, ybins)
有了这个,我可以绘制一个xy网格。在此网格的每个bin(x_ {i} - x_ {i-1},y_ {i} - y_ {i-1})上,我想要一个数量z的出现频率的点图。我已经知道z的出现频率,但它采用以下格式: (数组([9460,3,172,76,79,121,201,0,115,0,0, 0,0,0]数组([9460,3,172,76,79,121,201,0,115,0,0, 0,0,0]))
要将此频率绘制在网格顶部,我需要执行以下操作:
for x in x_array:
for y in y_array:
plot(x,y,data[x][y])
但我只能将数据作为行而非数组读取。我该如何解决这个问题?
答案 0 :(得分:1)
上面的代码段 - (array([455127, 36160,
等 - 这是文件的实际文本内容吗?您可以加载
import ast
with open('test_hist.txt') as inf:
# grab the file contents as string
text = inf.read()
# make it look like Python instead of PHP
text = "[" + text.replace('(', '').replace('array', '').replace(')', '') + "]"
# parse string to data structure
data = ast.literal_eval(text)
编辑:确定,数据已预先装箱;快速查看matplotlib gallery后,我使用close match to your desired output找到了pyplot.hist2d() function。我们可以修改它以使用您的数据:
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from numpy import arange
height, width = len(data), len(data[0])
xs, ys, weights = [], [], []
for yval, row in zip(arange(0., 30., 0.3), data):
for xval, weight in zip(range(0, 10000, 100), row):
xs.append(xval)
ys.append(yval)
weights.append(weight)
plt.hist2d(xs, ys, bins=[width, height], weights=weights, norm=LogNorm())
plt.colorbar()
plt.show()