7

你知道吗,我如何将 3 个数组合并为直方图。我的数组看起来像

Temperature = [4,   3,   1,   4,   6,   7,   8,   3,   1]
Radius      = [0,   2,   3,   4,   0,   1,   2,  10,   7]
Density     = [1,  10,   2,  24,   7,  10,  21, 102, 203]

一维图应该看起来:

Density

     |           X
10^2-|               X
     |       X
10^1-|   
     |   X
10^0-|
     |___|___|___|___|___   Radius
         0  3.3 6.6  10

并且 2D 图应该(定性的)看起来像:

Density

     |           2      | |
10^2-|      11249       | |
     |     233          | | Radius
10^1-|    12            | |
     |   1              | |
10^0-|
     |___|___|___|___|___   Temperature
         0   3   5   8

所以我想用 python/numpy 合并一两个字段,然后绘制它们以分析它们的对应关系。

4

2 回答 2

11

这里它遵循两个函数:hist2d_bubblehist3d_bubble; 可能适合您的目的:

在此处输入图像描述

import numpy as np
import matplotlib.pyplot as pyplot
from mpl_toolkits.mplot3d import Axes3D


def hist2d_bubble(x_data, y_data, bins=10):
    ax = np.histogram2d(x_data, y_data, bins=bins)
    xs = ax[1]
    ys = ax[2]
    points = []
    for (i, j), v in np.ndenumerate(ax[0]):
        points.append((xs[i], ys[j], v))

    points = np.array(points)
    fig = pyplot.figure()
    sub = pyplot.scatter(points[:, 0],points[:, 1],
                         color='black', marker='o', s=128*points[:, 2])
    sub.axes.set_xticks(xs)
    sub.axes.set_yticks(ys)
    pyplot.ion()
    pyplot.grid()
    pyplot.show()
    return points, sub


def hist3d_bubble(x_data, y_data, z_data, bins=10):
    ax1 = np.histogram2d(x_data, y_data, bins=bins)
    ax2 = np.histogram2d(x_data, z_data, bins=bins)
    ax3 = np.histogram2d(z_data, y_data, bins=bins)
    xs, ys, zs = ax1[1], ax1[2], ax3[1]
    smart = np.zeros((bins, bins, bins),dtype=int)
    for (i1, j1), v1 in np.ndenumerate(ax1[0]):
        if v1 == 0:
            continue
        for k2, v2 in enumerate(ax2[0][i1]):
            v3 = ax3[0][k2][j1]
            if v1 == 0 or v2 == 0 or v3 == 0:
                continue
            num = min(v1, v2, v3)
            smart[i1, j1, k2] += num
            v1 -= num
            v2 -= num
            v3 -= num
    points = []
    for (i, j, k), v in np.ndenumerate(smart):
        points.append((xs[i], ys[j], zs[k], v))
    points = np.array(points)
    fig = pyplot.figure()
    sub = fig.add_subplot(111, projection='3d')
    sub.scatter(points[:, 0], points[:, 1], points[:, 2],
                color='black', marker='o', s=128*points[:, 3])
    sub.axes.set_xticks(xs)
    sub.axes.set_yticks(ys)
    sub.axes.set_zticks(zs)
    pyplot.ion()
    pyplot.grid()
    pyplot.show()
    return points, sub

上面的两个图是使用以下方法创建的:

temperature = [4,   3,   1,   4,   6,   7,   8,   3,   1]
radius      = [0,   2,   3,   4,   0,   1,   2,  10,   7]
density     = [1,  10,   2,  24,   7,  10,  21, 102, 203]
import matplotlib
matplotlib.rcParams.update({'font.size':14})

points, sub = hist2d_bubble(radius, density, bins=4)
sub.axes.set_xlabel('radius')
sub.axes.set_ylabel('density')

points, sub = hist3d_bubble(temperature, density, radius, bins=4)
sub.axes.set_xlabel('temperature')
sub.axes.set_ylabel('density')
sub.axes.set_zlabel('radius')

有关的:

如何在 Python 中将一系列浮点值合并到直方图中?

如何使用 python 中内置的 numpy 或 matplotlib 函数正确生成 3d 直方图?

使用 Python 的 2D 直方图

于 2013-05-11T12:18:17.637 回答
1

这是上面 Castro 代码的简单 2D 版本。它只是在每个 x,y 坐标处绘制平均值。这可以使用 imshow 绘制,但 Castro 的方法可以绘制更整洁的散点图。

from matplotlib import pyplot as plt
import numpy as np

# make some x,y points and z data that needs to be averaged and plotted
x = [1,1,1,2,2,2,2,3,4,4,4,4]
y = [1,1,1,2,2,2,2,3,4,4,4,4]
z = [1,1,1,2,2,3,3,4,4,4,5,5]
xbins, ybins = int(max(x)), int(max(y))
rng = [[1, xbins+1], [1, ybins+1]]
bins = [xbins,ybins]

# get the sum of weights and sum of occurrences (their division gives the mean) 
H, xs, ys =np.histogram2d(x, y, weights=z, bins=bins, range=rng) 
count, _, _ =np.histogram2d(x, y, bins=bins, range=rng) 

# get the mean value of each x,y point
count = np.ma.masked_where(count==0,count)
H = np.ma.masked_where(H==0,H)
H/=count

# separate the H matrix into x,y,z arrays (and discard zero values)
points = []
for (i, j),v in np.ndenumerate(H):
    if v: points.append((xs[i], ys[j], v))
points = np.array(points)

# plot the data
fig = plt.figure()
cm = plt.cm.get_cmap('hot')
p = plt.scatter(points[:, 0], points[:, 1], c=points[:, 2], cmap=cm)
plt.colorbar(p).set_label('avg. z value')
plt.grid()
plt.show()

所有重复的 x,y 点现在都减少到一个唯一的集合,并且它们的 z 值已被平均:

重复 x,y 坐标的平均 z 值

于 2013-10-13T19:57:07.227 回答